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

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

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

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

Цитата: Alexy от апреля 07, 2011, 14:13:35
- вероятности отбора особей (одного покололения) не строго пропорциональны их фитнесам
строгой процорциональности получиться в принципе не может
например если нужно отобрать 2 особи из 4-х с фитнесами 1, 10, 100, 1000 то уж вероятности отбора для особей с фитнесами 100 и 1000 будут близки между собой и к единице, а не различаться в 10 раз

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

Цитата: Alexy от апреля 07, 2011, 14:13:35
Уважаемый Игорь, а чего?
Модель - статья, ... любая маленькая модификация модели - опиать статья ...?
Вы шутите?

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

Цитата: Imperor от апреля 07, 2011, 15:04:12
Единственно, у меня почему-то так и не работают дробные значения приспособленности (т.е. меньше, чем 1%) и в некоторых случаях желательно было бы, чтобы первичная доля особей тоже была менее 1%.
Илья, я поправил обработку ввода значений. Теперь можно вводить дробные значения приспособленности и доли особей. В остальном версия программы исходная.

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

Цитата: Imperor от апреля 07, 2011, 15:04:12Все-таки, Игорь, Вы бы хоть ради приличия хотя бы коротенькую статью? А то даже сослаться не на что.
Илья, профессиональная сфера это скорее Ваша, чем моя. Сам писать статьи по этому вопросу я не хочу. Но если Вы, как человек причастный к постановке задачи, уточнению модели и её исследованию, такую статью напишете, то можно взять меня в соавторы.

Alexy

Цитата: Макроассемблер от апреля 07, 2011, 15:20:12
Цитата: Alexy от апреля 07, 2011, 14:13:35- вероятности отбора особей (одного покололения) не строго пропорциональны их фитнесам
строгой процорциональности получиться в принципе не может
например если нужно отобрать 2 особи из 4-х с фитнесами 1, 10, 100, 1000 то уж вероятности отбора для особей с фитнесами 100 и 1000 будут близки между собой и к единице, а не различаться в 10 раз
Это по-моему специфический случай (когда количество особей меньше самого большого отношения фитнесов 2-х особей популяции)
А если нужно отобрать 1000 особей из 2000 особей, среди которых есть с фитнесами допустим 1%, 10% и 100%, то всё будет нормально?

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

Я исправил маленькую погрешность (в текстовом отчёте доля особей всегда округлялась до целого значения) и обновил программу в сообщении, отправленном сегодня в 14:35.

Vuto

Цитата: Imperor от апреля 07, 2011, 13:04:41Но это ведь неправильно. Ресурсы среды ограничены. Популяция не будет расти безгранично. Зачем нам неправильная модель?
Почему неправильная?
Может, вы видели, что какие-то виды держат свои популяции с точности до десятков особей?


Цитата: Alexy от апреля 07, 2011, 14:13:35Моделя с отключ нормировкой - не соответствует большинству природных ситуаций
Нормировка вообще не соответствует природным ситуациям ))) Так что аргумент не ахти )

ЦитироватьЗато со включенной (если я правильно понял уважаемого Vuto, в чем сильно неуверен)
- вероятности отбора особей (одного покололения) не строго пропорциональны их фитнесам
Если быть точным, фитнес не равен вероятности допущения к размножению.
То есть строго говоря, непонятно что моделируется в такой ситуации.  ;)
Отношения фитнесов равны отношениям вероятностей допуску к размножению, но из этого не выходит, что фитнес=вероятность.

Vuto

Цитата: Игорь Антонов от апреля 07, 2011, 22:43:51
Усп....
Беру свои слова обратно....

Вчитался в код, понял, что я не так представлял себе алгоритм....
Тогда я что-то совсем не понял.

Игорь, подтвердите ,пожалуйста, у вас алгоритм формируется так?:
1) выбираются случайно 2 особи (без учёта фитнеса)
2) Далее они скрещиваются и проверяется, подходит ли РЕБЁНОК по фитнесу в следующее поколение или нет (вероятностно).
3) Далее так по каждому из скрещиваний (а их столько, сколько детей)

Ведь мы проверяем на фитнес СЛЕДУЮЩЕЕ поколение, а действующее НЕ ПРОВЕРЯЕМ ВООБЩЕ!!!!
Естественный отбор так не работает. Имхо.

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

К сожалению, Си++ у меня не стоит на компе....

Vuto

Цитата: Alexy от апреля 07, 2011, 12:39:56
Фактически проводится отбор одной особи из всего множества новорожденных особей
Да, уже увидел, ужаснулся, так ведь естественный отбор не работает.
Естественный отбор отбирает действующее поколение, а не будущее.
А в программе наоборот, отбирается будущее поколение, зато не отбирается настоящее.

Alexy

Тогда надо делать в программе отбор несколько раз (2 раза) за поколение (отдельно отбор допущенных к размножению и отбор выживших детей)

