From 2311fc3df11c6086e644afc3c33499b58aa79adc Mon Sep 17 00:00:00 2001
From: Mata Seb <sebastia.mata@etu.hesge.ch>
Date: Sat, 10 Nov 2018 17:13:28 +0100
Subject: [PATCH] Commit rendu Algorithmie series 1 et 2 + rapport

---
 Algo/.DS_Store           | Bin 6148 -> 6148 bytes
 Algo/Serie1/.DS_Store    | Bin 6148 -> 6148 bytes
 Algo/Serie1/Puzzle.java  |   4 +-
 Algo/Serie1/main.java    |  20 ++----
 Algo/Serie2/.DS_Store    | Bin 6148 -> 6148 bytes
 Algo/Serie2/Counter.java |  17 +++++
 Algo/Serie2/Main.class   | Bin 2390 -> 0 bytes
 Algo/Serie2/Sudoku.class | Bin 4413 -> 0 bytes
 Algo/Serie2/Sudoku.java  | 137 ++++++++++++++++++++++++---------------
 Algo/Serie2/main.java    |  17 +++--
 Algo/rapport.docx        | Bin 20374 -> 21970 bytes
 11 files changed, 119 insertions(+), 76 deletions(-)
 create mode 100644 Algo/Serie2/Counter.java
 delete mode 100644 Algo/Serie2/Main.class
 delete mode 100644 Algo/Serie2/Sudoku.class

diff --git a/Algo/.DS_Store b/Algo/.DS_Store
index 408f5f8f500df78a07c64f36a57b28ec7327f156..a955722a6808fc2b6ca148a91048dd649c5d034c 100644
GIT binary patch
delta 209
zcmZoMXfc@JFUrrrz`)4BAi%(o&rrlr!l1{H!jQjNkYhQsAxMgcp@<=op@5+PS(+i4
zp~5pKKRGEUKZyaXm%*BWfk9)k0gJ?B85VQK<C7WL8q~$As|_u66fBHubrh=2&CGNZ
x%#18*YdJZ@RSj)D6LKr7s%vWNrceIMBF{KuvMlRka`bIJ#m33FnVsV=KLFU@H3k3x

