Решил изучать GA. Вроде все понятно, но вот вопрос: Я написал небольшую прогу для gcj, которая демонстрирует буквально отбор. Как говорится в пособии по алгоритму, программа будит генерить последовательность из байтов, причем количество единиц будет увеличиваться. Так по сути демонстрируется естественный отбор. Но... То ли я чего напутал в составлении алгоритма, то ли еще чё-то: ПОЧЕМУ УВЕЛИЧИВАЕТСЯ КОЛИЧЕСТВО ЕДИНИЦ? По какому закону? Вот код: Код (Text): public class ga{ private static int objects_num; // Число сущностей в популяции private byte[] population; // Популяция void fillNullPopulation (){ int i=0; for (i=0; i<objects_num; i++){ byte b = 0; population[i]=b; // Заполним популяцию всякой фигнёй } } static { objects_num=100; }; public ga(){ population = new byte[objects_num]; fillNullPopulation(); // СОЗДАДИМ МУТАНТОВ int i = 0; for (i=0; i<objects_num; ++i){ Random r = new Random(); if (r.nextInt()%2 == 1) population[i] =1; else population[i] =0; System.out.print (population[i]); } }; public static void main (String[] args){ new ga(); } } Получаю: 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000111110000000 0000000000000000011111111110000000000000000001111111111100000000000000000000000000000000000000000
Ладно. Демонстрирую. Вот откомпилированная прога под Линукс. P.S.: Требует libgcj (она встает при полной установке gcc)
А что количество единиц при каждом запуске действительно увеличивается?! Я вижу только Random! почему так, а не i++?
Я тоже вижу Random Но по какому-то волшебству программа выдаёт упорядоченные значения (явно не от фонаря). Почему?
Все наоборот! Первый запуск: ВСе живы ( все единицы ) Второй запуск: 25% 1 Третий запуск: Половина живых Четвертый запуск - ВСЕ МЕРТВЫ!!! ( двести нулей) пятый, шестой...десятый - двести нулей!!! P.S: Я начинаю верить в ад
255 запуск - 1111000000 Ужас - все по старому кругу, даже последовательность нулей и единиц не меняется! P.S: Ад точно существует!
Код (Text): Random r = new Random(); if (r.nextInt()%2 == 1) population[i] =1; else population[i] =0; Какой таймер - здесь делается инжект в популяцию. Повнимательнее.
Судя по результатам работы этой программы: Взяли 200 солдат и отправили в горячую точку. Погибли все. Отправили еще 8 раз Погибли все. Отправили еще раз. 25 солдат выжило. Чувствуете тенденцию?
ГСЧ берет за основу текущее время. Если его принудительно проинициализировать, то результат программы - все нули за 1024 запуска.