влияние полового отбора (в том числе и "моды") на

Автор sanj, июня 06, 2009, 23:03:06

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

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

Что касается генератора псевдослучайной последовательности, то используется стандартный из библиотеки NET.Framework.
Про него Microsoft пишет:
В основе текущей реализации класса Random лежит алгоритм генерации случайных чисел методом вычитания, предложенный Дональдом Э. Кнутом. Дополнительные сведения см. в книге Д. Э. Кнута. "Искусство программирования, том 2. Получисленные алгоритмы".
В общем-то, легко можно подключить к программе любой другой генератор.

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

Цитата: "Alexy"
Кстати,
а доминантность/рецессивность редкой (=полезной) аллели как-то влияла на скорость его "победы"?
Для рецессивных аллелей можно задать условия, при которых отбор может приостанавливаться на тысячи поколений.
У меня был такой запуск:

Популяция: 10000
Число признаков: 10
Влияние признака %: 1
Доля признака %: 10
Доминантность: False
Потомков: 4

0000 Особей: 10000  Носителей: 10.00% - 1000  Аллелей:  5.00% - 1000
..........................................................................
..........................................................................
6500  Особей: 9994  Носителей:  9.93% - 992  Аллелей:  5.08% - 1016

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

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

Imperor

Игорь, а почему я не могу задать влияние приспособленности - 0% (т.е. нейтральный признак), и посмотреть, что будет (программа сразу же оставливается)?

Роман Джиров

Цитата: "Imperor"Игорь, а почему я не могу задать влияние приспособленности - 0% (т.е. нейтральный признак), и посмотреть, что будет (программа сразу же оставливается)?
Да, не работает, при 0%. А при попытках задать 0,1%, например, вообще виснет, только целые числа. Однако градация признака в 1%- довольно большая, хотелось-бы большей дробности. (Как мёд ,так и ложкой... :oops:  :roll: ) 0%полезности и доли процента нужны все-же ,чтобы посмотреть, как будут отбиратся нейтральные или очень слабополезные мутации при условии, что среднее или сильное положительное воздействие они оказывают только при условии  мультипликативности взаимодействия с другими нейтральными генами. Возможно, дилемма Холдейна справедлива только для такого конкретного случая - когда каждая мутация сама по себе нейтральна или очень(доли процента) слабополезна, а 1-3-5-10% полезности дает только в комбинации с другими?
Игорь, будьте добры, добавьте  возможность задавать 0% полезности мутации, а условие мультипликативности Вы уже ввели, вот и можно будет проверить.

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

Выкладываю вариант  программы с допустимыми дробными и нулевым значениями влияния на приспособленность (дробную часть надо отделять от целой точкой).

Ромашишка1971

Пробовал последний вариант программы с различными условиями.
Скорость мало зависит от числа признаков. Почти все варианты отбирались за 2 - 4 тыс. поколений.
Любопытно, что как я и предполагал, далеко не все признаки могут дожить до конца отбора. Задаешь 20 - остаются 18 и т.п. Однако, можно задать 25 и осталось 21, или задать 30 и осталось 28.

*****

P.S.

Жаль, что сразу в форум не написал, а то получается, что сообщил по факту.

Роман Джиров

Цитата: "Игорь Антонов"Выкладываю вариант  программы с допустимыми дробными и нулевым значениями влияния на приспособленность (дробную часть надо отделять от целой точкой).
О, спасибо, так гораздо лучше стало. Наблюдать дрейф генов при 0% полезности- одно удовольствие, классика жанра.  :)

Теперь относительно нашего Spermophilus или Citellus - некрупного грызуна семейства беличьих, "которого невидно, но он есть"(с) :).
Кажется, я понял, где спрятался этот зверёк из дилеммы Холдейна - в способе вывода отчета в программе. Вы запрограммировали отслеживание одной конкретной аллели из всего массива заданных, и соответственно, когда именно она , конкретная, достигает полной "победы или поражения"- программа прекращает работу. А что там делается с остальными аллелями- нам не видно. Фактически, мы отслеживаем частоту единственного гена, а ему, единственному ,абсолютно "до лампочки" как там дела у остальных, потому и скорость отбора не меняется от того, что он "в компании". Но- дилемма Холдейна не в том, что конкретный ген будет отбиратся в популяции дольше, если он в "компании", а в том ,что вся эта компания генов совокупно будет отбиратся тем дольше ,чем больше членов имеет. Таким образом ,если мы желаем отслеживать отбор всей этой компании генов совокупно, отслеживая в отчете состояние только одной аллели, то в отчет в каждый конкретный момент времени у нас должна попадать та аллель, которая в данный момент находится в абсолютном количественном минимуме по сравнению с всеми остальными аллелями из массива заданных. И если даже одна из всего массива заданных аллелей потерялась- то все, отбор не достиг цели, и неважно при этом, что остальные, например, достигли 95% в популяции- программа должна сыграть "Стоп" и показать результат 0%. Вот если так сделать- то, наверное, тогда и увидим нашего "суслика"- дилемму Холдейна.

