#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 заключается в том, что они эвристичны; они предоставляют решение, которое «достаточно хорошо», и это все, что они могут обещать. Таким образом, редко бывает «правильное» число для чего-либо, обычно вам нужно попробовать и посмотреть, что работает. Для нескольких поколений попробуйте запустить его, пока не достигнете целевой физической формы пару раз, и посмотрите, сколько поколений для этого потребуется.