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

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

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

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

Цитата: Макроассемблер от апреля 06, 2011, 18:09:36То есть если попадается особь с достаточно высоким фитнесом, то она переходит к размножению независимо от того какое значение выбросит NextDouble(), в реальности же любое удачное сочетание генов может погибнуть - конечно, с разной вероятностью.
При исходных настройках "неуязвимыми" оказываются только те особи, у которых отклонение фитнеса от стандартного будет +100%. Можно ввести правило, блокирующее такую возможность ещё на этапе ввода исходных параметров. В реальных прогонах это ограничение и так не нарушается.
Цитата: Макроассемблер от апреля 06, 2011, 18:09:36Немного замечаний по коду...
Проект небольшой, выложен с полным исходным текстом и комментариями. Я разрешаю всем заинтересованным лицам неограниченно его совершенствовать самостоятельно.  Или предложить свой.

Imperor

Цитата: Игорь Антонов от апреля 06, 2011, 14:51:33
Вот вариант программы с отключенной нормировкой по численности.
А что так тормозит то? :(
Тестировать невозможно. Прежние варианты гораздо быстрее были.

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

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

Alexy

Цитата: Vuto от апреля 06, 2011, 10:07:48Всё тоже самое касается и отрицательного бонуса.
Обычным особям незаслуженно увеличивают вероятность стать родителем, а доминантным - незаслуженно уменьшают вероятность
Вряд ли от этого результат меняется очень сильно
Цитата: Vuto от апреля 06, 2011, 10:07:48Поэтому нельзя для корректности нормировать в каждое поколение по разному

Необходимо для всех поколений делать один коэффициент
Вы можете изменить программу и проверить?
А мой подход тоже неверен?

Вводить случайность и определять выживших среди потомства по-моему нужно так:
Цикл:
Перенумеровать все особи потомства.
Случайным образом выбрать число из интервала [0, сумма приспособленностей всех особей потомства]
Отобрать особь, для которой сумма приспособленностей ЕЁ и всех предыдущих по нумерации особей, больше этого числа, и при этом сумма приспособленностей всех предыдущих по нумерации особей меньше-равна этого числа
Удалить отобранную особь из множества всех особей потомства
Конец цикла. (Повторять цикл, пока не отберется нужное число особей, равное численности популяции, которая таким образом сохраняется в каждом поколении одной и той же)

Vuto

Цитата: Alexy от апреля 07, 2011, 01:16:19А мой подход тоже неверен?
Отбраковать особь с суммой приспособленностей её и всех предыдущих по нумерации особей, равной этому числу
Конец цикла. (Повторить без отбракованной особи, пока не останется нужное число особей, равное численности популяции, которая таким образом сохраняется в каждом поколении одной и той же)
К сожалению в вашем подходе не работает статистическая математика  :(

Vuto

Цитата: Игорь Антонов от апреля 06, 2011, 13:37:54Vuto, нормирующий коэффициент выполняет в этой модели роль общей отрицательной обратной связи, стабилизирующей численность популяции. Его отменить несложно, но тогда отрицательные бонусы будут приводить к вымиранию, а положительные - к неограниченному росту.
В принципе так и должно быть.
Спасибо за изменения.
Что я вижу, необходимо сделать.
1) Я не совсем доверяю генератору случайных чисел (даже для лоскутов с 0% бонусом идёт увеличение численности)
Поэтому прошу вас заменить (для гарантии):
                        child.g.locus[i].a = (Form1.rand() < 0.5) ? o1.g.locus[i].a : o1.g.locus[i].b; // С равной вероятностью наследуем ген хромосомы "a" или "в" от одного из родителей
                        child.g.locus[i].b = (Form1.rand() < 0.5) ? o2.g.locus[i].a : o2.g.locus[i].b; // С равной вероятностью наследуем ген хромосомы "a" или "в" от одного из родителей

на либо (изменяем знак больше, а не меньше)                         child.g.locus[i].a = (Form1.rand() < 0.5) ? o1.g.locus[i].a : o1.g.locus[i].b;
                        child.g.locus[i].b = (Form1.rand() > 0.5) ? o2.g.locus[i].a : o2.g.locus[i].b;

либо (изменяем А на Б для Б-дитя)                        child.g.locus[i].a = (Form1.rand() < 0.5) ? o1.g.locus[i].a : o1.g.locus[i].b;
                        child.g.locus[i].b = (Form1.rand() < 0.5) ? o2.g.locus[i].b : o2.g.locus[i].a;


2) Общая нормировка не учитывает бонус.
                    if (Form1.ok(fitness * 2.0 / total_children)) _obj.Add(child); // Формируем список, допущенных до размножениялучше заменить на нечто вроде
                    if (Form1.ok(fitness * 2.0 *(1 + good_alleles_fitness/100) / total_children)) _obj.Add(child);


