Разберемся с Дилеммой Холдейна (почему в некоторых комп моделях она не наблюда)

Автор Alexy, марта 26, 2011, 19:21:15

« назад - далее »

Vuto

Цитата: Игорь Антонов от апреля 09, 2011, 22:58:36
Если Вы внимательно посмотрите код, то увидите, что у пары родителей с равной вероятностью появляются дети, являющиеся носителями   всех упомянутых  Вами комбинаций аллелей. А вот в массив _obj  ниже по коду с влиянием фитнеса попадают не все дети поколения , а лишь допущенные в дальнейшем до размножения, то есть, будущие родители. То есть, всё, на чём Вы, ужасаясь коду, настаиваете выше, так и происходит уже давно, с самого начала.
Ну, во-первых, вы ошиблись (перепутали причину со следствием).
А во-вторых, вы, скорее всего, правы. Если свойства коммутативны (А*Б=Б*А), то перепутав причину со следствием для всех (кроме 1го поколения), посчитано правильно.
Хотя, конечно, ЧТО посчитано...
Вот, что вы считаете: Все особи размножаются в популяции, причём дают максимальное потомство. Фитнес - вероятность выживания до половозрелости, причём крайне низкий (чтоб численность держать в норме).

Я же предлагаю посчитать другое. А именно: Выживают все дети. Но к размножению допускаются не все, а лишь вероятностно по фитнесу. И у каждой пары не максимальное количество детей, а лишь не более максимального количества детей. Да и вообще, с тем алгоритмом, который я показал, особи могут (!)менять пару.
for (i=1; i<total_children; i++)        //поторяем количтво детей раз, так как за цикл на пару приходится один ребёнок
{      
 foreach(obj)    if (  rand(obj[index].fitnes)  )  reproductions[]=index;           // для каждого родителя проверяем вероятностно фитнес, если да, то добавляем индекс родителя в массив
 
 далее идёт случайный отбор родителей из массива индексов допущенных родителей
 (из вашей программы с исключением из массива индексов допущенных родителей, но не самих родителей),
 формирования ребёнка и БЕЗУСЛОВНАЯ запись ребёнка в следующее поколение (без проверки на фитнес).
 
}

Игорь Антонов

Цитата: Vuto от апреля 11, 2011, 00:10:59Ну, во-первых, вы ошиблись (перепутали причину со следствием).
Какую причину с каким следствием я перепутал?
Цитата: Vuto от апреля 11, 2011, 00:10:59...Я же предлагаю посчитать другое. А именно: Выживают все дети. Но к размножению допускаются не все, а лишь вероятностно по фитнесу.
Что не соответствует этому тезису у меня? В программе создаются все дети и они там не уничтожаются.

Что касается экспериментов с кодом  - один я уже провёл по Вашей просьбе, но в целом так не делают.
Если у Вас есть конструктивные предложения - поставьте бесплатный Visual C# Express Edition (проект сделан на C#, а не C++), доработайте и отладьте свой альтернативный вариант кода и выложите тогда здесь собственный рабочий вариант программы.
Спасибо.

Vuto

Цитата: Игорь Антонов от апреля 11, 2011, 08:10:55
Цитата: Vuto от апреля 11, 2011, 00:10:59Ну, во-первых, вы ошиблись (перепутали причину со следствием).
Какую причину с каким следствием я перепутал?
Естественный отбор не смотрит в будущее, он отбирает ЛИШЬ настоящее. У вас же он отбирает лишь будущее.

Цитировать
Цитата: Vuto от апреля 11, 2011, 00:10:59...Я же предлагаю посчитать другое. А именно: Выживают все дети. Но к размножению допускаются не все, а лишь вероятностно по фитнесу.
Что не соответствует этому тезису у меня? В программе создаются все дети и они там не уничтожаются.
у вас не соответствует тезису многое. У вас !каждая особь допущена к размножению, она моногамна в своих отношениях, и моногамная пара имеет всегда максимальное количество детей.
В моих предложениях пары создаются для создания лишь одного ребёнка, а потом пары могут меняться.
Не все допущены к размножению. Все дети выживают. Это ближе к реальности, чем исходная модель.

ЦитироватьЕсли у Вас есть конструктивные предложения - поставьте бесплатный Visual C# Express Edition (проект сделан на C#, а не C++), доработайте и отладьте свой альтернативный вариант кода и выложите тогда здесь собственный рабочий вариант программы.
Спасибо за совет, но С# не мой любимый язык программирования.  :'(
Поэтому я и попросил вас доделать программу. Зачем же в конце пути бросать почти готовый проект?  ;)

Игорь Антонов

Vuto, пока что, судя по последней реплике, Вы не понимаете, как в моей программе реализован отбор. В этой ситуации управлять моими действиями дистанционно и построчно бессмысленно. Если Вы всё-таки берётесь за правку программы на нелюбимом Вами языке, то преодолейте себя пожалуйста и реализуйте свои идеи собственными руками. Если сделаете на своём любимом языке - также не будет ни малейших возражений.

Макроассемблер

#64
Цитата: Vuto от апреля 12, 2011, 00:22:58
Естественный отбор не смотрит в будущее, он отбирает ЛИШЬ настоящее. У вас же он отбирает лишь будущее.
Мне кажется Вы не правы. Там отбирается настоящее, насколько это возможно в программе, не моделирующей жизненный цикл особи
А Вы сами программируете?

