Вырождается генетический алгоритм

Пытался написать генетический алгоритм. Каждая особи представлена в виде двоичной строки кода. В качестве отбора использовал сравнение со среднеарифметическим по популяции. Проблема заключается в вырождении вида уже во втором поколении. Все особи становятся похожи друг на друга, тем самым популяция не развивается.`

public class GenAlg {

    public static void main(String[] args) {
    String[] vid = new String[] {"01100011", "10011100", "11001100", "01100110","01101110", "11110000", "11001100", "01100111"};
        int m =0;
        System.out.println("Начало");
        while(m<25) {
            System.out.println("Попытка сделать поколение");
            vid = otbor(razmn(vid));
        
            System.out.println();
            m++;
        }
        for(int l=0;l<vid.length;l++){
            System.out.print(" Поколение "+m+": " +vid[l]);
        }
    }
    
    public static String[] razmn(String [] mas) {
        String[] mas_2 = new String[16];
        
        for(int i=0;i<16;i++) {
            
            int y = (int) (Math.random()*8);
            int z = (int) (Math.random()*8);
            mas_2[i] = String.valueOf( mas[y].charAt(0)) +String.valueOf(mas[y].charAt(1))+String.valueOf(mas[y].charAt(2))+
                    String.valueOf(mas[y].charAt(3))+String.valueOf(mas[z].charAt(4))+String.valueOf(mas[z].charAt(5))+String.valueOf(mas[z].charAt(6))+String.valueOf(mas[z].charAt(7));
            
        }
        for(int l=0;l<mas_2.length;l++){
            System.out.print(mas_2[l]+" Размножение ");
        }
        System.out.println();
        return mas_2;
    }
    public static String[] otbor(String[] mas) {
        int[] level = new int[16];
        System.out.println("Отбор");
        String[] mas_3 = new String[8];
        for(int i=0;i<mas.length;i++) {
            int u =0;
            for(int z=0;z<mas[i].toCharArray().length;z++) {
                level[i]= level[i]+Integer.parseInt(String.valueOf(mas[i].toCharArray()[z]));
            }
            
        }
        
        int o=0;
        int sum =0;
        int sr;
        while(o<8) {
    
            for(int y =0; y< level.length; y++) {
                sum = sum+level[y];
            }
            sr = sum/level.length;
            int q = (int) Math.random()*8;
            if(level[q]>sr) {
                mas_3[o] = mas[q];
                o++;
            }
        }
        for(int l=0;l<mas_3.length;l++){
            System.out.print(mas_3[l]+" Отбор ");
        }
    

        System.out.println();
        return mas_3;
    }

}

Вот, что происходит:

Начало
Попытка сделать поколение
01100110 Размножение 11000110 Размножение 01100110 Размножение 01100000 Размножение 10010111 Размножение 11111100 Размножение 01101100 Размножение 11000110 Размножение 10010110 Размножение 11111110 Размножение 10010011 Размножение 01101110 Размножение 01101100 Размножение 10011100 Размножение 10011100 Размножение 01101100 Размножение 
Отбор
01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 

Попытка сделать поколение
01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 
Отбор
01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 

Попытка сделать поколение
01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 01100110 Размножение 
Отбор
01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 01100110 Отбор 

Ответы (0 шт):