Но не очень верится, что от этого что-то сильно изменится - можно просто считать, что к размножению их допустили при рождении, и все ВЫЖИВШИЕ имеют равные вероятности дать потомство

Может такое упрощение могло бы как-то негативно сказаться в модели с межвидовыми взаимдействиями, но в данной модели, где особи от рождения до размножения никого не убивают и сами не гибнут, по-моему наверняка не повлияет?

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

Цитата: Vuto от апреля 09, 2011, 01:14:15
Цитата: Alexy от апреля 07, 2011, 12:39:56
Фактически проводится отбор одной особи из всего множества новорожденных особей
Да, уже увидел, ужаснулся, так ведь естественный отбор не работает.
Естественный отбор отбирает действующее поколение, а не будущее.
А в программе наоборот, отбирается будущее поколение, зато не отбирается настоящее.
Ребята, вы что-то перемудрили со своими интерпретациями.
Если проверяется значение переменной Xn+1 в непрерывном ряду - она там прошлая или будущая?

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

Цитата: VutoИгорь, подтвердите ,пожалуйста, у вас алгоритм формируется так?:
1) выбираются случайно 2 особи (без учёта фитнеса)
2) Далее они скрещиваются...

Нет, Vuto, не так. Эти 2 особи случайно отбираются из массива, в который из текущего поколения попали только те особи, которые случайно, но с  учётом фитнеса, допущены до размножения.

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

Цитата: Игорь Антонов от апреля 06, 2011, 20:31:33
Проект небольшой, выложен с полным исходным текстом и комментариями. Я разрешаю всем заинтересованным лицам неограниченно его совершенствовать самостоятельно.  Или предложить свой.
я думаю что будет плохо если проект разделится на несколько самостоятельных веток, а так если бы я писал - то переделал бы все на си++ или яву, не люблю проприетарщину, а яву еще с определенной долей вероятности можно запускать в браузере - удобно

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

Цитата: Imperor от апреля 07, 2011, 13:17:08
Как видите, беззаветная вера в мудрость математиков :) Я даже представить себе не мог, что они действительно могли не посчитать такие очевидные вещи.
А кто там математик?

Vuto

Цитата: Игорь Антонов от апреля 09, 2011, 09:43:49
Цитировать
Естественный отбор отбирает действующее поколение, а не будущее.
А в программе наоборот, отбирается будущее поколение, зато не отбирается настоящее.
Ребята, вы что-то перемудрили со своими интерпретациями.
Если проверяется значение переменной Xn+1 в непрерывном ряду - она там прошлая или будущая?
К сожалению, перемудрили не мы, а вы.
Объясняю почему проверка фитнеса Xn+1 отличается от Xn.
Если есть два родителя (каждые носители Р+Д), то у них РАВНОВЕРОЯТНО появится либо РР, либо 2*РД, либо ДД.
В вашей же модели, вероятность родиться РР ниже, чем в естественной среде!
Далее проверка родителей на фитнес означает, что фитнес=вероятность быть родителем из-за приспособленности.
А вот проверка детей на фитнес означает, то проверяется ВЫЖИВАЕМОСТЬ детей до половой зрелости.

Цитировать
Цитата: VutoИгорь, подтвердите ,пожалуйста, у вас алгоритм формируется так?:
1) выбираются случайно 2 особи (без учёта фитнеса)
2) 2) Далее они скрещиваются и проверяется, подходит ли РЕБЁНОК по фитнесу в следующее поколение или нет (вероятностно).
Нет, Vuto, не так. Эти 2 особи случайно отбираются из массива, в который из текущего поколения попали только те особи, которые случайно, но с  учётом фитнеса, допущены до размножения.
Вопрос, что моделируется - выживаемость до половозрелости или вероятность стать родителем.
Вы моделируете первое.

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

Цитата: Vuto от апреля 09, 2011, 22:14:05К сожалению, перемудрили не мы, а вы.
Объясняю почему проверка фитнеса Xn+1 отличается от Xn.
Если есть два родителя (каждые носители Р+Д), то у них РАВНОВЕРОЯТНО появится либо РР, либо 2*РД, либо ДД.
В вашей же модели, вероятность родиться РР ниже, чем в естественной среде!
Если Вы внимательно посмотрите код, то увидите, что у пары родителей с равной вероятностью появляются дети, являющиеся носителями   всех упомянутых  Вами комбинаций аллелей. А вот в массив _obj  ниже по коду с влиянием фитнеса попадают не все дети поколения , а лишь допущенные в дальнейшем до размножения, то есть, будущие родители. То есть, всё, на чём Вы, ужасаясь коду, настаиваете выше, так и происходит уже давно, с самого начала.
Другое дело, что программа не выводит численность родившегося поколения, но она всегда при настройках по умолчанию равна   удвоенному значению числа допущенных родителей. Выводом этой информации программу дополнить несложно, ничего не меняя в самой обработке.