Vuto

Цитата: Макроассемблер от апреля 12, 2011, 14:33:31Мне кажется Вы не правы. Там отбирается настоящее, насколько это возможно в программе, не моделирующей жизненный цикл особи
строки 71:76 из Population.cs:
           while (obj.Count > 1)
           {  
               int index=Form1.random_index(obj.Count);
               Individual o1 = obj[index];
                 obj.RemoveAt(index);
               index = Form1.random_index(obj.Count);
               Individual o2 = obj[index];
                  obj.RemoveAt(index);


Тут написано буквально  - Пока есть в популяции более одного организма, вытаскиваем из популяции случайные две особи (по сути вытаскиваются все особи попарно)
               Individual child;
               for (int n = 0; n < total_children; n++)
               {
                   child = new Individual();
...

Создаём максимальное количество детей у этой пары
                   if (Form1.ok(fitness * 2.0 / total_children)) _obj.Add(child);
Если ребёнок из-за естественного отбора случайно(в зависимости от фитнеса) доживает до половозрелости, он будет в следующей популяции.
ЦитироватьА Вы сами программируете?
Есть такое.

Игорь Антонов

Цитата: Vuto от апреля 12, 2011, 22:50:48
                    if (Form1.ok(fitness * 2.0 / total_children)) _obj.Add(child);
Если ребёнок из-за естественного отбора случайно(в зависимости от фитнеса) доживает до половозрелости, он будет в следующей популяции.
Я выше уже отмечал, что _obj  - это часть очередного поколения, допущенная до следующего размножения. В популяции эти особи присутствуют наравне с другими, не включенными в _obj.

Vuto

Цитата: Игорь Антонов от апреля 12, 2011, 23:10:47
Цитата: Vuto от апреля 12, 2011, 22:50:48
                    if (Form1.ok(fitness * 2.0 / total_children)) _obj.Add(child);
Если ребёнок из-за естественного отбора случайно(в зависимости от фитнеса) доживает до половозрелости, он будет в следующей популяции.
Я выше уже отмечал, что _obj  - это часть очередного поколения, допущенная до следующего размножения. В популяции эти особи присутствуют наравне с другими, не включенными в _obj.
Или это я дурной, или я не туда смотрю, а что означает?obj = _obj;
Я так понимаю, что в новое поколение поступают лишь дети.

Игорь Антонов


Макроассемблер


Vuto


Vuto

Цитата: Игорь Антонов от апреля 13, 2011, 00:06:01
obj=_obj - это не новое поколение.
Это новые родители и не более того.
От вас много информации )))
Кстати, вы сами себе противоречите. Вы сами написали в комментариях "дети".
Мало этого, вы сами в комментариях написали следующее        List<Individual> obj= new List<Individual>(); // массив особей популяции
        List<Individual> _obj = new List<Individual>(); // массив следующего поколения особей популяции 

Из того, что я увидел, вы на каждое поколение обнуляете массив детей, далее вы опорожняете массив настоящего поколения вытаскивая пары, создавая детей (максимально на пару) и отбираете, выживших вставляете в массив следующего поколения.
Для расчётов неполовозрелые не учитываются.

Ну, где я ошибся?

Игорь Антонов

Vuto, Вы ошиблись в ориентации на начальные комментарии, которые, действительно, надо поправить, а не на суть кода, которую я пояснял в нескольких сообщениях выше. Это ведь тоже комментарии автора. Их надо было учитывать.
Комментарии в листинге относились к исходному замыслу, а по мере написания текста стало понятно, что запоминать ссылки на экземпляры всего  поколения в массиве избыточно, так как информация о геноме особей, не участвующих далее в размножении, никак не востребована в алгоритмах. Количество особей  в каждом следующем поколении - это число отобранных родителей, поделенное на два и умноженное на число детей пары. А в obj из этого поколения попадают только особи, отобранные для дальнейшего размножения. И их число при настройках по умолчанию приблизительно в два раза меньше численности поколения.

Vuto

Цитата: Игорь Антонов от апреля 13, 2011, 23:07:31
Vuto, Вы ошиблись в ориентации на начальные комментарии, которые, действительно, надо поправить, а не на суть кода, которую я пояснял в нескольких сообщениях выше.
Да, в начале я опирался на комментарии, далее разобравшись (как мне кажется) уже стал разбираться по коду, ну, и ориентируясь на ваши слова.

ЦитироватьКоличество особей  в каждом следующем поколении - это число отобранных родителей, поделенное на два и умноженное на число детей пары. А в obj из этого поколения попадают только особи, отобранные для дальнейшего размножения. И их число при настройках по умолчанию приблизительно в два раза меньше численности поколения.
Я не против. Только где идёт подсчёт количества аллелей неучнённых особей?
Из кода я вижу, что вычисляется фитнес ребёнка, и вероятностный отбор, а количество алеллей не передаётся никакому сумматору.

Игорь Антонов

А зачем нам передавать какому-либо сумматору количество аллелей особей, не отобранных для размножения? Какую дополнительную информацию это даст для моделирования динамики отбора? 
Число особей в очередном поколении точно пропорционально числу родителей, а  распределение аллелей в новом поколении с небольшими флуктуациями повторяет распределение в массиве родителей.