nqueenproblem.NQueenProblem.java Source code

Java tutorial

Introduction

Here is the source code for nqueenproblem.NQueenProblem.java

Source

/*
 * 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;
        }

    }

}