Иисус отверг Тему - выводы из эволюционной модели [entries|archive|friends|userinfo]
Шансонье Дима Даннер

[ website | Полин Квітне ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

выводы из эволюционной модели [Feb. 26th, 2007|11:26 am]
Previous Entry Add to Memories Tell A Friend Next Entry
LinkLeave a comment

Comments:
From:[info]blackheartsaur.livejournal.com
Date:March 1st, 2007 - 01:54 pm

В качестве извинений за отобранное время

(Link)
Прстая Java-версия того же кода, без GUI и записи статистики (все результаты валят в консоль), но это можно прикрутить при потребности.
Кстати кажется результаты не репродюсаются.

(В коде в комментах куски оригинального кода и это все выглядит жутко здесь, но в Эклипсе при подсветке синтаксиса читаемость нормальная)

import java.util.Random;

/*
10 REM Модель генетической эволюции - одномерный клеточный автомат GEMOCA
15 REM Дима Даннер, 2007
*/

public class GEM {
	public static void main(String[] args) {
		/*
		 * 20 REM объявление и установка параметров (см.описание модели)
		 * 22 coevol=0.02: REM коэффициент эволюции
		 * 25 cell=0: REM текущая клетка
		 * 30 color=0: colors=1: REM параметры текущего цвета и сложности программы
		 * 40 noise=0.1: REM физическая вероятность ошибки
		 * 50 cycle=0: REM счетчик циклов
		 * 60 repro=0: REM счетчик успешных воспроизведений
		 * 71 error=0: REM флаг ошибки
		 * 80 corepro=0: REM коэффициент воспроизведения
		 * 85 REM здесь обявляются массивы для сбора статистики
		 */
		double cEvol=0.02; // DD: коэффициент эволюции SR: что бы это могло означать?..
		int color=0; // DD: параметры текущего цвета SR: какие такие параметры? это текущий цвет, 
		// (или его идентификатор - как хотите), но никакие не параметры 
		int nColors=1; // DD: и сложности программы
		double cNoise=0.1; // DD: физическая вероятность ошибки SR: занятный термин "физическая вероятность"
		int nCycle; // DD: счетчик циклов
		int nSucRep=0; // DD: счетчик успешных воспроизведений
		// boolean fError=false; // DD: флаг ошибки
		double cRepro=0; // DD: коэффициент воспроизведения
		
		double eLif=0.5; // SR: требуемый порог выживаемости
		int tnCycle=4000000; // SR: Количество циклов, которое нужно выполнить
		Random rnd=new Random();

//		int colored[]=new int[tnCycle]; // SR: Массив сгенерированных значений "цвета"
//		int numcols[]=new int[tnCycle]; // SR: Кол-во цветов (слоэность)
//		double ssrates[]=new double[tnCycle]; // SR: % успешных "репликаций"
		
		for(nCycle=0;nCycle
[Error: Irreparable invalid markup ('<tncycle;ncycle++)>') in entry. Owner must fix manually. Raw contents below.]

Прстая Java-версия того же кода, без GUI и записи статистики (все результаты валят в консоль), но это можно прикрутить при потребности.
Кстати кажется результаты не репродюсаются.

(В коде в комментах куски оригинального кода и это все выглядит жутко здесь, но в Эклипсе при подсветке синтаксиса читаемость нормальная)

<pre>
import java.util.Random;

/*
10 REM Модель генетической эволюции - одномерный клеточный автомат GEMOCA
15 REM Дима Даннер, 2007
*/

public class GEM {
public static void main(String[] args) {
/*
* 20 REM объявление и установка параметров (см.описание модели)
* 22 coevol=0.02: REM коэффициент эволюции
* 25 cell=0: REM текущая клетка
* 30 color=0: colors=1: REM параметры текущего цвета и сложности программы
* 40 noise=0.1: REM физическая вероятность ошибки
* 50 cycle=0: REM счетчик циклов
* 60 repro=0: REM счетчик успешных воспроизведений
* 71 error=0: REM флаг ошибки
* 80 corepro=0: REM коэффициент воспроизведения
* 85 REM здесь обявляются массивы для сбора статистики
*/
double cEvol=0.02; // DD: коэффициент эволюции SR: что бы это могло означать?..
int color=0; // DD: параметры текущего цвета SR: какие такие параметры? это текущий цвет,
// (или его идентификатор - как хотите), но никакие не параметры
int nColors=1; // DD: и сложности программы
double cNoise=0.1; // DD: физическая вероятность ошибки SR: занятный термин "физическая вероятность"
int nCycle; // DD: счетчик циклов
int nSucRep=0; // DD: счетчик успешных воспроизведений
// boolean fError=false; // DD: флаг ошибки
double cRepro=0; // DD: коэффициент воспроизведения

double eLif=0.5; // SR: требуемый порог выживаемости
int tnCycle=4000000; // SR: Количество циклов, которое нужно выполнить
Random rnd=new Random();

// int colored[]=new int[tnCycle]; // SR: Массив сгенерированных значений "цвета"
// int numcols[]=new int[tnCycle]; // SR: Кол-во цветов (слоэность)
// double ssrates[]=new double[tnCycle]; // SR: % успешных "репликаций"

for(nCycle=0;nCycle<tnCycle;nCycle++)
{
/*
* 90 REM ** ГЛАВНЫЙ ЦИКЛ **
* 95 REM ВОСПРОИЗВЕДЕНИЕ
* 100 cycle=cycle+1
* 110 color=color+1: IF color>colors THEN color=1: error=0: REM следующий цвет
* 120 x=RND: IF x<noise THEN error=1: REM ошибка с вероятностью noise
* 130 cell=color: IF error=1 THEN cell=INT (RND*colors)+1: color=cell
* 140 IF color=colors AND error=0 THEN repro=repro+1: REM успешное воспроизведение
* 146 LET corepro=repro/cycle: REM подсчет коэффициента воспроизведения

* 147 REM МУТАЦИЯ (см. описание модели)
* 150 LET x=RND: REM проверка условия усложнения программы
* 160 IF x<coevol/4 AND corepro>0.5 THEN colors=colors+1: REM усложнение программы
* 170 IF corepro<0.5-(colors-1)*coevol THEN colors=colors-1: REM упрощение программы - отбор
* 180 IF colors=0 THEN colors=1

* 185 REM ** КОНЕЦ ГЛАВНОГО ЦИКЛА **
*
*/

if(++color>nColors)
{
color=1; // SR: почему не color=0 ?
// fError=false;
}

if(rnd.nextDouble()<cNoise) // if(fError)
{
color=(int)rnd.nextDouble()*nColors;
// fError=true;
// System.out.println("Colors = "+nColors+"; Generated: "+colored[nCycle]);
} else if(color==nColors)
{
nSucRep++;
}
// colored[nCycle]=color;
// SR: Мы записываем в colored значения, которые никогда не читаем

cRepro=((double)nSucRep)/(nCycle+1);

if(rnd.nextDouble()<(cEvol/4) // SR: почему cEvol/4 ?
&& cRepro>eLif) nColors++;

if(cRepro<eLif-(nColors-1)*cEvol && nColors>1) nColors--;

</pre>
*cut due to char count limit for commetn*
From:[info]blackheartsaur.livejournal.com
Date:March 1st, 2007 - 01:55 pm

Re: В качестве извинений за отобранное время

(Link)
*continuation*
			/*
			 * 186 REM ВЫХОДЫ ИЗ ГЛАВНОГО ЦИКЛА 
			 * 190 IF cycle/20000<>INT (cycle/20000) THEN GO TO 90: REM дискретизация для сбора статистики
			 * 195 REM после этой строки идет сбор статистики, показ промежуточного состояния,
			 * 196 REM изменение вероятности ошибки итд
			 * 500 IF cycle<4000000 THEN GO TO 90: REM выход из главного цикла, в данном случае 4 млн. попыток
			 * 501 REM КОНЕЦ РАСЧЕТОВ
			 * 
			 * 510 REM здесь идет подсчет окончательной статистики, ее показ и сохранение
			 * 520 REM КОНЕЦ ПРОГРАММЫ
			 */

			if(nCycle%20000==0) // SR: Здесь "сбор статистики, показ   
			// промежуточного состояния, изменение вероятности ошибки итд"
			{ 
				System.out.println("cycle "+nCycle);
				System.out.println("Colors (complexity): "+nColors);
				System.out.println("Rep. coef: "+cRepro);
//				System.out.println("Noise coef: "+(1-cRepro));
			}
			
		}
	}
}
[User Picture]
From:[info]dmitry_danner
Date:March 1st, 2007 - 02:37 pm

Re: В качестве извинений за отобранное время

(Link)
ОГРОМНОЕ спасибо! Буду разбираться.
Маленькое уточнение :
System.out.println("Noise coef: "+(1-cRepro));
тут бы надо бы выводить cNoise (если мы во время теста каким-либо образом его меняем, а так он просто константа)? Сорри, я явы вообще не знаю, наощупь ориентируюсь...
А сколько времени занимает прогон 4 млн. циклов?

PS. По поводу результатов мне кажется, что по консольному выводу сложности и воспроизводимости (это восемь миллионов значений), сложно сказать, репродюсируются результаты или нет. ;)))

Еще раз СПАСИБО!
From:[info]blackheartsaur.livejournal.com
Date:March 2nd, 2007 - 11:23 am

Re: В качестве извинений за отобранное время

(Link)
Огромное незачто ибо без гуя (GUI) выглядит все это не очень.
На выходных если будет время может прикручу.
Ява сама по себе не сильно хитра (там основные "завороты" с технологиями а не с самим языком (технологии в смысле напр. Swing на котором GUI пишется и т.п.)), могу книжками на родном языке поделится если хочеш.

> System.out.println("Noise coef: "+(1-cRepro));
> тут бы надо бы выводить cNoise

Насчет коэфНойза это вроде как ЧислоНеудачныхРепл./ЧислоВсехРепл., уг? А коефРепр. это ЧислоУдачныхРепл./ЧислоВсехРепл. Очевидно, что ЧислоНеудачныхРепл = (ЧислоВсехРепл - ЧислоУдачныхРепл). Отсюда коефНойз = ЧНР/ЧВР = (ЧВР-ЧУР)/ЧВР = 1 - ЧУР/ЧВР = 1 - коефРепр
Такчто (1 - cRepro) это вроде как cNoise. Уг?

> по консольному выводу ... сложно сказать
Ну... да (-:
[User Picture]
From:[info]dmitry_danner
Date:March 2nd, 2007 - 01:26 pm

прога

(Link)
>могу книжками на родном языке поделится если хочеш.
Если можно, да, пожалуйста... компьютерная грамотность в последнее время наболевшая тема :)

>Такчто (1 - cRepro) это вроде как cNoise. Уг?
нне совсем... точнее, наоборот (cNoise константа) и только при единичной сложности программы. Удачной-неудачной считается не одна реплика (появление клетки), а их цепочка.

>4 000 000 циклов проходит... почти незаметно (-:
Ндя :) это как дэйзиуорлд на яве прогоняется за секунд десять, даже не успеваешь насладиться зрелищем :)
From:[info]blackheartsaur.livejournal.com
Date:March 2nd, 2007 - 05:58 pm

Re: прога

(Link)
> Если можно, да, пожалуйста
http://uic.rsu.ru/doc/programming/java/TIJ2e.ru/

> Удачной-неудачной считается не одна реплика (появление клетки), а их цепочка.
А, да, точно.
From:[info]blackheartsaur.livejournal.com
Date:March 2nd, 2007 - 11:24 am

Re: В качестве извинений за отобранное время

(Link)
P.S. У меня на работе (проц P4, 512MB оперативки) 4 000 000 циклов проходит... почти незаметно (-: