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

Тема в разделе "WASM.HEAP", создана пользователем device, 18 сен 2007.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Решил изучать GA.
    Вроде все понятно, но вот вопрос:

    Я написал небольшую прогу для gcj, которая демонстрирует буквально отбор.
    Как говорится в пособии по алгоритму, программа будит генерить последовательность из байтов, причем количество единиц будет увеличиваться. Так по сути демонстрируется естественный отбор.

    Но... То ли я чего напутал в составлении алгоритма, то ли еще чё-то:
    ПОЧЕМУ УВЕЛИЧИВАЕТСЯ КОЛИЧЕСТВО ЕДИНИЦ? По какому закону?

    Вот код:

    Код (Text):
    1. public class ga{
    2.  
    3. private static int objects_num; // Число сущностей в популяции
    4. private byte[] population; // Популяция
    5.  
    6.  
    7. void fillNullPopulation (){
    8.  
    9. int i=0;
    10.  
    11. for (i=0; i<objects_num; i++){
    12. byte b = 0;
    13. population[i]=b; // Заполним популяцию всякой фигнёй
    14.  
    15. }
    16.  
    17. }
    18.  
    19.         static   {
    20.  
    21.     objects_num=100;
    22.    
    23.  
    24.              };
    25.  
    26.  
    27.         public ga(){
    28.  
    29.         population = new byte[objects_num];
    30.         fillNullPopulation();
    31.         // СОЗДАДИМ МУТАНТОВ
    32.         int i = 0;
    33.             for (i=0; i<objects_num; ++i){
    34.  
    35.             Random r = new Random();
    36.             if (r.nextInt()%2 == 1) population[i] =1;
    37.             else
    38.             population[i] =0;
    39.             System.out.print (population[i]);
    40.             }
    41.  
    42.  
    43.                 };
    44.  
    45.  
    46. public static void main (String[] args){
    47.  
    48.  
    49. new ga();
    50.  
    51. }
    52.  
    53. }
    Получаю:
    0000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000111110000000
    0000000000000000011111111110000000000000000001111111111100000000000000000000000000000000000000000
     
  2. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Ладно. Демонстрирую.

    Вот откомпилированная прога под Линукс.


    P.S.: Требует libgcj (она встает при полной установке gcc)
     
  3. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Кто-нибудь запускал " ./ga "?
    Какие результаты получились?
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    А что количество единиц при каждом запуске действительно увеличивается?! Я вижу только Random!
    почему так, а не i++?
     
  5. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Я тоже вижу Random:)
    Но по какому-то волшебству программа выдаёт упорядоченные значения (явно не от фонаря). Почему?
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    А ну ка увеличь число объектов до 200 и посмотри
     
  7. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Все наоборот!
    Первый запуск: ВСе живы ( все единицы )
    Второй запуск: 25% 1
    Третий запуск: Половина живых
    Четвертый запуск - ВСЕ МЕРТВЫ!!! ( двести нулей)
    пятый, шестой...десятый - двести нулей!!!

    P.S: Я начинаю верить в ад:)
     
  8. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    255 запуск - 1111000000

    Ужас - все по старому кругу, даже последовательность нулей и единиц не меняется!

    P.S: Ад точно существует!
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Только не смейтеть. В Borland Pascal надо было писать randomize timer, может и тут надо?!
     
  10. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Код (Text):
    1.             Random r = new Random();
    2.             if (r.nextInt()%2 == 1) population[i] =1;
    3.             else
    4.             population[i] =0;
    Какой таймер - здесь делается инжект в популяцию. Повнимательнее.
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    наверно имелось ввиду, что сначала нужно проинициализировать ГСЧ. или я не туда?
     
  12. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Судя по результатам работы этой программы:
    Взяли 200 солдат и отправили в горячую точку.
    Погибли все.
    Отправили еще 8 раз
    Погибли все.
    Отправили еще раз. 25 солдат выжило. Чувствуете тенденцию?
     
  13. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    ну да, я это и имел ввиду, раз все по кругу.....
     
  14. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    ГСЧ берет за основу текущее время.

    Если его принудительно проинициализировать, то результат программы - все нули за 1024 запуска.
     
  15. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Публикую результат работы.

    Читать строго снизу вверх:)