Достижение идеальной физической формы с помощью простого GA

#java #genetic-algorithm

#java #генетический алгоритм

Вопрос:

Я читал вводный текст по генетическим алгоритмам и в настоящее время застрял на задаче с упражнениями. Элемент в этой задаче представляет собой 20-битную двоичную строку, и ее пригодность — это просто число единиц в строке.

Я выполнил мутацию и кроссовер, используя пропорциональный выбор пригодности (я думаю, что подход с колесом рулетки — это термин). Однако вопрос в книге просит сообщить, в каком поколении появляется идеально подходящая строка (все 1 подряд), и этого никогда не происходит в моей программе даже после указанных 20 итераций. Я не могу обнаружить проблему.

Вот код для выбора колеса рулетки для пересечения двух пользователей (n_life обозначает количество пользователей):

 //selecting members for crossover (roulette wheel)
     int sum=0;
     int[] temp1 = new int[20];
     int[] temp2 = new int[20];
     int[][] result = new int[2][20];
     for(int i=0; i<n_life; i  ){
      sum=sum findex[i];     
     }

     int pointer = new Random().nextInt(sum); 
     int partsum=0;
     for(int b=0; b<n_life; b  ){
         partsum=partsum findex[b];
         if(partsum>pointer){for(int i=0; i<20; i  ){
              temp2[i]=initial[b][i];
         }break;}
     }

      pointer = new Random().nextInt(sum); 
      partsum=0;
     for(int a=0; a<n_life; a  ){
         partsum=partsum findex[a];
         if(partsum>pointer){for(int i=0; i<20; i  ){
             temp1[i]=initial[a][i];
         }break;}
     }
  

Наконец, результат для n_life = 10 выглядит следующим образом. Первая матрица — это начальная совокупность. Вторая матрица показывает пригодность всех людей в определенном поколении. Третья матрица — это конечная совокупность.

 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 
0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 0 
0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 1 
1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 
0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 
1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 1 0 
0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 1 0 
0 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 
0 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 1 

10  8   11  9   6   11  8   12  7   14  
10  8   11  9   9   11  8   12  11  14  
10  9   11  10  9   11  8   12  11  14  
10  14  11  10  14  11  8   12  11  14  
15  14  11  15  14  11  8   12  11  14  
15  14  15  15  14  15  8   12  11  14  
15  14  15  15  14  15  15  12  15  14  
15  14  15  15  14  15  15  12  15  14  
15  15  15  15  15  15  15  12  15  14  
15  15  15  15  15  15  15  13  15  16  
15  15  15  15  15  15  15  13  15  16  
16  16  15  15  15  15  15  13  15  16  
16  16  16  16  15  15  15  13  15  16  
16  16  16  16  15  15  15  13  15  16  
16  16  16  16  13  13  15  13  15  16  
16  16  16  16  13  13  15  13  15  16  
16  16  16  16  13  13  15  13  15  16  
16  16  16  16  16  16  15  13  15  16  
16  16  16  16  16  16  16  15  15  16  
16  16  16  16  16  16  16  15  15  16  

0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 
0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 
  

GA насыщается при 16, но никогда не достигает физической формы 20. Может кто-нибудь, пожалуйста, указать на проблему? Спасибо.

Комментарии:

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

2. Я использую мутацию с p = 0.001, как указано в вопросе. И независимо от того, сколько раз я запускаю его, он никогда не насыщается до 20.

3. Это значение p звучит очень низко всего для 20 поколений. Всегда ли это заканчивается с одним и тем же населением? Если вы посмотрите на результирующую совокупность (3-я матрица), пустые столбцы появятся там, где появляются разреженные столбцы в исходной совокупности. Вы ограничены 20 поколениями?

4. В вопросе упоминается 20, я думал, что в этом может быть какая-то логика. Не могли бы вы указать более подходящее число и соответствующую вероятность мутации?

5. Проблема с GA заключается в том, что они эвристичны; они предоставляют решение, которое «достаточно хорошо», и это все, что они могут обещать. Таким образом, редко бывает «правильное» число для чего-либо, обычно вам нужно попробовать и посмотреть, что работает. Для нескольких поколений попробуйте запустить его, пока не достигнете целевой физической формы пару раз, и посмотрите, сколько поколений для этого потребуется.