private static TspPopulation[] generate(){
        stepResults = new double[MAX_STEPS][GLOBAL_STEPS];
        Graph g = new Graph(INDIVIDUAL_SIZE);
        TspPopulation[] h = new TspPopulation[GLOBAL_STEPS];
        for (int i = 0; i < GLOBAL_STEPS; ++i){
            h[i] = new TspPopulation(POPULATION_SIZE, INDIVIDUAL_SIZE, g.getGraph());
        }
        resultsRandom = new long[GLOBAL_STEPS];
        Arrays.fill(resultsRandom, Long.MAX_VALUE);
        for (int i = 0; i < GLOBAL_STEPS; ++i){
            if (i % 100 == 0){
                System.out.println("random " + i);
            }
            TspPopulation populationRandom = new TspPopulation(h[i]);
            InverseOperator randomIO = new InverseOperator(populationRandom, RNG);
            SwapOperator randomSWO = new SwapOperator(populationRandom, RNG);
            ScrambleOperator randomSCO = new ScrambleOperator(populationRandom, RNG);
            MPX1 randomMPX1 = new MPX1(populationRandom, RNG);
            MPX2 randomMPX2 = new MPX2(populationRandom, RNG);
            for (int step = 0; step < MAX_STEPS; ++step){
                double r;
                synchronized (RNG){
                    r = RNG.nextDouble();
                }
                if (r < 0.2) {
                    randomIO.mutate();
                    counterR[0]++;
                } else if (r < 0.4) {
                    randomSWO.mutate();
                    counterR[1]++;
                } else if (r < 0.6) {
                    randomSCO.mutate();
                    counterR[2]++;
                } else if (r < 0.8) {
                    randomMPX1.mutate();
                    counterR[3]++;
                } else {
                    randomMPX2.mutate();
                    counterR[4]++;
                }
                stepResults[step][i] = populationRandom.getFittest();
            }
            resultsRandom[i] = populationRandom.getFittest();
        }
        Arrays.sort(resultsRandom);
        return h;
    }