Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package nqueenproblem; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Date; import java.util.Random; import org.apache.commons.lang.ArrayUtils; /** * * @author hii */ public class NQueenProblem { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Random r = new Random(); //// // queenSet trya = new queenSet(4); // trya.array[0] = 2; // trya.array[1] = 1; // trya.array[2] = 0; // trya.array[3] = 3; // // queenSet trya1 = new queenSet(4); // trya1.array[0] = 2; // trya1.array[1] = 3; // trya1.array[2] = 0; // trya1.array[3] = 1; // // System.out.println(fitness(trya.array)); // System.out.println(fitness(trya1.array)); // // queenSet a = new queenSet(4); // queenSet b = new queenSet(4); // a.array = ArrayUtils.clone(trya.array); // b.array = ArrayUtils.clone(trya1.array); // // // int k = 0 ; // for (int i = a.array.length / 2; i < a.array.length || k < a.array.length/2; i++) { // if (i == a.array.length) { // i = 0; // } // boolean temp = true; // for (int j = 0; j < b.array.length / 2; j++) { // if (a.array[i] == b.array[j]) { // temp = false; // break; // // } // // } // if(temp) // b.array[k++] = a.array[i]; // // } // // k = 0 ; // for (int i = b.array.length / 2; i < b.array.length || k < b.array.length/2; i++) { // if (i == b.array.length) { // i = 0; // } // boolean temp = true; // for (int j = 0; j < a.array.length / 2; j++) { // if (b.array[i] == a.array[j]) { // temp = false; // break; // // } // // } // if(temp) // a.array[k++] = b.array[i]; // // } // for (int j = 0, k = 4 / 2; j < 4 / 2 && k < 4; j++, k++) { // a.array[k] = getDiff(trya1.array, trya.array, k); // b.array[j] = getDiff(trya.array, trya1.array, k); // // System.out.println("--------!!!!!!!!"); // // System.out.println(Arrays.toString(trya.array)); // System.out.println(Arrays.toString(trya1.array)); // } // System.out.println(Arrays.toString(a.array)); // System.out.println(Arrays.toString(b.array)); int n = 4; // int initPopCount = 4; //// // ArrayList<queenSet> qu = new ArrayList<>(); //// queenSet[] qu = new queenSet[1000]; // while (true) { //// for (int k = 0; k < 20; k++) { // // qu.add(new queenSet(n)); // // for (int j = 0; j < qu.get(i).array.length; j++) { // int rand = r.nextInt(qu.get(i).array.length); // qu.get(i).array[j] = rand; // } //// System.out.println(Arrays.toString(qu.get(i).array)); // qu.get(i).fx = fitness(qu.get(i).array); //// System.out.println(qu.get(i).fx); //// } // // if (qu.get(i).fx == qu.get(i).array.length) { // System.out.println(Arrays.toString(qu.get(i).array)); // System.out.println(qu.get(i).fx); // System.out.println(i); // break; // } // i++; // // } int initChildCount = 2; double mutationProb = 0.6; queenSet[] result = new queenSet[initPopCount]; // ArrayList arr = new ArrayList(); // queenSet[] initPop = new queenSet[initPopCount]; queenSet[] childPop = new queenSet[initChildCount]; // // for (int j = 0; j < childPop.length; j++) { // childPop[j] = new queenSet(n); // } // for (int o = 0; o < initPopCount; o++) { initPop[o] = new queenSet(n); for (int j = 0; j < initPop[o].array.length; j++) { initPop[o].array[j] = genrateDiffRand(initPop[o].array, n, j); } System.out.println(Arrays.toString(initPop[o].array)); initPop[o].fx = fitness(initPop[o].array); System.out.println(initPop[o].fx); } // int index = 0; //// while (true) { for (int g = 0; g < 10; g++) { queenSet[] selectedParents = new queenSet[2]; selectedParents[0] = initPop[r.nextInt(initPop.length)]; selectedParents[1] = initPop[r.nextInt(initPop.length)]; System.out.println(Arrays.toString(selectedParents[0].array)); System.out.println(Arrays.toString(selectedParents[1].array)); for (int m = 0; m < initChildCount; m += 2) { childPop[m] = selectedParents[0]; childPop[m + 1] = selectedParents[1]; queenSet a = new queenSet(4); queenSet b = new queenSet(4); // System.out.println(childPop[m]); a.array = ArrayUtils.clone(childPop[m].array); b.array = ArrayUtils.clone(childPop[m + 1].array); int k = 0; for (int i = a.array.length / 2; i < a.array.length || k < a.array.length / 2; i++) { if (i == a.array.length) { i = 0; } boolean temp = true; for (int j = 0; j < b.array.length / 2; j++) { if (a.array[i] == b.array[j]) { temp = false; break; } } if (temp) { b.array[k++] = a.array[i]; } System.out.println(i + " " + k); } k = 0; for (int i = b.array.length / 2; i < b.array.length && k < b.array.length / 2; i++) { if (i == b.array.length) { i = 0; } boolean temp = true; for (int j = 0; j < a.array.length; j++) { if (b.array[i] == a.array[j]) { temp = false; break; } if (j == a.array.length) { k++; } } if (temp) { a.array[k++] = b.array[i]; } System.out.println("b"); } childPop[m].array = ArrayUtils.clone(a.array); childPop[m + 1].array = ArrayUtils.clone(b.array); childPop[m].fx = fitness(childPop[m].array); childPop[m + 1].fx = fitness(childPop[m + 1].array); System.out.println(Arrays.toString(childPop[m].array)); System.out.println(Arrays.toString(childPop[m + 1].array)); } System.out.println("Loop se bahar "); queenSet[] tempArray = (queenSet[]) ArrayUtils.addAll(initPop, childPop); for (int j = 0; j < tempArray.length - 1; j++) { for (int k = 0; k < tempArray.length - j - 1; k++) { if (tempArray[k].fx < tempArray[k + 1].fx) { queenSet temp = tempArray[k]; tempArray[k] = tempArray[k + 1]; tempArray[k + 1] = temp; } } } System.out.println("---Sorteddddd-\n\n"); for (int j = 0; j < tempArray.length; j++) { System.out.println(Arrays.toString(tempArray[j].array)); System.out.println(tempArray[j].fx); } System.out.println("---"); initPop = Arrays.copyOfRange(tempArray, 0, initPopCount); arr.add(initPop[0].fx); result = initPop; if (result[0].fx == 4) { break; } } System.out.println(Arrays.toString(result[0].array)); System.out.println(result[0].fx); } static int genrateDiffRand(int[] arr, int bound, int arrCount) { while (true) { System.out.println("i"); boolean flag = true; int rand = new Random().nextInt(bound); for (int i = 0; i < arrCount; i++) { if (rand == arr[i]) { flag = false; break; } } if (flag) { return rand; } } } static int getDiff(int[] arr1, int[] arr2, int bound) { for (int k = 0, i = arr2.length / 2; k < arr2.length; i++, k++) { boolean flag = true; if (i == arr2.length) { i = 0; } for (int m = 0, j = arr1.length / 2; m < bound; m++, j++) { if (j == arr1.length) { // System.out.println(j + " j"); j = 0; } if (arr2[i] == arr1[j]) { System.out.println(arr2[i] + " -- " + arr1[j]); flag = false; break; } } if (flag) { System.out.println(arr2[i] + " " + i); return arr2[i]; } } return 0; } static int fitness(int[] arr) { int n = arr.length; int f = 0; // boolean same = true; // for (int i = 0; i < n; i++) { // for (int j = 0; j < n; j++) { // if (i == j) { // continue; // } // if (arr[i] == arr[j]) { // // same = false; // } // } // } //if(same) for (int i = 0; i < n; i++) { boolean temp = true; for (int j = 0, k = 1; j < n; j++, k++) { if (i != j && arr[i] == arr[j]) { temp = false; break; } if (i + k < n) { // System.out.println(arr[i + k] + " ___ " + (arr[i] + k) + " + + + " + i + j); if (arr[i + k] == arr[i] + k || arr[i + k] == arr[i] - k) { // System.out.println(arr[i + k] + "" + (arr[i] + k) + "" + arr[i + k] + "" + (arr[i] - k) + " + + + " + i + j); temp = false; break; } } if (i - k >= 0) { if (arr[i - k] == arr[i] + k || arr[i - k] == arr[i] - k) { // System.out.println(arr[i - j] + "" + (arr[i] + k) + "" + arr[i - j] + "" + (arr[i] - k) + " - - - " + i + j); temp = false; break; } } } if (temp) { f++; // System.out.println("++ " + f + i); } // System.out.println("IIIIIIII\n\n"); } return f; } } class queenSet { int[] array; int fx; public queenSet(int n) { array = new int[n]; for (int i = 0; i < array.length; i++) { array[i] = -1; } } }