From 39736e90fdd3670db91e1406bcbeb4e8709a1781 Mon Sep 17 00:00:00 2001 From: emil Date: Thu, 28 Nov 2024 14:28:17 +0300 Subject: [PATCH] Updated with guaranteed subrid method. Statistial version update required. --- Main.java | 67 ++++++++++++++---- .../demo/src/main/java/com/example/Main.java | 7 +- .../demo/target/classes/Main$Chromosome.class | Bin 3502 -> 0 bytes statistical/demo/target/classes/Main.class | Bin 8590 -> 0 bytes .../classes/com/example/Main$Chromosome.class | Bin 3549 -> 3549 bytes .../target/classes/com/example/Main.class | Bin 8853 -> 8853 bytes 6 files changed, 58 insertions(+), 16 deletions(-) delete mode 100644 statistical/demo/target/classes/Main$Chromosome.class delete mode 100644 statistical/demo/target/classes/Main.class diff --git a/Main.java b/Main.java index b695b09..8fc9910 100644 --- a/Main.java +++ b/Main.java @@ -1,4 +1,6 @@ -import java.io.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -110,11 +112,32 @@ public class Main { for (int i = 0; i < numberOfChromosomes; i++) { // Create a copy of the base Sudoku int[][] sudoku = copyMatrix(baseSudoku); - // Randomly fill mutable positions - for (int[] pos : mutablePositions) { - int row = pos[0]; - int col = pos[1]; - sudoku[row][col] = random.nextInt(9) + 1; + // Randomly fill mutable positions while ensuring no duplicates in subgrids + for (int gridRow = 0; gridRow < 3; gridRow++) { + for (int gridCol = 0; gridCol < 3; gridCol++) { + boolean[] present = new boolean[10]; + List subgridPositions = new ArrayList<>(); + // Collect all positions in the current 3x3 subgrid + for (int row = gridRow * 3; row < gridRow * 3 + 3; row++) { + for (int col = gridCol * 3; col < gridCol * 3 + 3; col++) { + int value = sudoku[row][col]; + if (value != 0) { + present[value] = true; + } else { + subgridPositions.add(new int[]{row, col}); + } + } + } + // Randomly fill the subgrid ensuring no duplicates + for (int[] pos : subgridPositions) { + int newValue; + do { + newValue = random.nextInt(9) + 1; + } while (present[newValue]); + sudoku[pos[0]][pos[1]] = newValue; + present[newValue] = true; + } + } } // Create a new chromosome with the generated Sudoku and mutable positions Chromosome chromosome = new Chromosome(sudoku, new ArrayList<>(mutablePositions)); @@ -123,6 +146,7 @@ public class Main { } } + // Create a deep copy of a matrix private int[][] copyMatrix(int[][] original) { int[][] copy = new int[original.length][original[0].length]; @@ -205,15 +229,29 @@ public class Main { public void mutateChromosome(Chromosome chromosome, double mutationRate) { int[][] sudoku = chromosome.getSudoku(); - List mutablePositions = chromosome.getMutablePositions(); - // Mutate each mutable position with a probability defined by mutationRate - for (int[] pos : mutablePositions) { - if (random.nextDouble() < mutationRate) { - int row = pos[0]; - int col = pos[1]; - int newValue = random.nextInt(9) + 1; // Assign a new value between 1 and 9 - sudoku[row][col] = newValue; + // With a probability defined by mutationRate, perform a mutation by swapping subgrids + if (random.nextDouble() < mutationRate) { + // Randomly select two different subgrids to swap + int subgrid1, subgrid2; + do { + subgrid1 = random.nextInt(9); + subgrid2 = random.nextInt(9); + } while (subgrid1 == subgrid2); + + // Get the starting coordinates for both subgrids + int rowStart1 = (subgrid1 / 3) * 3; + int colStart1 = (subgrid1 % 3) * 3; + int rowStart2 = (subgrid2 / 3) * 3; + int colStart2 = (subgrid2 % 3) * 3; + + // Swap the values in the two selected subgrids + for (int rowOffset = 0; rowOffset < 3; rowOffset++) { + for (int colOffset = 0; colOffset < 3; colOffset++) { + int temp = sudoku[rowStart1 + rowOffset][colStart1 + colOffset]; + sudoku[rowStart1 + rowOffset][colStart1 + colOffset] = sudoku[rowStart2 + rowOffset][colStart2 + colOffset]; + sudoku[rowStart2 + rowOffset][colStart2 + colOffset] = temp; + } } } @@ -222,6 +260,7 @@ public class Main { chromosome.evaluateFitness(); } + public void evaluatePopulation() { // Evaluate the fitness of each chromosome in the population for (Chromosome chromosome : population) { diff --git a/statistical/demo/src/main/java/com/example/Main.java b/statistical/demo/src/main/java/com/example/Main.java index 4258789..40dc4d8 100644 --- a/statistical/demo/src/main/java/com/example/Main.java +++ b/statistical/demo/src/main/java/com/example/Main.java @@ -1,8 +1,11 @@ package com.example; -import java.io.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Random; + import org.knowm.xchart.SwingWrapper; import org.knowm.xchart.XYChart; import org.knowm.xchart.XYSeries; @@ -126,7 +129,7 @@ public class Main { // Randomly fill mutable positions for (int[] pos : mutablePositions) { int row = pos[0]; - int col = pos[1]; + int col = pos[1]; sudoku[row][col] = random.nextInt(9) + 1; } // Create a new chromosome with the generated Sudoku and mutable positions diff --git a/statistical/demo/target/classes/Main$Chromosome.class b/statistical/demo/target/classes/Main$Chromosome.class deleted file mode 100644 index 77b54fe48c136518a2f7c3b448876137bb33bdd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3502 zcmbVPOH&)!75=W&>Xw9fyCIBW29L2v$UJO}H4|hL8%=Br111(>GB6Js(S`=88>?H` z&TA$U@=jK9rNWk3cr%M66+2~D$~EgOvdS{6{DiC$mp#sRy9EeLQk8Mp-S?h*?&ZlG@^+MZe__?t8ig{J|`Di z5@^K{1}RlMW3gyXJFewfj_uMk;RmjGR&j8`a=nc7Z%d#ZUlGu5TAppXbQ8Ha?XM(o z6rBPs1*c+rH=NtEmQysUk(h<=^lAdHNhjTR$~whL$=>smVU8v6y7XxCJ@S>s<+8Q3 z=MqB?PG~rpz#B;JL!Q6udS;2ZoC@*lLF$$>I9;}EFYlF2qm*eO->C#np--T_WUQH4 z$1WJ&JC?V?k?R?@M?88m*Bfm2Ddk?vUMA-Q7}Rh&fioBqX!WVtA73D{F25#2yd0o+ zR)!c(;G8@&&G#(YQM^gcCIjxfcgY`-zF(ETLv_gDyoL)2jN)qo4g1eTAZmGL+3=h) zNlR7}_m3=BwP)&Z31b?v3A~N3^J{w%c3haxis4R~cbGfRYEJIBlE78u1QgphAK8gr zqqB^LYXYJ9TnhvyC9zX7iQHlQ3B>Z&vTb;kG8KK~fV9rf=SDLEoykDp)aC()Oz$jH z$vR8i+&E#`=2WG$XqIQBWC>})DHz3Bqio4})u_m-5oq>9*3=Wf)3)FL?)uK2rb*LV zah9fyvQaY0ANRkKd^sCGU71mA+4S<&ii#wA=}DWrXH(^7>DWrg>M8FYGV|Ucb+5(_ zo}w(gDm!t;xV%$!jpl|?tQelTYl%n$$q=i)yiC`WQVh+{(PRn4H);y9KJOWYwMk>$ z=Sss(o_oP5@>zCnbGxiMmS=UuY9{NxVr$!ylAM#!!s`xcs`Hl#k?{DzIZbw(c;2a$ z3rtZSQcU))0VzI;cFJ_UtB&hwxXW{uE3D=*$MIaRY^(>T;70LX0ubF%e4m*lMPIk* z?QT@@aU4IuCmMbzCATTi<15-1re$w9Yvy23v_W}aHVUi`e&)BeRatcmzI4^Fmx`v_ zGvTl|u4i5@-WtokjWd+aA@1`v{y|I5)V7prh^$d8=2^WIWFlwVW;t6lT-PLh@jaR~ z{8Zq?O8^hcTf@%ORrW;)AB8j>%+juGVS0`ko3EBo5MVxGQ~l@ z<+e!bkEs702O&QvRT@Q|pGOckQq4o)J-lDtJW6kwg(~sYOGLqLc}qbwA|jgn2yKDa zE)vyeQ-1gZe8{zfi8LQfr1g+Q0yGN@VxY5{P%Rq$v)z0GH0_535m@wjlNnqhYm$oA zRO%r*_^)e$kM4yB&<{fEM2qOE3D;VM7LpfyHJ5)foRmZ^d_H`kvnjTXi%s!AD^uaL zqAPNGN>biAq$>mIh#uL3-mgc_ZXvcQ#C=3LQD!z3asS2NHbZ=VepKQK6f?w}A-Y-j zuOlvwqfzvrL!3a5IEh~I22P74(jtWn?U(3tMGX4MjxwPhDz-q)MyR_%EODgpG=^Z} zCZj9JVwpC1s<~ZISFl2xfJN(3sL!DY@f`IUR>dt9;4nfRu(F8Pe5(w5DrYXzx&TZC4yI zIiosM>f*1P5k4PnhWY%|SITc{lrko}mbgNua_leTyl}3eO-$kh(;F7oaZyb3_s$JW ziahdS7VpyjA=gd%u5r&T@xIU84MMqy4qrJMJJUI=ktLOC7)Oz#2-?^arG^ytzXgYt-AP*ej|m87bqqyk|{Z3#G7uW~!f&~b8mPx3U` z_hi&Bs;+H}^-)kGk&eiS+Mzy4YvFWMkLubsx;j)nI*^Y20mt>&WAp+K(Z3lbY5$<< zAf zKzofnje3&5h;~uH8L@;>zTXx%F;3gGurMQ5@t#=Y^jbDp(pYUNKKEwS| zj4_t%S<-xsw!3J?EsogPac{Sw-a{EKxse4r0__XbY4C)2!HxV+P>7cbXBx)&SFpwX z3*9exOd+`hJcF*`(o>v_kktw!gs_3z{`(HEFra~!j~M+s{_}hI5p6BBg>VNyru`@Q J8GeC|{{RCp!MXqd diff --git a/statistical/demo/target/classes/Main.class b/statistical/demo/target/classes/Main.class deleted file mode 100644 index 257a34b9cdd424fec7f73e44db1d4bfd1ffdc489..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8590 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 delta 300 zcmWN|OG^S_7{&2(g7KXxjV>-C8Nse+t;hb0A{SMw(a1^BSSH#v5$1jhJ^h;5|=Z7MNwrvNq|9agQ_WH7Q7L>C*W7i%9hPxj z0^gA4Hwo7r&246INAlcNG4-T!k1Xz!C%=FO{rgbKk3`%kq9$s2tY{NYjMc9!x|6}FPjYuCk)wwO0kq*LqACFDCH-!olv ziKmApd>~EnEIw=6U&!UFt0uJ5yI0HdgOT(qqtA6btRmny4*Intf0X}Md(f}h|8vEK f*N)nW!*&s1g*a_D5gJ;I6%lL2BwC5fb9C8%xLl)6 delta 666 zcmWNPZA{K#6vlt2$=KtGN>QTpVyQK+;h~5$i7+)SG+BnV@gd|TEia?>A!*N^EN#iG zvDwu2_tpoLzIYoev_@NrZ0bYU6q}7}_x8Wf|J>(XyRPdTUxqKE^=nX|n+XIkiK$E> zP$$Sc9+c^JDLY-c5W;aen}ehLD#Dn|EEPl$LlpCgW~ri;#Ik{TY$cu|W%rZFG36^% zQ^f)ePbl8&0m`FKpF^=U737lmi=ft3bY%Z{ui_%m{31vD}PVP*93#`T^VbiD~ zQg=MHPH~vqJU-c2C!{NcQZJvbN@s&~)C;MRo${cBCgEP^yy9w_Rb8i-n@($ZpXJ|{ z!FS|&3v+cR;;>wHrEyPW?z4pl6!4H@{g=wVS{@7diNM-rY=^p@D(c{szP)-MC-y&t8zeZ$$RHN14HQZO5oOetK)7d?906s&V4@t^Pln|G4J;*Xx6GLr2yYpvYtAAR{hR12YY