Роман Джиров

Цитата: "Alexy"
В принципе по логике формировать приспособленность особи следовало бы так:
Приспособленности не прибавлять (как видимо делалось?), а множить (Ведь взаимодействие генов принимается мультипликативным)
Например:
у владельца 4-х слабовредных аллелей (дающих снижение выживаемости на 10%) выживаемость = 1 - 4*0,1 =  0,6 = 60%.
А должна была бы быть (1- 0,1)(1- 0,1)(1- 0,1)(1- 0,1) = 0,9^4 = 0,6561 = 65,61%
Разница правда небольшая, но она увеличивается с увеличением числа рассматриваемых локусов


А вводить случайность и определять выживших среди потомства наиболее логично так:
Цикл:
Перенумеровать все текущие особи потомства.
Создать двухмерный массив {<номер особи>, <сумма приспособленностей (в % или десятых или ещё более мелких долей %-ов, в зависимости от выбранной точности) её и всех предыдущих особей>}
Случайным (по второй переменной массива) образом выбрать 1 элемент из этого массива.
Конец цикла. (Повторить без отбракованной особи, пока не отбракуется нужное число особей)
Склоняюсь к тому ,что вы правы, однако на то, что мы пока "не видим" дилемму Холдейна в результатах работы программы это вряд-ли влияет, я не вижу как, во всяком случае. Но вполне может повлиять на попытки "преодолеть" дилемму.
Относительно :"Приспособленности не прибавлять (как видимо делалось?), а множить (Ведь взаимодействие генов принимается мультипликативным)".
Мне кажется логичным ввести в программу возможность задавать отдельно и независимо приспособленность для отдельного гена и для комплекса генов. Например- влияние на приспособленность отдельного гена- 0%, влияние всего комплекса, (если он есть одновременно) - 10%. По мере роста количества одновременно присутствующих генов комплекса- рост совокупной "полезности" в арифметической либо геометрической прогрессии, до достижения заданого "потолка". Если просто перемножать, то сколько 0 на 0 не умножай...
PS. Да, алгоритм отбора который есть и мне оченно не ндравится, вот только никак не пойму чем именно. Чёт такое в голове крутится, наверное глупость какая-то. :D

Alexy

Цитата: "Игорь Антонов"...2.3 Проверяется – произошло ли случайное событие с вероятностью участия особи в размножении (метод Form1.ok()). Если да, текущий экземпляр добавляется к новому массиву особей (_obj), если нет – он отбрасывается. Обработав всех потомков текущей пары переходим на пункт 2.1 до тех пор, пока исходный массив не опустеет....
А как достигается, чтобы в новом поколении особей было столько же, сколько и в предыдущем?

Alexy

Цитата: "Роман Джиров"дилемма Холдейна
НЕ в том, что конкретный ген будет отбиратся в популяции дольше, если он в "компании",
а в том ,что вся эта компания генов совокупно будет отбиратся тем дольше ,чем больше членов имеет.
Таким образом ,если мы желаем отслеживать отбор всей этой компании генов совокупно, отслеживая в отчете состояние только одной аллели, то в отчет ... должна попадать та аллель, которая в данный момент находится в абсолютном количественном минимуме по сравнению с всеми остальными аллелями из массива заданных
Разве?

И всё-таки наверное в программу вкралась какая-то ошибка, приводящая при отборе потомства к
"недооценке" случайного фактора
и/или
"переоценке" различий приспособленностей аллелей.

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

