[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