3) Остальное, вроде верно. Быстрый рост аллеля вызван острой конкуренцией (для большого кол-ва детей)
Например, для бонуса в 1% для двоих детей почти никак не растёт этот аллель. Тут нет конкуренции. Все допущены до воспроизводства
Однако, для этого же бонуса в 1% для 4х детей, за 300 поколений, аллель захватывает более половины популяции. А тут лишь 1/8 популяции допущена до производства. Крайне высокая конкуренция.
Поэтому я предлагаю исправить ситуацию так, что бы не пара давала Х детей, а пара давала НЕ БОЛЕЕ Х детей. То есть ввести в индивидуй параметр, указывающий на количество детей.

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

Vuto
1) "Я не совсем доверяю генератору случайных чисел"
Знак недолго поменять, но я проверил поочерёдные запуски с 0%  - численность то растёт, то падает.
2) "Общая нормировка не учитывает бонус".
Предложенный код приводит к форсированному росту или снижению численности. Если всё-таки адаптивная нормировка нужна, то я считаю, что в исходном варианте программы она достаточно разумна.

P.S. Располагая Visual Studio 2008 или 2010 легко поэкспериментировать с моделью самостоятельно.  Да и 2005 подойдёт, только проект надо будет создать заново. Я выше уже отметил, что на неприкосновенности своего кода я вовсе не настаиваю.

Alexy

Цитата: Vuto от апреля 07, 2011, 09:59:28К сожалению в вашем подходе не работает статистическая математика  :(
Я там неверно написал, а сейчас отредактировал свой подход
Фактически проводится отбор одной особи из всего множества новорожденных особей,
при этом вероятность отбора каждой особи пропорциональна ее фитнесу (приспособленности)
После отбраковки отбор ещё одной особи опять повторяется среди оставшихся особей
(и так до тех пор, пока не отберется определенная  численность популяции - таким образом она будет постоянной для всех поколений)

Если не ошибаюся, от реализации уважаемого Игоря Антонова это отличается тем, что он СРАЗУ отбирает всех выживших особей
(при этом вероятность отбора каждой особи пропорциональна ее фитнесу),
и поэтому количества особей в разных поколениях колеблятся
вокруг определенной константы, а не строго равны ей

Оба подхода по идее ближе к реальности, чем неограниченно
наростающая от поколения к поколению численность популяции?


Но можно было бы сделать аллели НЕКОТОРЫХ генов
независимо ни от чего обязатттэльно летальными (так бывает в природе),
а для ОСТАЛЬНЫХ генов оставить их вклад в вероятность выживания особи
ОБРАТНО-ПРОПОРЦИОНАЛЬНЫМ среднему фитнесу по популяции

(как было запроограммировано Игорем Антоновым для ВСЕХ генов)

В результате у нас размер популяции не будет вылезать
за определенную верхнюю границу, а будет изменяться в пределах от нее до 0

Imperor

Цитата: Игорь Антонов от апреля 06, 2011, 21:38:18
Если тормозит, значит, размер популяции быстро увеличивается при росте приспособленности  в отсутствие сдерживающего  фактора, действовавшего в исходной версии. Но я ведь предупреждал.
Но это ведь неправильно. Ресурсы среды ограничены. Популяция не будет расти безгранично. Зачем нам неправильная модель?

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

Цитата: Imperor от апреля 07, 2011, 13:04:41Зачем нам неправильная модель?
Меня попросили отключить нормировку - я отключил. Но  я не утверждаю, что это  правильная модель.

Imperor

Цитата: Макроассемблер от апреля 05, 2011, 18:16:59
а чего так у вас мнение поменялось на противоположное... это не подначка, просто интересно
http://www.paleo.ru/forum/index.php/topic,2350.msg52210.html#msg52210
Просто подумал, подумал, и полностью переменил мнение.
Так у меня иногда бывает :)
Понятно, что основную роль здесь сыграло поведение разбираемой модели.
Но не только это. Дело в том, что я раньше так и думал (что от числа признаков скорость отбираемости не зависит - просто рассуждал логически, да еще и с рисунками :) ).
Но авторитет математического моделирования (в лице самого Холдейна и тех кто его проверял, не находя ошибок) меня убедили в их правоте. Убедили давно и надежно.
Вот, смотрите, что я там писал в той ветке:

