Drools4:对Sudoku示范的分析
Drools4:对Sudoku示例的分析#?首先将所有数字为0的格子删除,并对这个格子插入从1-9的所有可能情况 ??rule?
Drools4:对Sudoku示例的分析
- #?首先将所有数字为0的格子删除,并对这个格子插入从1-9的所有可能情况 ??
- rule?"Rule?1:?If?a?field?has?the?value?0,?it?is?empty:?remove?it?and?insert?the?PossibleValues"??
- ????salience?100??
- ????when ??
- ????????$field?:?Field(?value?==?0,?$row?:?row,?$column?:?column,?$zone?:?zone?) ??
- ????then ??
- ????????insert(?new?PossibleValue("1",?$field?)?); ??
- ????????insert(?new?PossibleValue("2",?$field?)?); ??
- ????????insert(?new?PossibleValue("3",?$field?)?); ??
- ????????insert(?new?PossibleValue("4",?$field?)?); ??
- ????????insert(?new?PossibleValue("5",?$field?)?); ??
- ????????insert(?new?PossibleValue("6",?$field?)?); ??
- ????????insert(?new?PossibleValue("7",?$field?)?); ??
- ????????insert(?new?PossibleValue("8",?$field?)?); ??
- ????????insert(?new?PossibleValue("9",?$field?)?); ??
- ????????//?插入完毕后删除Field,因为该Field中的数据不是我们所需要的, ??
- ????????//?我们需要的只是它的位置信息,而这些是不变的,已经在PossibleValue初始化时保留。 ??
- ????????retract(?$field?); ??
- ???????? ??
- ????????#System.out.println("Rule?1?fired."); ??
- end?? ??
- ??
- #?这个规则是当某一个格子上的PossibleValue只剩下一个时,那么这个PossibleValue的值就是要寻找的值 ??
- rule?"Rule?2:?If?there?is?one?PossibleValue?left?at?a?certain?position,?it?should?be?the?Fields?value"??
- ????salience?5??
- ????when ??
- ????????$pv?:?PossibleValue?(?$row?:?row,?$zone?:?zone,?$column?:?column,?$value?:?value?) ??
- ????????not?(?PossibleValue?(?row?==?$row,?zone?==?$zone,?column?==?$column,?value?!=?$value?)?) ??
- ????then ??
- ????????insert(?new?Field(?$value,?$column,?$row,?$zone?)?); ??
- ????????System.out.println?(?"Field?be?found?in?row="+$row+";col="+$column+"value="+$value?); ??
- ????????retract(?$pv?); ??
- ???????? ??
- ????????#System.out.println("Rule?2?fired."); ??
- end?? ??
- ??
- #?获得行中已确定的数字,将该行上空格子中的相同备选数字删除 ??
- rule?"Rule?3:?If?there?is?a?field?with?a?value?in?a?row,?remove?all?PossibleValues?with?this?value?in?this?row"??
- ????salience?15??
- ????when???????? ??
- ????????$field2?:?Field(?$row?:?row,?$value?:?value?!=?0?) ??
- ????????$possible?:?PossibleValue(?row?==?$row,?value?==?$value?) ??
- ????then ??
- ????????retract(?$possible?); ??
- ????????#System.out.println("Rule?3?fired."); ??
- end ??
- ??
- #?获得列中已确定的数字,将该列上空格子中的相同备选数字删除 ??
- rule?"Rule?4:?If?there?is?a?field?with?a?value?in?a?column,?remove?all?PossibleValues?with?this?value?in?this?column"??
- ????salience?15??
- ????when???????? ??
- ????????$field1?:?Field(?$column?:?column,?$value?:?value?!=?0?) ??
- ????????$possible?:?PossibleValue(?column?==?$column,?value?==?$value?) ??
- ????then ??
- ????????retract(?$possible?); ??
- ????????#System.out.println("Rule?4?fired."); ??
- end ??
- ??
- #?获得区域中已确定的数字,将该区域上空格子中的相同备选数字删除 ??
- rule?"Rule?5:?If?there?is?a?field?with?a?value?in?a?zone,?remove?all?PossibleValues?with?this?value?in?this?zone"??
- ????salience?15??
- ????when???????? ??
- ????????$field1?:?Field(?$zone?:?zone,?$value?:?value?!=?0?) ??
- ????????$possible?:?PossibleValue(?zone?==?$zone,?value?==?$value?) ??
- ????then ??
- ????????retract(?$possible?); ??
- ????????#System.out.println("Rule?5?fired."); ??
- end ??
- ??
- #?一旦产生新的格子数字,则删除在这个格子上的所有可选值 ??
- #?Rule?2,3,4,5?不会引起该规则的调用,因为这几个规则是将其它可选值删除后剩余的值设为格子数字。 ??
- #?该规则是由Rule?7,8,9激发的 ??
- rule?"Rule?6:?For?fields?with?a?value?remove?all?PossibleValues"??
- ????salience?250??
- ????when ??
- ????????Field(?value?!=?0,?$col?:?column,?$row?:?row,?$zone?:?zone?) ??
- ????????$pv?:?PossibleValue(?column?==?$col,?row?==?$row,?zone?==?$zone?) ??
- ????then ??
- ????????retract(?$pv?); ??
- ????????#System.out.println("Rule?6?fired."); ??
- end ??
- ??
- #?如果在一个小区域内,某一个空格子上的可选值在这个区域里是唯一的 ??
- #?并且不会违反行列区域数字冲突的原则,那么该可选值就是格子真正的数字 ??
- rule?"Rule?7:?If?there?is?only?one?PossibleValue?left?in?a?zone,?it?must?have?the?value?of?the?field"??
- ????salience?4??
- ????when???????? ??
- ????????$pv?:?PossibleValue(?$zone?:?zone,?$value?:?value,?$col?:?column,?$row?:?row) ??
- ????????not?(PossibleValue(?zone?==?$zone,?value?==?$value?)) ??
- ????????not?(Field(?value?==?$value,?zone?==?$zone)?) ??
- ????????not?(Field(?value?==?$value,?row?==?$row)?) ??
- ????????not?(Field(?value?==?$value,?column?==?$col)?) ??
- ????then ??
- ????????insert(?new?Field(?$value,?$col,?$row,?$zone?)?); ??
- ????????retract(?$pv?); ??
- ????????#System.out.println("Rule?7?fired."); ??
- end ??
- ??
- #?如果在一列上,某一个空格子上的可选值在这个列上是唯一的 ??
- #?并且不会违反行列区域数字冲突的原则,那么该可选值就是格子真正的数字 ??
- rule?"Rule?8:?If?there?is?only?one?PossibleValue?left?in?a?column,?it?must?have?the?value?of?the?field"??
- ????salience?4??
- ????when???????? ??
- ????????$pv1?:?PossibleValue(?$zone?:?zone,?$value?:?value,?$col?:?column,?$row?:?row) ??
- ????????not?(PossibleValue(?column?==?$col,?value?==?$value?)) ??
- ????????not?(Field(?value?==?$value,?zone?==?$zone)?) ??
- ????????not?(Field(?value?==?$value,?row?==?$row)?) ??
- ????????not?(Field(?value?==?$value,?column?==?$col)?) ??
- ????then ??
- ????????insert(?new?Field(?$value,?$col,?$row,?$zone?)?); ??
- ????????retract(?$pv1?); ??
- ????????#System.out.println("Rule?8?fired."); ??
- end ??
- ??
- #?如果在一行上,某一个空格子上的可选值在这个行上是唯一的 ??
- #?并且不会违反行列区域数字冲突的原则,那么该可选值就是格子真正的数字 ??
- rule?"Rule?9:?If?there?is?only?one?PossibleValue?left?in?a?row,?it?must?have?the?value?of?the?field"??
- ????salience?4??
- ????when???????? ??
- ????????$pv?:?PossibleValue(?$zone?:?zone,?$value?:?value,?$col?:?column,?$row?:?row) ??
- ????????not?(PossibleValue(?row?==?$row,?value?==?$value?)) ??
- ????????not?(Field(?value?==?$value,?zone?==?$zone)?) ??
- ????????not?(Field(?value?==?$value,?row?==?$row)?) ??
- ????????not?(Field(?value?==?$value,?column?==?$col)?) ??
- ????then ??
- ????????insert(?new?Field(?$value,?$col,?$row,?$zone?)?); ??
- ????????retract(?$pv?); ??
- ????????#System.out.println("Rule?9?fired."); ??
- end ??
- ??
- #?如果在一个区域中的两个空格子只剩两个可选值,则删除该区域中与这两个可选值相同的其它可选值 ??
- 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"??
- ????salience?1??
- ????when ??
- ????????#?找到一个可选值A ??
- ????????PossibleValue(?$zone?:?zone,?$val1?:?value,?$row1?:?row,?$col1?:?column?) ??
- ????????#?要求在相同区域中,不同列上具有与A数字相同的可选值C ??
- ????????PossibleValue(?zone?==?$zone,?value?==?$val1,?$row2?:?row,?$col2?:?column?!=?$col1) ??
- ????????#?要求与A在同一个格子里有其它可选值B ??
- ????????PossibleValue(?zone?==?$zone,?row?==?$row1,?column?==?$col1,?$val2?:?value?) ??
- ????????#?要求在C的格子里有与B的数字相同的可选值 ??
- ????????PossibleValue(?zone?==?$zone,?row?==?$row2,?column?==?$col2,?value?==?$val2?) ??
- ????????#?要求在A格子中不存在除A与B的数字以外的可选值,也就是说A格子中的可选值不超过两个 ??
- ????????not?(?PossibleValue(?zone?==?$zone,?row?==?$row1,?column?==?$col1,?value?!=?$val1,?value?!=?$val2?)?) ??
- ????????#?要求在C格子中不存在除A与B的数字以外的可选值,也就是说C格子中的可选值不超过两个 ??
- ????????#?这两个not条件组合起来要表达的就是区域中有A,C两个格子中的可选值一样,并且只有两个 ??
- ????????not?(?PossibleValue(?zone?==?$zone,?row?==?$row2,?column?==?$col2,?value?!=?$val1,?value?!=?$val2?)?) ??
- ????????#?获得区域中与A数字相同的其它可选值 ??
- ????????$pv?:?PossibleValue(?zone?==?$zone,?value?==?$val1) ??
- ????then ??
- ????????retract(?$pv?); ??
- ????????#System.out.println("Rule?10?fired."); ??
- end ??
- ??
- #?如果在一个区域中的两个空格子只剩两个可选值,则删除该区域中与这两个可选值相同的其它可选值 ??
- #?本规则与上一规则基本一样区别是寻找C格子时使用不同行而不是不同列 ??
- 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"??
- ????salience?1??
- ????when ??
- ????????PossibleValue(?$zone?:?zone,?$val1?:?value,?$row1?:?row,?$col1?:?column?) ??
- ????????#?本行与规则10不同 ??
- ????????PossibleValue(?zone?==?$zone,?value?==?$val1,?$row2?:?row?!=?$row1,?$col2?:?column) ??
- ????????PossibleValue(?zone?==?$zone,?row?==?$row1,?column?==?$col1,?$val2?:?value?) ??
- ????????PossibleValue(?zone?==?$zone,?row?==?$row2,?column?==?$col2,?value?==?$val2?) ??
- ????????not?(?PossibleValue(?zone?==?$zone,?row?==?$row1,?column?==?$col1,?value?!=?$val1,?value?!=?$val2?)?) ??
- ????????not?(?PossibleValue(?zone?==?$zone,?row?==?$row2,?column?==?$col2,?value?!=?$val1,?value?!=?$val2?)?) ??
- ????????$pv?:?PossibleValue(?zone?==?$zone,?value?==?$val1) ??
- ????then ??
- ????????retract(?$pv?); ??
- ????????#System.out.println("Rule?11?fired."); ??
- 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