| Comments: |
| | В качестве извинений за отобранное время | (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*
| | 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]](http://lj.rossia.org/userpic/189175/815) | | | Re: В качестве извинений за отобранное время | (Link) |
|
ОГРОМНОЕ спасибо! Буду разбираться. Маленькое уточнение : System.out.println("Noise coef: "+(1-cRepro)); тут бы надо бы выводить cNoise (если мы во время теста каким-либо образом его меняем, а так он просто константа)? Сорри, я явы вообще не знаю, наощупь ориентируюсь... А сколько времени занимает прогон 4 млн. циклов?
PS. По поводу результатов мне кажется, что по консольному выводу сложности и воспроизводимости (это восемь миллионов значений), сложно сказать, репродюсируются результаты или нет. ;)))
Еще раз СПАСИБО!
| | Re: В качестве извинений за отобранное время | (Link) |
|
Огромное незачто ибо без гуя (GUI) выглядит все это не очень. На выходных если будет время может прикручу. Ява сама по себе не сильно хитра (там основные "завороты" с технологиями а не с самим языком (технологии в смысле напр. Swing на котором GUI пишется и т.п.)), могу книжками на родном языке поделится если хочеш.
> System.out.println("Noise coef: "+(1-cRepro)); > тут бы надо бы выводить cNoise
Насчет коэфНойза это вроде как ЧислоНеудачныхРепл./ЧислоВсехРепл., уг? А коефРепр. это ЧислоУдачныхРепл./ЧислоВсехРепл. Очевидно, что ЧислоНеудачныхРепл = (ЧислоВсехРепл - ЧислоУдачныхРепл). Отсюда коефНойз = ЧНР/ЧВР = (ЧВР-ЧУР)/ЧВР = 1 - ЧУР/ЧВР = 1 - коефРепр Такчто (1 - cRepro) это вроде как cNoise. Уг?
> по консольному выводу ... сложно сказать Ну... да (-:
>могу книжками на родном языке поделится если хочеш. Если можно, да, пожалуйста... компьютерная грамотность в последнее время наболевшая тема :) >Такчто (1 - cRepro) это вроде как cNoise. Уг? нне совсем... точнее, наоборот (cNoise константа) и только при единичной сложности программы. Удачной-неудачной считается не одна реплика (появление клетки), а их цепочка. >4 000 000 циклов проходит... почти незаметно (-: Ндя :) это как дэйзиуорлд на яве прогоняется за секунд десять, даже не успеваешь насладиться зрелищем :)
| | Re: В качестве извинений за отобранное время | (Link) |
|
P.S. У меня на работе (проц P4, 512MB оперативки) 4 000 000 циклов проходит... почти незаметно (-: | |