delta 164
zcmZoMXfc@JFUrTjz`)4BAi%(o%3$c3lb@WFlb^I%kYhPBBj02f7I(&zlY3YiG$pF5
zO$^L*6pV~5YjqT=&CLyT6ikfGYHK+;#8nM#Jri;(tEy{i>t;^A$0pA>YjQB_WAb!v
R{>R42II+QGGdss$egIXyFk1is

diff --git a/Algo/Serie1/.DS_Store b/Algo/Serie1/.DS_Store
index 03e249df7848bab8655577c2a5977c362d775cf2..fee490bd384c59351bfe3d4534d22e0a7762d6df 100644
GIT binary patch
delta 184
zcmZoMXfc=|#>B`mu~2NHo}wrV0|Nsi1A_nqgC0XNLk>eCLoq|~WJbp2rXU$E2499m
zhD?S$WLeLg{N$vZ{3HgjHinf93=A6o!GM8bVvmXzqd2k%0|NsOLjXf5Llr|6Lk>eK
zvPlzf$WJ_|#`t;T3uCs;>>T_YOpF|x85zGbPv#df<X~iAU}#`qVA$*-vWFP}jPNbr

delta 96
zcmZoMXfc=|#>CJ*u~2NHo}wrd0|Nsi1A_nqgC0W`Ln1>NL!xKS#6tDS1|lqzof#FG
z7*<Z6$7nivE~CKaXN-z$lRq%N-^|Xz&%wmdzWE{Jcjn3bB8H3%lWlmUH^+#qU<Lqj
CFd1C{

diff --git a/Algo/Serie1/Puzzle.java b/Algo/Serie1/Puzzle.java
index 5989d3f..7760057 100644
--- a/Algo/Serie1/Puzzle.java
+++ b/Algo/Serie1/Puzzle.java
@@ -217,6 +217,4 @@ public class Puzzle {
         }
         return this;
     }
-}       
-
-
+}
\ No newline at end of file
diff --git a/Algo/Serie1/main.java b/Algo/Serie1/main.java
index 47b66f9..983c9e9 100644
--- a/Algo/Serie1/main.java
+++ b/Algo/Serie1/main.java
@@ -221,28 +221,20 @@ public class Main {
             showPath(heuristicSearchByPlacement(proftest, finalState));
             showPath(heuristicSearchByDistance(proftest, finalState));
             showPath(improvedBlindSearch(proftest, finalState));
-
         }else{
             Puzzle toTest = new Puzzle(finalState, null);
             for(int i = 0; i<moves; i++){
-                double rnd = Math.random();
-                if(rnd < 0.25)
-                    toTest = toTest.moveUp();
-                else if(rnd < 0.5)
-                    toTest = toTest.moveRight();
-                else if(rnd < 0.75)
-                    toTest = toTest.moveDown();
-                else
-                    toTest = toTest.moveLeft();
-            }
-            System.out.println("Test for "+ moves +" moves");
-                if(moves<13)
+                toTest.moveInNewPositions();
+                    toTest = toTest.getNexts().get(0);
+                System.out.println("Test for "+ (i+1) +" moves");
+                if(i<13)
                     blindSearch(toTest.getState(), finalState);
-                if(moves<20)
+                if(i<20)
                     improvedBlindSearch(toTest.getState(), finalState);
                 heuristicSearchByDistance(toTest.getState(), finalState);
                 heuristicSearchByPlacement(toTest.getState(), finalState);
                 System.out.println();
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/Algo/Serie2/.DS_Store b/Algo/Serie2/.DS_Store
index c28d982446d53523d5bac83e5c8302f5f72c7720..c2487b74ed11c662cfc928962570450f55750ece 100644
GIT binary patch
delta 143
zcmZoMXfc@JFUrZlz`)4BAi%&-!jQ^P#GuEJ%#gGBBlB`bVUQFrgEK=uLn%WZM0)Zc
zCMh?@Rt5%!8UMk60R(tZ6*1^BWHBT%lrbcF=Hw?Q<>V(ZfGuEHiL7rk4^uni=J(7@
LESuRm{_+C=vM(nO

delta 141
zcmZoMXfc@JFUrBdz`)4BAi%(o!4S+)%8<g4&yc;Dk!3j}Bgf`Crgp|~IfOVvDT5J%
z9zzL31w#pg9z!uh5`!*-5kne-C4&KjDT6VC5rYMTE`upU2}3f234<?#r)N%na#Buy
e5(C%@#?K543>yEzV6z~H7|X;4_RZ`ZfB6BEWgpf6

diff --git a/Algo/Serie2/Counter.java b/Algo/Serie2/Counter.java
new file mode 100644
index 0000000..7f6be50
--- /dev/null
+++ b/Algo/Serie2/Counter.java
@@ -0,0 +1,17 @@
+
+public class Counter {
+    int count;
+    
+    public Counter(){
+        this.count = 0;
+    }
+
+    public int getCount(){ return this.count; }
+
+    public void increment(){ this.count += 1; }
+
+    public void decrement(){ this.count -=1; }
+
+    public void reset(){ this.count = 0; }
+
+}
\ No newline at end of file
diff --git a/Algo/Serie2/Main.class b/Algo/Serie2/Main.class
deleted file mode 100644
index 23fe0514432daa4348517433722f69a742e586e7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2390
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
F2mqHv7s&ts

diff --git a/Algo/Serie2/Sudoku.class b/Algo/Serie2/Sudoku.class
deleted file mode 100644
index 16c60d8f656cc1773b09755e037cf1aeffdbe421..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4413
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
P#4<24#DU2)Fj)Zr!g9{~

diff --git a/Algo/Serie2/Sudoku.java b/Algo/Serie2/Sudoku.java
index c61cb71..d8b5af2 100644
--- a/Algo/Serie2/Sudoku.java
+++ b/Algo/Serie2/Sudoku.java
@@ -9,98 +9,130 @@ public class Sudoku {
     }
 
     /**
-     * Solves the sudoku first by reading order, then with a constraint heurisctic which shows to be slightly more efficient
+     * handles the output and the time mesure of the process
+     * calls the function that solves the sudoku by reading order
      */
     public void solve(){
-        int[][] tmp = copyTab(this.tab);
+        Counter backtracksCounter = new Counter();
+        Counter assignementsBeforeBacktrackCounter = new Counter();
         System.out.println("initial state : ");
         this.print();
         System.out.println("Solving in reading order...");
         long startTimer = System.currentTimeMillis();
-        trackSolution(getBlankSpaces(), 0, 0, 0);
-        System.out.println("time: " +((double)(System.currentTimeMillis()-startTimer))/1000 +"s");
+        trackSolution(getBlankSpaces(), 0, backtracksCounter, assignementsBeforeBacktrackCounter);
+        System.out.println("Solution found in "+((double)(System.currentTimeMillis()-startTimer))/1000 +"s ! + Assigements before backtrack: " +
+        assignementsBeforeBacktrackCounter.getCount()+" | Tracks: "+backtracksCounter.getCount());
+        this.print();
+    }
+
+    /**
+     * handles the output and the time mesure of the process
+     * calls the function that solves the sudoku jumping to the most constraint case (the one with less possibilities)
+     */
+    public void smartSolve(){
+        Counter backtracksCounter = new Counter();
+        Counter assignementsBeforeBacktrackCounter = new Counter();
+        System.out.println("initial state : ");
         this.print();
-        this.tab = tmp;
         System.out.println("Solving by most constraint cases order...");
-        startTimer = System.currentTimeMillis();
-        trackSolution(getBlankSpacesByMostConstraint(), 0, 0, 0);
-        System.out.println("time: " +((double)(System.currentTimeMillis()-startTimer))/1000 +"s");
+        long startTimer = System.currentTimeMillis();
+        int[] mostConstraintCell = getMostConstraintCell();
+        trackSolutionButSmart(mostConstraintCell[1], mostConstraintCell[0], backtracksCounter, assignementsBeforeBacktrackCounter);
+        System.out.println("Solution found in " +((double)(System.currentTimeMillis()-startTimer))/1000 +"s ! Assigements before backtrack: " + 
+        assignementsBeforeBacktrackCounter.getCount()+ " | Tracks: "+backtracksCounter.getCount());
         this.print();
     }
 
     /**
-     * finds a solution to the sudoku by backtracking
+     * finds a solution to the sudoku by trying all the solutions backtracking
      */
-    private boolean trackSolution(ArrayList<int[]> list, int index, int assignmentCount ,int trackCount){
+    private boolean trackSolution(ArrayList<int[]> list, int index, Counter backtracksCount, Counter assignementsBeforeBacktrackCount){
+        int[] cell = list.get(index);
+        //tries playing all possibilities from 1 to the size of the tab (9)
         for(int i = 1; i<=this.tab.length; i++){
-            if(trackCount == 0)
-                assignmentCount++;
-            if(play(i, list.get(index)[0],list.get(index)[1])){
-                if(index==list.size()-1){
-                    System.out.println("Solution found! Assigements before backtrack: "+assignmentCount+" | Tracks: "+trackCount);
+            //if the play is possible
+            if(play(i, cell[0],cell[1])){
+                //counts the number of assignements before the first backtrack
+                if(backtracksCount.getCount()==0)
+                    assignementsBeforeBacktrackCount.increment();
+                //are there still blank spaces to fill
+                if(getBlankSpaces().size() == 0)
                     return true;
-                }
                 else{
-                    if(trackSolution(list, index+1, assignmentCount, trackCount))
+                    //calls the function again with the next case to play in
+                    if(trackSolution(list, index+1, backtracksCount, assignementsBeforeBacktrackCount))
                         return true;
                     else{
-                        trackCount++;
+                        //if the program must go back, deletes the changes, and increments the backtrack counts
+                        backtracksCount.increment();
                         play(0, list.get(index)[0],list.get(index)[1]);
                     }
                 }
             }
         }
+        //if there was no solution
+        return false;
+    }
+
+    private boolean trackSolutionButSmart(int x, int y, Counter backtracksCount, Counter assignementsBeforeBacktrackCount){
+        ArrayList<Integer> possibilities = getConstraint(x,y);
+        //tries playing all the possible plays for this cell
+        for(int i = 0; i<possibilities.size(); i++){    
+            //plays the possibility at the index given
+            play(possibilities.get(i), y, x);
+            //counts the assignements before the first backtrack
+            if(backtracksCount.getCount()==0)
+                assignementsBeforeBacktrackCount.increment();
+            //are there still blank spaces to fill
+            if(getBlankSpaces().size()== 0)
+                return true;
+            else{
+                //calls the function again for the most constraint cell in the sudoku
+                int[] mostConstraintCell = getMostConstraintCell();
+                if(trackSolutionButSmart(mostConstraintCell[1], mostConstraintCell[0], backtracksCount, assignementsBeforeBacktrackCount))
+                    return true;
+                else{
+                    //if the program must go back, deletes the changes and increments the backtrack counts
+                    backtracksCount.increment();
+                    play(0, y, x);
+                }
+            }
+        }
         return false;
     }
 
     /**
-     * gets a list of indexes of blanspaces in the sudoku
+     * gets the index of the most constraint cell
      */
-    private ArrayList<int[]> getBlankSpaces(){
-        ArrayList<int[]> blankSpaces = new ArrayList();
-        int[] blankSpaceIndex;
-        for(int i = 0; i<this.tab.length; i++){
-            for(int j = 0; j<this.tab.length; j++){
-                if(this.tab[j][i] == 0){
-                    blankSpaceIndex = new int[2];
-                    blankSpaceIndex[0] = i;
-                    blankSpaceIndex[1] = j;
-                    blankSpaces.add(blankSpaceIndex);
-                }
+    private int[] getMostConstraintCell(){
+        ArrayList<int[]> list = getBlankSpaces();
+        int[] mostConstraintCell = list.get(0);
+        int constraint = getConstraint(list.get(0)[1],list.get(0)[0]).size();
+        for(int i = 1; i<list.size(); i++){
+            int x = getConstraint(list.get(i)[1], list.get(i)[0]).size();
+            if(x < constraint){
+                constraint = x;
+                mostConstraintCell = list.get(i);
             }
         }
-        return blankSpaces;
+        return mostConstraintCell;
     }
 
     /**
-     * gets a list of indexes of blankspaces in the sudoku in the order of constraints
+     * gets a list of indexes of blanspaces in the sudoku
      */
-    private ArrayList<int[]> getBlankSpacesByMostConstraint(){
+    private ArrayList<int[]> getBlankSpaces(){
         ArrayList<int[]> blankSpaces = new ArrayList();
         int[] blankSpaceIndex;
         for(int i = 0; i<this.tab.length; i++){
             for(int j = 0; j<this.tab.length; j++){
                 if(this.tab[j][i] == 0){
-                    blankSpaceIndex = new int[3];
+                    blankSpaceIndex = new int[2];
                     blankSpaceIndex[0] = i;
                     blankSpaceIndex[1] = j;
-                    blankSpaceIndex[2] = getConstraint(i, j);
-                    if(blankSpaces.size() == 0)
-                        blankSpaces.add(blankSpaceIndex);
-                    else{
-                        for(int k=0; k<blankSpaces.size(); k++){
-                            if(blankSpaceIndex[2]<blankSpaces.get(k)[2]){
-                                blankSpaces.add(k, blankSpaceIndex);
-                                break;
-                            }
-                            if(k == blankSpaces.size()-1){
-                                blankSpaces.add(blankSpaceIndex);
-                                break;
-                            }
-                        }
-                    }
+                    blankSpaces.add(blankSpaceIndex);
                 }
-            }    
+            }
         }
         return blankSpaces;
     }
@@ -108,7 +140,7 @@ public class Sudoku {
     /**
      * gets the constraint level of a case
      */
-    public int getConstraint(int x, int y){
+    public ArrayList<Integer> getConstraint(int x, int y){
         ArrayList<Integer> possibilities = new ArrayList<>();
         for(int i = 1; i<= this.tab.length; i++){
             possibilities.add(i);
@@ -123,7 +155,7 @@ public class Sudoku {
             if(possibilities.size()==0)
                 break;
         }
-        return possibilities.size();
+        return possibilities;
     }
 
     /**
@@ -181,7 +213,6 @@ public class Sudoku {
                 System.out.println();
             System.out.println();
         }
-        System.out.println();
     }
 
     /**
diff --git a/Algo/Serie2/main.java b/Algo/Serie2/main.java
index d115a98..95afd9e 100644
--- a/Algo/Serie2/main.java
+++ b/Algo/Serie2/main.java
@@ -62,12 +62,17 @@ public class Main {
 
     public static void main(String[] args) {
           //tests de Sudoku à partir des fichiers
-          Sudoku profSudoku = new Sudoku(getTabFromFile("profSudoku.txt"));
-          Sudoku emptySudoku = new Sudoku(getTabFromFile("Sudoku0.txt"));
-          //Sudoku DeathSudoku = new Sudoku(getTabFromFile("DeathSudoku.txt"));
-
-          profSudoku.solve();
-          emptySudoku.solve();
+          //Sudoku profSudoku = new Sudoku(getTabFromFile("profSudoku.txt"));
+          //Sudoku emptySudoku = new Sudoku(getTabFromFile("Sudoku0.txt"));
+          Sudoku DeathSudoku = new Sudoku(getTabFromFile("DeathSudoku.txt"));
+          //profSudoku.play(9,0,1);
+          //profSudoku.print();
+          DeathSudoku.solve();
+          DeathSudoku = new Sudoku(getTabFromFile("DeathSudoku.txt"));
+          DeathSudoku.smartSolve();
+          //emptySudoku.solve();
+          //emptySudoku = new Sudoku(getTabFromFile("Sudoku0.txt"));
+          //emptySudoku.smartSolve();
           //sudoku2.solve();
     }     
 }
\ No newline at end of file
diff --git a/Algo/rapport.docx b/Algo/rapport.docx
index 0bb29ef674e483842348e7d968c90ac9e00101cc..eac40277e9cbd313d90357e98cfee577bf0181bb 100644
GIT binary patch
delta 13827
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
KVmlNF5(NO{n_W-<

delta 12208
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
Y%)lUkkY!+C$n%)IDpZNB%^M^N04=y6NdN!<

-- 
GitLab