...Но у меня пока больше доверия к математическим расчетам, выдержавшим 50-летнюю проверку специалистов в данной области

...И вот опять Ромашишка1971 мудро отмечает :lol: это же обстоятельство - "потеря особи 18 заменила 18 отдельных потерь особей"... Ну всё! Теперь сразу всем всё стало ясно! Глупый научный мир 50 лет подряд (лучшие математики в биологии), никак не могли увидеть, что 18 выбитых аллелей в одной погибшей особи - это лучше, чем 18 выбитых аллелей в 18 погибших особях... а многомудрый Ромашишка1971 взял, да и увидел! И теперь, после того, как Ромашишка1971 авторитетно указал на это чрезвычайно трудно уловимое  :lol: обстоятельство, ошибочность дилеммы Холдейна сразу стала очевидна всем!  :lol:
Ромашишка1971 - открываю Вам СТРАШНУЮ ТАЙНУ - расчеты Холдейна именно это и считают! Т.е. они считают, через сколько поколений произойдет замена аллелей в популяции, если аллели будут вылетать: по одному, парами, тройками, четверками... и вообще всеми возможными случаями. Собственно, расчеты Холдейна именно это собой и представляют.
А Вы говорите абсолютно банальные вещи (например, что с гибелью особи с 18 минусами вылетают сразу все эти 18 минусов (кто бы спорил  :lol:)) и искренне думаете, что этого никто, кроме Вас не понимает  :lol:


Как видите, беззаветная вера в мудрость математиков :) Я даже представить себе не мог, что они действительно могли не посчитать такие очевидные вещи.

Imperor

Цитата: Игорь Антонов от апреля 07, 2011, 13:14:58
Меня попросили отключить нормировку - я отключил. Но  я не утверждаю, что это  правильная модель.
Ну мало ли кто что попросит.
Хотя да, иногда лучше просто молча продемонстрировать.

Игорь, а Вы не думали над тем, чтобы помоделировать ещё что-нибудь? :)
Например, всю совокупность мутационно - естественно-отборных процессов?
А то вот у этих авторов в их модели вроде вообще деградация геномов в итоге получается вместо совершенствования: http://mendelsaccountant.info/
(там соответствующая статья в pdf открывается по ссылке внизу, в списке литературы).

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

Цитата: Imperor от апреля 07, 2011, 13:27:02Игорь, а Вы не думали над тем, чтобы помоделировать ещё что-нибудь? :)
Например, всю совокупность мутационно - естественно-отборных процессов?
Илья, для занятий в этом направлении  более сложными моделями у меня сейчас нет достаточного  времени и интереса. 

Alexy

Уважаемый Игорь, а чего?
Модель - статья, ... любая маленькая модификация модели - опиать статья ...?
ЦитироватьМеня попросили отключить нормировку, но я не утверждаю, что это  правильная модель
Каждая модель наверное в чем-то неправильна (имеет свои + и -)
Моделя с отключ нормировкой - не соответствует большинству природных ситуаций
Зато со включенной (если я правильно понял уважаемого Vuto, в чем сильно неуверен)
- вероятности отбора особей (одного покололения) не строго пропорциональны их фитнесам

Imperor

Имхо, модель Игоря Антонова полностью адекватна. Я её уже погонял предостаточно. И не только я. Выводы:

1. Эффект естественного отбора при приспособленности аллелей, отличной от нуля, модель показывает замечательно.
2. Дрейф генов модель тоже отлично демонстрирует, совершенно адекватно (в модели дрейф тем сильней, чем меньше популяция).
3. "Эффект Нортона" для доминантных аллелей тоже наглядно демонстрируется (резкое замедление элиминации вредных рецессивных аллелей на завершающих этапах отбора, причем это замедление тоже зависит от размера популяции (силы дрейфа)).
4. Предсказывавшуюся расчетами долгую скрытую начальную фазу для полезных рецессивных аллелей (зато без последующего "нортоновского замедления") модель тоже демонстрирует.

Короче, всё ок.
Единственное, что не демонстрирует аллель, так это реальности дилеммы Холдейна :)

P.s. Кстати, объяснять студентам эффекты естественного отбора и дрейфа генов с ней гораздо легче и наглядней.
Все-таки, Игорь, Вы бы хоть ради приличия хотя бы коротенькую статью? А то даже сослаться не на что.

P.p.s. Единственно, у меня почему-то так и не работают дробные значения приспособленности (т.е. меньше, чем 1%) и в некоторых случаях желательно было бы, чтобы первичная доля особей тоже была менее 1%.