Цитата: "Роман Джиров"Вы запрограммировали отслеживание одной конкретной аллели из всего массива заданных, и соответственно, когда именно она , конкретная, достигает полной "победы или поражения"- программа прекращает работу. А что там делается с остальными аллелями- нам не видно. Фактически, мы отслеживаем частоту единственного гена, а ему, единственному ,абсолютно "до лампочки" как там дела у остальных, потому и скорость отбора не меняется от того, что он "в компании".
В статистическом смысле все эти аллели "побратимы". Наблюдение за несколькими будет давать ту же информацию, что и несколько последовательных запусков с наблюдением над одним. Что касается скорости отбора, то неотображаемые аллели также участвуют в отборе, как и  наблюдаемый,  и на скорость отбора влиять могут.
Цитата: "Роман Джиров"Мне кажется логичным ввести в программу возможность задавать отдельно и независимо приспособленность для отдельного гена и для комплекса генов.
Для моделирования отбора на комплексность в программу в версию 1.05  добавлен флажок "Только комплекс". Если он выбран, то заданный в поле "Влияние признака"  эффект проявляется только при сочетании аллелей в количестве,  заданном в поле "Число признаков".
Цитата: "Alexy"
Цитата: "Игорь Антонов"...2.3 Проверяется – произошло ли случайное событие с вероятностью участия особи в размножении (метод Form1.ok()). Если да, текущий экземпляр добавляется к новому массиву особей (_obj), если нет – он отбрасывается. Обработав всех потомков текущей пары переходим на пункт 2.1 до тех пор, пока исходный массив не опустеет....
А как достигается, чтобы в новом поколении особей было столько же, сколько и в предыдущем?
Вероятность участия в размножении  каждого потомка вычисляется по формуле

вероятность =  нормативный_размер_популяции / текущая_численность / число_потомков_пары * 2 / текущая_средняя_приспособленность_особи

В результате численность автоматически  имеет средний уровень, заданный параметром "размер популяции".

Alexy

Цитата: "Игорь Антонов"Для моделирования отбора на комплексность в программу в версию 1.05  добавлен флажок "Только комплекс". Если он выбран, то заданный в поле "Влияние признака"  эффект проявляется только при сочетании аллелей в количестве,  заданном в поле "Число признаков"
Спасибо.
А "Число признаков" - это, как я понял, число вообще всех рассматриваемых в программе генов?

Если поставить флажок "доминантность аллеля", то все полезные аллели (количество которых = "числу признаков") станут доминантными и будут иметь выбранную "долю признака"?

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

Цитата: "Alexy"А "Число признаков" - это, как я понял, число вообще всех рассматриваемых в программе генов?

Если поставить флажок "доминантность аллеля", то все полезные аллели (количество которых = "числу признаков") станут доминантными и будут иметь выбранную "долю признака"?
Да, сейчас всё так.

Роман Джиров

Цитата: "Игорь Антонов"
Цитата: "Роман Джиров"Вы запрограммировали отслеживание одной конкретной аллели из всего массива заданных, и соответственно, когда именно она , конкретная, достигает полной "победы или поражения"- программа прекращает работу. А что там делается с остальными аллелями- нам не видно. Фактически, мы отслеживаем частоту единственного гена, а ему, единственному ,абсолютно "до лампочки" как там дела у остальных, потому и скорость отбора не меняется от того, что он "в компании".
В статистическом смысле все эти аллели "побратимы". Наблюдение за несколькими будет давать ту же информацию, что и несколько последовательных запусков с наблюдением над одним. Что касается скорости отбора, то неотображаемые аллели также участвуют в отборе, как и  наблюдаемый,  и на скорость отбора влиять могут.
.
А как именно они влияют? Я, например, вижу (это не конкретный случай, а вообще, утрирую, конечно), что можно задать отбор по 10 признакам, и получить 95% за 1000 поколений ,например, и, например, остальные 9 аллелей, отчета по которым нет- имеют, предположим, частоту тоже 95% в популяции. Повторить прогон и получить 95% за 1000 поколений, но с припиской внизу отчета: аллелей=8. Т.е., как я понимаю, в этом случае 2 аллеля вообще вылетели за счет дрейфа генов, а остальные 8 имеют я не знаю какую частоту в популяции, может всего 5 или 10 или вообще 1%. А я записываю результат этого прогона как абсолютно идентичный первому случаю, та-же частота, то-же количество поколений. И провожу, например, прогон с 1 аллелем, получаю 95% на 1000 поколении. И констатирую: с увеличением числа отбираемых признаков время необходимое для отбора не растет. Но! Отобрались ли все признаки из примера где их 10 до частоты 95%? В первом случае- да ,во втором- нет, а отчет практически одинаков ,и если-бы не приписка внизу, что часть признаков вообще вылетела, т.е. их частота=0, то и вообще этого не заметил-бы. А ведь в этом случае отбор признака шел уже не в комплексе из 10 аллелей ,а в комплексе из 8 аллелей ,и когда вылетели 2- мы не знаем ,может вообще в самом начале, из-за дрейфа, а мы записываем результат как результат отбора в среде из 10 аллелей , а он фактически из 8. Может в этом дело и поэтому мы не видим то ,что пытаемся увидеть- увеличение числа поколений , необходимых для отбора аллеля в комплексе аллелей? А если вести учет по аллелю, который имеет минимальную частоту в популяции , в текущий момент, то , думаю, и увидим эффект необходимости увеличения числа поколений для отбора при увеличении числа отбираемых признаков.