[jboss-svn-commits] JBL Code SVN: r7836 - in labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples: . sudoku
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Nov 26 10:19:27 EST 2006
Author: mfrandsen
Date: 2006-11-26 10:19:24 -0500 (Sun, 26 Nov 2006)
New Revision: 7836
Added:
labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/
labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/Field.java
labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/FieldGenerator.java
labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/PossibleValue.java
labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/SudokuExample.java
Log:
Sudoku solving with JBoss Rules - sources
Added: labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/Field.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/Field.java 2006-11-26 15:18:41 UTC (rev 7835)
+++ labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/Field.java 2006-11-26 15:19:24 UTC (rev 7836)
@@ -0,0 +1,49 @@
+package org.drools.examples.sudoku;
+/**
+ *
+ * @author <a href="mailto:michael.frandsen at syngenio.de">Michael Frandsen</a>
+ */
+public class Field {
+
+ private String value;
+ private int column;
+ private int row;
+ private int zone;
+ public Field() {
+ super();
+ }
+ public Field(String value, int column, int row, int zone) {
+ super();
+ this.value = value;
+ this.column = column;
+ this.row = row;
+ this.zone = zone;
+ }
+ public int getColumn() {
+ return column;
+ }
+ public void setColumn(int column) {
+ this.column = column;
+ }
+ public int getRow() {
+ return row;
+ }
+ public void setRow(int row) {
+ this.row = row;
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+ public int getZone() {
+ return zone;
+ }
+ public void setZone(int zone) {
+ this.zone = zone;
+ }
+ public String toString(){
+ return "Value=" + value + " Column=" + column + " Row=" + row + " Zone=" + zone;
+ }
+}
Added: labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/FieldGenerator.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/FieldGenerator.java 2006-11-26 15:18:41 UTC (rev 7835)
+++ labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/FieldGenerator.java 2006-11-26 15:19:24 UTC (rev 7836)
@@ -0,0 +1,79 @@
+package org.drools.examples.sudoku;
+/**
+ * @author <a href="mailto:michael.frandsen at syngenio.de">Michael Frandsen</a>
+ */
+public class FieldGenerator {
+
+ private static FieldGenerator fieldGenerator = new FieldGenerator();
+ public static FieldGenerator getInstance(){
+ return fieldGenerator;
+ }
+ public int[][] getField(){
+ return new int[][]{{0, 5, 6, 8, 0, 1, 9, 4, 0},
+ {9, 0, 0, 6, 0, 5, 0, 0, 3},
+ {7, 0, 0, 4, 9, 3, 0, 0, 8},
+ {8, 9, 7, 0, 4, 0, 6, 3, 5},
+ {0, 0, 3, 9, 0, 6, 8, 0, 0},
+ {4, 6, 5, 0, 8, 0, 2, 9, 1},
+ {5, 0, 0, 2, 6, 9, 0, 0, 7},
+ {6, 0, 0, 5, 0, 4, 0, 0, 9},
+ {0, 4, 9, 7, 0, 8, 3, 5, 0}};
+ }
+ public int[][] getFieldMiddle(){
+ return new int[][]{{8, 4, 7, 0, 0, 0, 2, 5, 6},
+ {5, 0, 0, 0, 8, 0, 0, 0, 4},
+ {2, 0, 0, 0, 7, 0, 0, 0, 8},
+ {0, 0, 0, 3, 0, 8, 0, 0, 0},
+ {0, 5, 1, 0, 0, 0, 8, 7, 2},
+ {0, 0, 0, 5, 0, 7, 0, 0, 0},
+ {4, 0, 0, 0, 5, 0, 0, 0, 7},
+ {6, 0, 0, 0, 3, 0, 0, 0, 9},
+ {1, 3, 2, 0, 0, 0, 4, 8, 5}};
+ }
+ public int[][] getFieldHard(){
+ return new int[][]{{0, 0, 0, 0, 5, 1, 0, 8, 0},
+ {0, 8, 0, 0, 4, 0, 0, 0, 5},
+ {0, 0, 3, 0, 0, 0, 2, 0, 0},
+ {0, 0, 0, 0, 6, 0, 0, 0, 9},
+ {6, 7, 0, 4, 0, 9, 0, 1, 3},
+ {8, 0, 0, 0, 3, 0, 0, 0, 0},
+ {0, 0, 2, 0, 0, 0, 4, 0, 0},
+ {5, 0, 0, 0, 9, 0, 0, 2, 0},
+ {0, 9, 0, 7, 1, 0, 0, 0, 0}};
+ }
+
+ public int[][] getFieldHard2(){
+ return new int[][]{{0,0,0,6,0,0,1,0,0},
+ {0,0,0,0,0,5,0,0,6},
+ {5,0,7,0,0,0,2,3,0},
+ {0,8,0,9,0,7,0,0,0},
+ {9,3,0,0,0,0,0,6,7},
+ {0,0,0,4,0,6,0,1,0},
+ {0,7,4,0,0,0,9,0,1},
+ {8,0,0,7,0,0,0,0,0},
+ {0,0,3,0,0,8,0,0,0}};
+ }
+
+ public int[][] getFieldHard3(){
+ return new int[][]{{0,8,0,0,0,6,0,0,5},
+ {2,0,0,0,0,0,4,8,0},
+ {0,0,9,0,0,8,0,1,0},
+ {0,0,0,0,8,0,1,0,2},
+ {0,0,0,3,0,1,0,0,0},
+ {6,0,1,0,9,0,0,0,0},
+ {0,9,0,4,0,0,8,0,0},
+ {0,7,6,0,0,0,0,0,3},
+ {1,0,0,7,0,0,0,5,0}};
+ }
+ public int[][] getFieldHard4(){
+ return new int[][]{{0,0,0,0,0,4,0,9,5},
+ {6,7,0,5,0,0,0,1,0},
+ {0,0,0,6,0,9,0,0,0},
+ {0,2,0,0,0,0,4,0,0},
+ {8,1,0,0,0,0,0,7,2},
+ {0,0,7,0,0,0,0,8,0},
+ {0,0,0,3,0,5,0,0,0},
+ {0,6,0,0,0,1,0,5,8},
+ {7,3,0,9,0,0,0,0,0}};
+ }
+}
Added: labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/PossibleValue.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/PossibleValue.java 2006-11-26 15:18:41 UTC (rev 7835)
+++ labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/PossibleValue.java 2006-11-26 15:19:24 UTC (rev 7836)
@@ -0,0 +1,52 @@
+package org.drools.examples.sudoku;
+/**
+ * @author <a href="mailto:michael.frandsen at syngenio.de">Michael Frandsen</a>
+ */
+public class PossibleValue {
+
+ private String value;
+ private int column;
+ private int row;
+ private int zone;
+ public PossibleValue() {
+ super();
+ }
+ public PossibleValue(String value, int column, int row, int zone) {
+ super();
+ this.value = value;
+ this.column = column;
+ this.row = row;
+ this.zone = zone;
+ }
+ public PossibleValue(String value, Field field) {
+ super();
+ this.value = value;
+ this.column = field.getColumn();
+ this.row = field.getRow();
+ this.zone = field.getZone();
+ }
+ public int getColumn() {
+ return column;
+ }
+ public void setColumn(int column) {
+ this.column = column;
+ }
+ public int getRow() {
+ return row;
+ }
+ public void setRow(int row) {
+ this.row = row;
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+ public int getZone() {
+ return zone;
+ }
+ public void setZone(int zone) {
+ this.zone = zone;
+ }
+}
Added: labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/SudokuExample.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/SudokuExample.java 2006-11-26 15:18:41 UTC (rev 7835)
+++ labs/jbossrules/trunk/drools-examples/src/main/java/org/drools/examples/sudoku/SudokuExample.java 2006-11-26 15:19:24 UTC (rev 7836)
@@ -0,0 +1,151 @@
+package org.drools.examples.sudoku;
+
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.rule.Package;
+
+
+/**
+ * This example shows, how a Sudoku puzzle can be solved using JBoss Rules
+ *
+ * @author <a href="mailto:michael.frandsen at syngenio.de">Michael Frandsen</a>
+ */
+public class SudokuExample {
+
+ public static void testWithInput(int[][] field){
+ try {
+ Collection fields = new ArrayList();
+ //create Fields for every element of the matrix
+ //Print Sudoku, which is to solve
+ for(int i = 0; i < field.length; i++){
+ String row = "{";
+ for(int j = 0; j < field[i].length; j++){
+ row += field[i][j] + ",";
+ fields.add(new Field(""+field[i][j], j+1, i+1, getZone(i,j)));
+ }
+ row+= "}";
+ System.out.println(row);
+ }
+ //load up the rulebase
+ RuleBase ruleBase = readRule();
+ WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+ //go !
+ Iterator iter = fields.iterator();
+
+ Collection handles = new ArrayList();
+ while(iter.hasNext()){
+ handles.add(workingMemory.assertObject( iter.next() ));
+ }
+ workingMemory.fireAllRules();
+
+ System.out.println("Size: " + workingMemory.getObjects().size());
+
+ //Get Result
+ iter = workingMemory.getObjects().iterator();
+ //Copy the values of the fields into the matrix
+ while(iter.hasNext()) {
+ Object next = iter.next();
+ if(next instanceof Field){
+ field[((Field)next).getRow()-1][((Field)next).getColumn()-1] = Integer.parseInt(((Field)next).getValue());
+ }
+ }
+
+ //Pr
+ for(int i = 0; i < field.length; i++){
+ String row = "{";
+ for(int j = 0; j < field[i].length; j++){
+ row += field[i][j] + ",";
+ fields.add(new Field(""+field[i][j], j+1, i+1, getZone(i,j)));
+ }
+ row+= "}";
+ System.out.println(row);
+ }
+
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ public static final void main(String[] args) {
+// testWithInput(FieldGenerator.getInstance().getField());
+// testWithInput(FieldGenerator.getInstance().getFieldMiddle());
+// testWithInput(FieldGenerator.getInstance().getFieldHard());
+// testWithInput(FieldGenerator.getInstance().getFieldHard2());
+// testWithInput(FieldGenerator.getInstance().getFieldHard3());
+ testWithInput(FieldGenerator.getInstance().getFieldHard4());
+ }
+
+ private static int getZone(int row, int column) {
+ if(column < 3 && row < 3){
+ return 1;
+ }
+ else if( column < 6 && row < 3 ){
+ return 2;
+ }
+ else if( column < 9 && row < 3){
+ return 3;
+ }
+ else if( column < 3 && row < 6){
+ return 4;
+ }
+ else if( column < 6 && row < 6){
+ return 5;
+ }
+ else if( column < 9 && row < 6){
+ return 6;
+ }
+ else if( column < 3){
+ return 7;
+ }
+ else if( column < 6){
+ return 8;
+ }
+ else if(column < 9){
+ return 9;
+ }
+ return 0;
+ }
+
+ /**
+ * Please note that this is the "low level" rule assembly API.
+ */
+ private static RuleBase readRule() throws Exception {
+ //read in the source
+ Reader source = new InputStreamReader( SudokuExample.class.getResourceAsStream( "sudoku.drl" ) );
+
+ //optionally read in the DSL (if you are using it).
+ //Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );
+
+ //Use package builder to build up a rule package.
+ //An alternative lower level class called "DrlParser" can also be used...
+
+ PackageBuilder builder = new PackageBuilder();
+
+ //this wil parse and compile in one step
+ //NOTE: There are 2 methods here, the one argument one is for normal DRL.
+ builder.addPackageFromDrl( source );
+
+ //Use the following instead of above if you are using a DSL:
+ //builder.addPackageFromDrl( source, dsl );
+
+ //get the compiled package (which is serializable)
+ Package pkg = builder.getPackage();
+
+ //add the package to a rulebase (deploy the rule package).
+ RuleBaseConfiguration conf = new RuleBaseConfiguration();
+ conf.setRemoveIdentities( true );
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase(RuleBase.RETEOO, conf);
+ ruleBase.addPackage( pkg );
+ return ruleBase;
+ }
+
+}
More information about the jboss-svn-commits
mailing list