Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.84 KB | None | 0 0
  1. import java.io.BufferedWriter;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.io.PrintStream;
  8. import java.io.PrintWriter;
  9. import java.io.Writer;
  10. import java.util.ArrayList;
  11.  
  12. import javax.swing.JOptionPane;
  13.  
  14. public class GeneticAlgorithm {
  15.  
  16. public static void main(String args[]) throws IOException {
  17. int x = 0;
  18. int z = 0;
  19. int P = 100;
  20. int Tr = 20;
  21. int G = 100;
  22. int Pr = 80;
  23. int Pm = 10;
  24. int Pc = 10;
  25.  
  26. PrintWriter out = new PrintWriter(new FileWriter("src/output.txt"));
  27.  
  28. String input = JOptionPane.showInputDialog("Please enter the number of generations: ");
  29. G = Integer.parseInt(input);
  30.  
  31.  
  32.  
  33. String y;
  34. ArrayList<Integer> holder = new ArrayList<Integer>();
  35. int index = 0;
  36. try {
  37. //FileInputStream fis = new FileInputStream("src/newfile");
  38. FileInputStream fis = new FileInputStream("src/CS4006_input_file.txt");
  39. // FileInputStream("src/CS4006_input_file.txt");
  40.  
  41. while ((x = fis.read()) != -1) {
  42. y = Character.toString((char) x);
  43. if (Character.isDigit(y.charAt(0))) {
  44. z = Character.getNumericValue(y.charAt(0));
  45. holder.add(z);
  46. }
  47.  
  48. }
  49. fis.close();
  50. } catch (FileNotFoundException e) {
  51. System.out.println("error, could not find file");
  52. }
  53.  
  54. // get the number of rows and columns
  55. int rows = (int) Math.sqrt(holder.size());
  56.  
  57. // fill a 2d integer array with the values from the arrayList
  58. int myArray[][] = new int[rows][rows];
  59. for (int i = 0; i < rows; i++) {
  60. for (int j = 0; j < rows; j++) {
  61. myArray[i][j] = (int) holder.get(index);
  62. index++;
  63. }
  64. }
  65.  
  66. // makes the array symmetrical and makes sure there are only 0's and 1's
  67. for (int i = 0; i < rows; i++) {
  68. for (int j = 0; j < rows; j++) {
  69. if (myArray[i][j] > 1 || myArray[i][j] < 0) {
  70. myArray[i][j] = 1;
  71. }
  72. if (myArray[i][j] != myArray[j][i]) {
  73. myArray[j][i] = 1;
  74. myArray[i][j] = 1;
  75. }
  76. }
  77. }
  78. // end of file reading
  79. //-------------------------------------------------------------------------------------------------------------------------------------
  80.  
  81. //System.out.println("The fitness is: " + getFitness(myArray));
  82.  
  83. // creates first population
  84. ArrayList<int[]> population = new ArrayList<int[]>();
  85. for (int i = 0; i < P; i++) {
  86. boolean ready = false;
  87. boolean equal = false;
  88. int[] order = generateOrder(rows);
  89.  
  90. while (ready == false) {
  91. order = generateOrder(rows);
  92. ready = false;
  93. equal = false;
  94. for (int j = 0; j < population.size(); j++) {
  95. if (areOrdersEqual(order, population.get(j)) == true) {
  96. equal = true;
  97. }
  98. }
  99.  
  100. if (equal == true) {
  101. ready = false;
  102. } else {
  103. ready = true;
  104. }
  105. }
  106. population.add(order);
  107. }
  108.  
  109. //start generation for loop
  110. for(int g = 0; g< G; g++){
  111.  
  112. ArrayList<int[]> matingPool = new ArrayList<int[]>();
  113. matingPool = tournament(P, Tr, population, myArray);
  114. ArrayList<int[]> generation = new ArrayList<int[]>();
  115.  
  116. System.out.println("MatingPool ----------------------------------------------------------------------------------");
  117. for(int i = 0; i < matingPool.size(); i++){
  118. System.out.print("Mating i: " + i + " ");
  119. int[] temp = matingPool.get(i);
  120. //String output = "";
  121. for (int j = 0; j < temp.length; j++) {
  122. //System.out.print(temp[j]);
  123. //output += temp[j];
  124. }
  125. System.out.print(" Fitness: " + applyOrder(myArray, temp ,rows));
  126. System.out.println();
  127. }
  128. System.out.println("-----------------------------------------------------------------------------------------------");
  129.  
  130. //
  131. //
  132. // Error below this. reproduction is grabbing orderings from mutation for some reason
  133. //
  134. //
  135. for(int i = 0; i< P; i++){
  136. int number = (int) (Math.random() * 100);
  137. if(number < Pr){
  138. System.out.println("------------------------Reproduction");
  139. //Reproduction
  140. /*System.out.println("MatingPool ----------------------------------------------------------------------------------");
  141. for(int j = 0; j < matingPool.size(); j++){
  142. System.out.print("Mating j: " + j + " ");
  143. int[] temp = matingPool.get(j);
  144. //String output = "";
  145. for (int k = 0; k < temp.length; k++) {
  146. System.out.print(temp[k]);
  147. //output += temp[j];
  148. }
  149. System.out.print(" Fitness: " + applyOrder(myArray, temp ,rows));
  150. System.out.println();
  151. }
  152. */
  153. //System.out.println("-----------------------------------------------------------------------------------------------");
  154. System.out.println("Mating Pool size is: " + matingPool.size());
  155. int num = (int) (Math.random() * matingPool.size());
  156. System.out.println("num is: " + num);
  157. int[] temp = matingPool.get(num);
  158. System.out.print("Temp is: ");
  159. System.out.println(applyOrder(myArray, temp, rows));
  160. matingPool.remove(num);
  161. int[] order = reproduction(temp);
  162. System.out.print("Reproduction: ");
  163. System.out.println(applyOrder(myArray, order, rows));
  164. //System.out.println();
  165. generation.add(order);
  166.  
  167. }
  168. if(number >= Pr && number < (Pr+Pm)){
  169. //Mutation
  170. System.out.println("--------------------------------------------------Mutation");
  171. int num2 = (int) (Math.random() * matingPool.size());
  172. int[] temp2 = matingPool.get(num2);
  173. System.out.println("temp2 is: ");
  174. System.out.println(applyOrder(myArray, temp2, rows));
  175. matingPool.remove(num2);
  176. int[] order2 = mutation(temp2);
  177. generation.add(order2);
  178. System.out.print("Mutation: ");
  179. System.out.println(applyOrder(myArray, order2, rows));
  180. }
  181. if(number >= (Pr+Pm) && number < (Pr+Pm+Pc)){
  182. //Crossover
  183. if(matingPool.size()!=1){
  184. System.out.println("-----------------------------------------------------Crossover");
  185. int num = (int) (Math.random() * matingPool.size());
  186. int[] temp1 = matingPool.get(num);
  187. matingPool.remove(num);
  188.  
  189. int num2 = (int) (Math.random() * matingPool.size());
  190. int[] temp2 = matingPool.get(num2);
  191. matingPool.remove(num2);
  192.  
  193. ArrayList<int[]> results = crossover(temp1, temp2);
  194. int[] child1 = results.get(0);
  195. int[] child2 = results.get(1);
  196.  
  197. generation.add(child1);
  198. System.out.print("Crossover1: ");
  199. System.out.println(applyOrder(myArray, child1, rows));
  200. generation.add(child2);
  201. System.out.print("Crossover2: ");
  202. System.out.println(applyOrder(myArray, child2, rows));
  203. i++;
  204. }else{
  205. //if matingPool size is 1 then crossover can't be performed so a reproduction is performed instead
  206. int num = (int) (Math.random() * matingPool.size());
  207. int[] temp = matingPool.get(num);
  208. matingPool.remove(num);
  209. int[] order = reproduction(temp);
  210. generation.add(order);
  211. System.out.print("Unusual Reproduction: ");
  212. System.out.println(applyOrder(myArray, order, rows));
  213. }
  214. }
  215. }
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222. for(int i = 0; i < generation.size(); i++){
  223. int[] temp = generation.get(i);
  224. String output = "";
  225. for (int j = 0; j < temp.length; j++) {
  226. //System.out.print(temp[j]);
  227. output += temp[j];
  228. }
  229.  
  230. output += " Fitness: " + applyOrder(myArray, temp ,rows);
  231. out.write(output);
  232. out.write("\r\n");
  233. out.flush();
  234.  
  235. //System.out.print(" Fitness: " + applyOrder(myArray, temp ,rows));
  236. //System.out.println();
  237. }
  238.  
  239. int[] temp = generation.get(0);
  240. int lowest = applyOrder(myArray, temp, rows);
  241.  
  242. for(int i = 0; i < generation.size(); i++){
  243. temp = generation.get(i);
  244. int num = applyOrder(myArray, temp, rows);
  245. if(num < lowest){lowest = num;}
  246. }
  247.  
  248.  
  249. population = generation;
  250.  
  251. System.out.println("The lowest fitness in this generation was: " + lowest);
  252. System.out.println();
  253. System.out.println();
  254. out.println("The lowest fitness in this generation was: " + lowest);
  255. out.println();
  256. out.println();
  257. out.flush();
  258.  
  259.  
  260. //end generation forloop
  261. }
  262.  
  263.  
  264.  
  265. }
  266.  
  267. // end of main
  268.  
  269.  
  270.  
  271.  
  272.  
  273. //-----------------------------------------------------------------------------------------------------------------------------------------
  274.  
  275.  
  276.  
  277.  
  278. public static ArrayList<int[]> crossover(int[] parent1, int[] parent2){
  279. int[] child1 = new int[parent1.length];
  280. //orders filled with -1 to stop comparison with generated 0's
  281. for(int q = 0; q < child1.length; q++){
  282. child1[q] = -1;
  283. }
  284. int[] child2 = new int[parent1.length];
  285. for(int q = 0; q < child2.length; q++){
  286. child2[q] = -1;
  287. }
  288. int added1 = 0;
  289. int added2 = 0;
  290. int turn = 1;
  291. boolean flag = false;
  292. int i = 0;
  293. int j = 0;
  294. ArrayList<int[]> results = new ArrayList<int[]>();
  295.  
  296.  
  297.  
  298.  
  299. //loop to generate the first child
  300. while(added1 < parent1.length){
  301.  
  302.  
  303. if(turn == 1){
  304. for (int k = 0; k < child1.length; k++) {
  305. if (parent1[i] == child1[k]) {
  306. flag = true;
  307. }
  308. }
  309.  
  310. if(flag == false){
  311. child1[added1] = parent1[i];
  312. added1++;
  313. }
  314. i++;
  315. flag = false;
  316. turn = 2;
  317. }
  318.  
  319.  
  320. if(turn == 2){
  321. for (int k = 0; k < child1.length; k++) {
  322. if (parent2[j] == child1[k]) {
  323. flag = true;
  324. }
  325. }
  326.  
  327. if(flag == false){
  328. child1[added1] = parent2[j];
  329. added1++;
  330. }
  331. j++;
  332. flag = false;
  333. turn = 1;
  334. }
  335. }
  336.  
  337. i = 0;
  338. j = 0;
  339. turn = 2;
  340.  
  341. //loop to generate the second child
  342. while(added2 < parent1.length){
  343. if(turn == 1){
  344. for (int k = 0; k < child2.length; k++) {
  345. if (parent1[i] == child2[k]) {
  346. flag = true;
  347.  
  348. }
  349. }
  350.  
  351. if(flag == false){
  352. child2[added2] = parent1[i];
  353. added2++;
  354. }
  355. i++;
  356. flag = false;
  357. turn = 2;
  358. }
  359.  
  360. if(turn == 2){
  361. for (int k = 0; k < child2.length; k++) {
  362. if (parent2[j] == child2[k]) {
  363. flag = true;
  364. }
  365. }
  366.  
  367. if(flag == false){
  368. child2[added2] = parent2[j];
  369. added2++;
  370. }
  371. j++;
  372. flag = false;
  373. turn = 1;
  374. }
  375. }
  376.  
  377. //System.out.print("parent1 is: ");
  378. //printOrder(parent1);
  379. //System.out.print("parent2 is: ");
  380. //printOrder(parent2);
  381. //System.out.print("child1 is: ");
  382. //printOrder(child1);
  383. //System.out.print("child2 is: ");
  384. //printOrder(child2);
  385.  
  386. results.add(child1);
  387. results.add(child2);
  388. return results;
  389.  
  390. }
  391.  
  392. //---------------------------------------------------------------------------------------
  393.  
  394. public static int[] mutation(int[] order){
  395.  
  396. int index1 = (int) (Math.random() * order.length);
  397. int index2 = (int) (Math.random() * order.length);
  398.  
  399. int temp = order[index1];
  400. order[index1] = order[index2];
  401. order[index2] = temp;
  402.  
  403. return order;
  404.  
  405. }
  406.  
  407. //---------------------------------------------------------------------------------------
  408.  
  409. public static int[] reproduction(int[] order){
  410. return order;
  411. }
  412.  
  413.  
  414. //---------------------------------------------------------------------------------------
  415. public static ArrayList<int[]> tournament(int P, int Tr, ArrayList<int[]> population, int[][] myArray){
  416. ArrayList<int[]> matingPool = new ArrayList<int[]>();
  417. int rows = myArray[0].length;
  418.  
  419.  
  420. for(int k = 0; k < P; k++){
  421.  
  422. ArrayList<int[]> tournament = new ArrayList<int[]>();
  423.  
  424. // pick Tr orders from the population and add them to an ArrayList
  425. for (int i = 0; i < Tr; i++) {
  426. int num = (int) (Math.random() * population.size());
  427. tournament.add(population.get(num));
  428. }
  429.  
  430.  
  431. // Get the Fitness of the candidates and add them to an ArrayList
  432. ArrayList<Integer> candidatesFitness = new ArrayList<Integer>();
  433. for (int i = 0; i < Tr; i++) {
  434.  
  435. int[] candidate = tournament.get(i);
  436. int canFitness = applyOrder(myArray, candidate, rows);
  437. candidatesFitness.add(canFitness);
  438. }
  439.  
  440. int fit = candidatesFitness.get(0);
  441. int pos = 0;
  442. for (int i = 0; i < candidatesFitness.size(); i++) {
  443. //System.out.println("candidatesFitness.get(i) is: " + candidatesFitness.get(i));
  444. if (candidatesFitness.get(i) < fit) {
  445. fit = candidatesFitness.get(i);
  446. pos = i;
  447. }
  448. }
  449.  
  450. int[] winner = tournament.get(pos);
  451.  
  452. int winFitness = applyOrder(myArray, winner, rows);
  453. System.out.println("winner fitness is: " + winFitness);
  454.  
  455. matingPool.add(winner);
  456. }
  457. return matingPool;
  458. }
  459.  
  460. //---------------------------------------------------------------------------------------
  461. public static int applyOrder(int[][] oldArray, int[] anOrder, int rows) {
  462. int newFitness = 0;
  463. int[] firstOrder = new int[rows];
  464. for (int i = 0; i < rows; i++) {
  465. firstOrder[i] = i;
  466. }
  467. int[][] newArray = oldArray.clone();
  468. for (int j = 0; j < oldArray.length; j++) {
  469. newArray[j] = oldArray[j].clone();
  470. }
  471.  
  472. for (int i = 0; i < rows; i++) {
  473.  
  474. int num1 = firstOrder[i];
  475. int num2 = anOrder[i];
  476. newArray = swapColumns(newArray, rows, num1, num2);
  477. newArray = swapRows(newArray, rows, num1, num2);
  478.  
  479. }
  480.  
  481. newFitness = getFitness(newArray);
  482. return newFitness;
  483. }
  484.  
  485. //---------------------------------------------------------------------------------------
  486. public static int[][] swapColumns(int[][] array, int rows, int index1, int index2) {
  487. int[][] anArray = array;
  488.  
  489. for (int i = 0; i < rows; i++) {
  490. int temp = anArray[i][index1];
  491. anArray[i][index1] = anArray[i][index2];
  492. anArray[i][index2] = temp;
  493. }
  494.  
  495. return anArray;
  496. }
  497.  
  498. //---------------------------------------------------------------------------------------
  499. public static int[][] swapRows(int[][] array, int rows, int index1,
  500. int index2) {
  501. int[][] anArray = array;
  502.  
  503. for (int i = 0; i < rows; i++) {
  504. int temp = anArray[index1][i];
  505. anArray[index1][i] = anArray[index2][i];
  506. anArray[index2][i] = temp;
  507. }
  508.  
  509. return anArray;
  510. }
  511.  
  512. //---------------------------------------------------------------------------------------
  513. public static boolean areOrdersEqual(int[] order1, int[] order2) {
  514. boolean answer = true;
  515.  
  516. for (int i = 0; i < order1.length; i++) {
  517. if (order1[i] != order2[i]) {
  518. answer = false;
  519. }
  520. }
  521.  
  522. return answer;
  523. }
  524.  
  525. //---------------------------------------------------------------------------------------
  526. public static int[] generateOrder(int rows) {
  527. int[] anOrder = new int[rows];
  528. for (int i = 0; i < rows; i++) {
  529. boolean ready = false;
  530. boolean flag = false;
  531. int num = 0;
  532.  
  533. while (ready == false) {
  534. // System.out.println("generateOrder while");
  535. flag = false;
  536.  
  537. num = (int) (Math.random() * rows);
  538. num++;
  539.  
  540. // check to see if the num is already in the order
  541. for (int j = 0; j < anOrder.length; j++) {
  542. if (num == anOrder[j]) {
  543. flag = true;
  544. }
  545. }
  546.  
  547. if (flag == false) {
  548. ready = true;
  549. }
  550.  
  551. }
  552.  
  553. anOrder[i] = num;
  554. }
  555.  
  556. // because the array is filled with 0's to begin with all numbers are
  557. // increased by 1 when generated to stop comparisons between
  558. // the generated 0's and the 0's in the array from showing a used space.
  559. // this loop drops the ordering by 1 to show the real numbers generated
  560. for (int i = 0; i < anOrder.length; i++) {
  561. anOrder[i]--;
  562. }
  563.  
  564. return anOrder;
  565. }
  566.  
  567. //---------------------------------------------------------------------------------------
  568. public static void printOrder(int[] order) {
  569. for (int i = 0; i < order.length; i++) {
  570. System.out.print(order[i]);
  571. }
  572. }
  573.  
  574.  
  575. //---------------------------------------------------------------------------------------
  576. static int getFitness(int[][] myArray) {
  577. int[] ar = myArray[0];
  578. int rows = ar.length;
  579. int fitness = 0;
  580. int temp = 0;
  581. for (int i = 0; i < rows; i++) {
  582. for (int j = 0; j < rows; j++) {
  583. if (myArray[i][j] != 0) {
  584. temp = i - j;
  585. if (temp < 0) {
  586. temp = (temp * -1);
  587. }
  588. fitness = fitness + temp;
  589. }
  590. }
  591. }
  592. return fitness;
  593. }
  594.  
  595. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement