读书人

Drools4:对Sudoku示范的分析

发布时间: 2012-11-20 09:55:43 作者: rapoo

Drools4:对Sudoku示例的分析

      1. #?首先将所有数字为0的格子删除,并对这个格子插入从1-9的所有可能情况 ??
      2. rule?"Rule?1:?If?a?field?has?the?value?0,?it?is?empty:?remove?it?and?insert?the?PossibleValues"??
      3. ????salience?100??
      4. ????when ??
      5. ????????$field?:?Field(?value?==?0,?$row?:?row,?$column?:?column,?$zone?:?zone?) ??
      6. ????then ??
      7. ????????insert(?new?PossibleValue("1",?$field?)?); ??
      8. ????????insert(?new?PossibleValue("2",?$field?)?); ??
      9. ????????insert(?new?PossibleValue("3",?$field?)?); ??
      10. ????????insert(?new?PossibleValue("4",?$field?)?); ??
      11. ????????insert(?new?PossibleValue("5",?$field?)?); ??
      12. ????????insert(?new?PossibleValue("6",?$field?)?); ??
      13. ????????insert(?new?PossibleValue("7",?$field?)?); ??
      14. ????????insert(?new?PossibleValue("8",?$field?)?); ??
      15. ????????insert(?new?PossibleValue("9",?$field?)?); ??
      16. ????????//?插入完毕后删除Field,因为该Field中的数据不是我们所需要的, ??
      17. ????????//?我们需要的只是它的位置信息,而这些是不变的,已经在PossibleValue初始化时保留。 ??
      18. ????????retract(?$field?); ??
      19. ???????? ??
      20. ????????#System.out.println("Rule?1?fired."); ??
      21. end?? ??
      22. ??
      23. #?这个规则是当某一个格子上的PossibleValue只剩下一个时,那么这个PossibleValue的值就是要寻找的值 ??
      24. rule?"Rule?2:?If?there?is?one?PossibleValue?left?at?a?certain?position,?it?should?be?the?Fields?value"??
      25. ????salience?5??
      26. ????when ??
      27. ????????$pv?:?PossibleValue?(?$row?:?row,?$zone?:?zone,?$column?:?column,?$value?:?value?) ??
      28. ????????not?(?PossibleValue?(?row?==?$row,?zone?==?$zone,?column?==?$column,?value?!=?$value?)?) ??
      29. ????then ??
      30. ????????insert(?new?Field(?$value,?$column,?$row,?$zone?)?); ??
      31. ????????System.out.println?(?"Field?be?found?in?row="+$row+";col="+$column+"value="+$value?); ??
      32. ????????retract(?$pv?); ??
      33. ???????? ??
      34. ????????#System.out.println("Rule?2?fired."); ??
      35. end?? ??
      36. ??
      37. #?获得行中已确定的数字,将该行上空格子中的相同备选数字删除 ??
      38. rule?"Rule?3:?If?there?is?a?field?with?a?value?in?a?row,?remove?all?PossibleValues?with?this?value?in?this?row"??
      39. ????salience?15??
      40. ????when???????? ??
      41. ????????$field2?:?Field(?$row?:?row,?$value?:?value?!=?0?) ??
      42. ????????$possible?:?PossibleValue(?row?==?$row,?value?==?$value?) ??
      43. ????then ??
      44. ????????retract(?$possible?); ??
      45. ????????#System.out.println("Rule?3?fired."); ??
      46. end ??
      47. ??
      48. #?获得列中已确定的数字,将该列上空格子中的相同备选数字删除 ??
      49. rule?"Rule?4:?If?there?is?a?field?with?a?value?in?a?column,?remove?all?PossibleValues?with?this?value?in?this?column"??
      50. ????salience?15??
      51. ????when???????? ??
      52. ????????$field1?:?Field(?$column?:?column,?$value?:?value?!=?0?) ??
      53. ????????$possible?:?PossibleValue(?column?==?$column,?value?==?$value?) ??
      54. ????then ??
      55. ????????retract(?$possible?); ??
      56. ????????#System.out.println("Rule?4?fired."); ??
      57. end ??
      58. ??
      59. #?获得区域中已确定的数字,将该区域上空格子中的相同备选数字删除 ??
      60. rule?"Rule?5:?If?there?is?a?field?with?a?value?in?a?zone,?remove?all?PossibleValues?with?this?value?in?this?zone"??
      61. ????salience?15??
      62. ????when???????? ??
      63. ????????$field1?:?Field(?$zone?:?zone,?$value?:?value?!=?0?) ??
      64. ????????$possible?:?PossibleValue(?zone?==?$zone,?value?==?$value?) ??
      65. ????then ??
      66. ????????retract(?$possible?); ??
      67. ????????#System.out.println("Rule?5?fired."); ??
      68. end ??
      69. ??
      70. #?一旦产生新的格子数字,则删除在这个格子上的所有可选值 ??
      71. #?Rule?2,3,4,5?不会引起该规则的调用,因为这几个规则是将其它可选值删除后剩余的值设为格子数字。 ??
      72. #?该规则是由Rule?7,8,9激发的 ??
      73. rule?"Rule?6:?For?fields?with?a?value?remove?all?PossibleValues"??
      74. ????salience?250??
      75. ????when ??
      76. ????????Field(?value?!=?0,?$col?:?column,?$row?:?row,?$zone?:?zone?) ??
      77. ????????$pv?:?PossibleValue(?column?==?$col,?row?==?$row,?zone?==?$zone?) ??
      78. ????then ??
      79. ????????retract(?$pv?); ??
      80. ????????#System.out.println("Rule?6?fired."); ??
      81. end ??
      82. ??
      83. #?如果在一个小区域内,某一个空格子上的可选值在这个区域里是唯一的 ??
      84. #?并且不会违反行列区域数字冲突的原则,那么该可选值就是格子真正的数字 ??
      85. rule?"Rule?7:?If?there?is?only?one?PossibleValue?left?in?a?zone,?it?must?have?the?value?of?the?field"??
      86. ????salience?4??
      87. ????when???????? ??
      88. ????????$pv?:?PossibleValue(?$zone?:?zone,?$value?:?value,?$col?:?column,?$row?:?row) ??
      89. ????????not?(PossibleValue(?zone?==?$zone,?value?==?$value?)) ??
      90. ????????not?(Field(?value?==?$value,?zone?==?$zone)?) ??
      91. ????????not?(Field(?value?==?$value,?row?==?$row)?) ??
      92. ????????not?(Field(?value?==?$value,?column?==?$col)?) ??
      93. ????then ??
      94. ????????insert(?new?Field(?$value,?$col,?$row,?$zone?)?); ??
      95. ????????retract(?$pv?); ??
      96. ????????#System.out.println("Rule?7?fired."); ??
      97. end ??
      98. ??
      99. #?如果在一列上,某一个空格子上的可选值在这个列上是唯一的 ??
      100. #?并且不会违反行列区域数字冲突的原则,那么该可选值就是格子真正的数字 ??
      101. rule?"Rule?8:?If?there?is?only?one?PossibleValue?left?in?a?column,?it?must?have?the?value?of?the?field"??
      102. ????salience?4??
      103. ????when???????? ??
      104. ????????$pv1?:?PossibleValue(?$zone?:?zone,?$value?:?value,?$col?:?column,?$row?:?row) ??
      105. ????????not?(PossibleValue(?column?==?$col,?value?==?$value?)) ??
      106. ????????not?(Field(?value?==?$value,?zone?==?$zone)?) ??
      107. ????????not?(Field(?value?==?$value,?row?==?$row)?) ??
      108. ????????not?(Field(?value?==?$value,?column?==?$col)?) ??
      109. ????then ??
      110. ????????insert(?new?Field(?$value,?$col,?$row,?$zone?)?); ??
      111. ????????retract(?$pv1?); ??
      112. ????????#System.out.println("Rule?8?fired."); ??
      113. end ??
      114. ??
      115. #?如果在一行上,某一个空格子上的可选值在这个行上是唯一的 ??
      116. #?并且不会违反行列区域数字冲突的原则,那么该可选值就是格子真正的数字 ??
      117. rule?"Rule?9:?If?there?is?only?one?PossibleValue?left?in?a?row,?it?must?have?the?value?of?the?field"??
      118. ????salience?4??
      119. ????when???????? ??
      120. ????????$pv?:?PossibleValue(?$zone?:?zone,?$value?:?value,?$col?:?column,?$row?:?row) ??
      121. ????????not?(PossibleValue(?row?==?$row,?value?==?$value?)) ??
      122. ????????not?(Field(?value?==?$value,?zone?==?$zone)?) ??
      123. ????????not?(Field(?value?==?$value,?row?==?$row)?) ??
      124. ????????not?(Field(?value?==?$value,?column?==?$col)?) ??
      125. ????then ??
      126. ????????insert(?new?Field(?$value,?$col,?$row,?$zone?)?); ??
      127. ????????retract(?$pv?); ??
      128. ????????#System.out.println("Rule?9?fired."); ??
      129. end ??
      130. ??
      131. #?如果在一个区域中的两个空格子只剩两个可选值,则删除该区域中与这两个可选值相同的其它可选值 ??
      132. rule?"Rule?10:?If?there?are?two?fields?with?only?two?possible?values,?remove?the?PossibleValues?for?the?same?Value?in?the?rest?of?the?zone"??
      133. ????salience?1??
      134. ????when ??
      135. ????????#?找到一个可选值A ??
      136. ????????PossibleValue(?$zone?:?zone,?$val1?:?value,?$row1?:?row,?$col1?:?column?) ??
      137. ????????#?要求在相同区域中,不同列上具有与A数字相同的可选值C ??
      138. ????????PossibleValue(?zone?==?$zone,?value?==?$val1,?$row2?:?row,?$col2?:?column?!=?$col1) ??
      139. ????????#?要求与A在同一个格子里有其它可选值B ??
      140. ????????PossibleValue(?zone?==?$zone,?row?==?$row1,?column?==?$col1,?$val2?:?value?) ??
      141. ????????#?要求在C的格子里有与B的数字相同的可选值 ??
      142. ????????PossibleValue(?zone?==?$zone,?row?==?$row2,?column?==?$col2,?value?==?$val2?) ??
      143. ????????#?要求在A格子中不存在除A与B的数字以外的可选值,也就是说A格子中的可选值不超过两个 ??
      144. ????????not?(?PossibleValue(?zone?==?$zone,?row?==?$row1,?column?==?$col1,?value?!=?$val1,?value?!=?$val2?)?) ??
      145. ????????#?要求在C格子中不存在除A与B的数字以外的可选值,也就是说C格子中的可选值不超过两个 ??
      146. ????????#?这两个not条件组合起来要表达的就是区域中有A,C两个格子中的可选值一样,并且只有两个 ??
      147. ????????not?(?PossibleValue(?zone?==?$zone,?row?==?$row2,?column?==?$col2,?value?!=?$val1,?value?!=?$val2?)?) ??
      148. ????????#?获得区域中与A数字相同的其它可选值 ??
      149. ????????$pv?:?PossibleValue(?zone?==?$zone,?value?==?$val1) ??
      150. ????then ??
      151. ????????retract(?$pv?); ??
      152. ????????#System.out.println("Rule?10?fired."); ??
      153. end ??
      154. ??
      155. #?如果在一个区域中的两个空格子只剩两个可选值,则删除该区域中与这两个可选值相同的其它可选值 ??
      156. #?本规则与上一规则基本一样区别是寻找C格子时使用不同行而不是不同列 ??
      157. rule?"Rule?11:?If?there?are?two?fields?with?only?two?possible?values,?remove?the?PossibleValues?for?the?same?Value?in?the?rest?of?the?zone"??
      158. ????salience?1??
      159. ????when ??
      160. ????????PossibleValue(?$zone?:?zone,?$val1?:?value,?$row1?:?row,?$col1?:?column?) ??
      161. ????????#?本行与规则10不同 ??
      162. ????????PossibleValue(?zone?==?$zone,?value?==?$val1,?$row2?:?row?!=?$row1,?$col2?:?column) ??
      163. ????????PossibleValue(?zone?==?$zone,?row?==?$row1,?column?==?$col1,?$val2?:?value?) ??
      164. ????????PossibleValue(?zone?==?$zone,?row?==?$row2,?column?==?$col2,?value?==?$val2?) ??
      165. ????????not?(?PossibleValue(?zone?==?$zone,?row?==?$row1,?column?==?$col1,?value?!=?$val1,?value?!=?$val2?)?) ??
      166. ????????not?(?PossibleValue(?zone?==?$zone,?row?==?$row2,?column?==?$col2,?value?!=?$val1,?value?!=?$val2?)?) ??
      167. ????????$pv?:?PossibleValue(?zone?==?$zone,?value?==?$val1) ??
      168. ????then ??
      169. ????????retract(?$pv?); ??
      170. ????????#System.out.println("Rule?11?fired."); ??
      171. end? ??
      1 楼 江南白衣 2007-08-06 给分,兄弟为drools4推广出力良多。 2 楼 linyajun 2007-08-08 给分,支持drools4 3 楼 宋存义 2007-08-23 太感谢了 ,正在学习中,
      太多的不明白啊,想请教一下,
      query是怎么用啊
      要做一个从数据库中通过id能显示内容和其他的例子怎么做啊
      我现在学的都晕了,谢谢各位知道的回答一下 4 楼 wl1985 2007-08-23 像是游戏开发中使用的中间件,仔细研究一下,代码注释很规范,值得借鉴 5 楼 chinapr 2007-08-27 看了楼主的很多帖子都还不错 6 楼 tvjody 2007-09-18 的确是很不错
      楼主写写你的Drools的应用心得以及成功案例
      7 楼 czhcc 2007-10-09 学习中。不过想问一下,为什么 salience值为250的规则不被首先执行? 8 楼 hrfdotnet 2008-06-20 哥们,能把这个示例完整的源码发一份给我吗,先谢谢了!hrfsun@yahoo.com.cn

读书人网 >软件架构设计

热点推荐