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