Программирование - это просто
Advertisement
Главная arrow Уроки программирования arrow Виртуальная биржа. Битва роботов arrow Проект "Битва роботов". Шаг 6. Черновик первого робота и возникновения жизни на Земле.
16.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Проект "Битва роботов". Шаг 6. Черновик первого робота и возникновения жизни на Земле. Печать E-mail
Автор megabax   
10.02.2014 г.
Структура программы на примере простейшей программы

Проект "Битва роботов". Шаг 6. Черновик первого робота и возникновения жизни на Земле.

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

И так, давным давно, около четырех миллиардов лет назад  на Земле была голая земля и лужи (а может быть и реки с океанами), состоящими из так называемого первичного бульона. Что представлял собой этот первичный бульон? Это обычная вода, в которой растворены органические соединения: аминокислоты (строительные кирпичики для белков), жиры и прочие молекулы. Прямо как реальный супчик, только несъедобный. Откуда все это взялось? Типа, само образовалось. Так это или нет, не суть важно, не будем спорить с умными учеными, тем более, они проверили эксперимент, который доказал, что это вполне реально.  Главное, что было дальше. А дальше каким то волшебным образом в этом первичном бульоне появились коацерватные капли - некие уплотнения, окруженные слоем специфических молекул, который защищал их от распада. Кстати, мыльные пузыри - тоже своего рода коацерватные капли, только большие. Эти коацерватные капли могли адсорбировать из окружающей среды разные вещества и увеличиваться в размерах. А потом, когда становились ну очень большими, коацерватные капли распадались на более мелкие. Так типа зародились первые одноклеточные.

Первыми живыми существами были археи и цианобактерии - примитивнейшие микроорганизмы, которые не имели даже ядра (ядро - это такая штука, где храниться ДНК) и мембранных органелл (органеллы - это типа  "внутренние органы" живой клетки, а мембранные - значит, имеют мембрану, такую как бы оболочку). Потому появились так называемые эукариоты - живые клетки, которые имеют ядра. Все это происходило около 2-3 миллиардов лет тому назад. И только 1700 миллионов лет назад появились первые многоклеточные. Многоклеточные сначала тоже были примитивными: простые водоросли, разные моллюски.  Чуть позже появились и другие виды беспозвоночных, в частности, насекомые.

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

Примерно такой же сценарий будет и для робота. От экспериментальных примитивов до супертрейдера. Единственная разница - эволюция в природе  шла сама по себе. И она происходила миллиарды лет. У меня нет столько времени, поэтому придется идти немножко другим путем: активно вмешиваться в ход развития своих творений, а не пускать все на самотек, как это было с развитием жизни на Земле.

Первый ГА-робот, которого я запрограммировал, получил название "Coacervate-1". Он состоит из четырех слове атомов: первый слой сенсоры, второй и третьих нейроны, которые обрабатывают информацию от сенсора и передают ее в четвертому слою - атомы торгового привода.  Весовые коэффициенты нейронов инициализированы случайными числами:

        public void  init_am(AtomsManager am)

        {

 

            //Создадим привод выставлния заявки на покупку

            Drive drive = new Drive(5);

            drive.type = GeneticsCodes.drive_code_buy;

            am.drives.Add(drive);

 

            //Создадим привод вытавления заявки на продажу

            drive = new Drive(5);

            drive.type = GeneticsCodes.drive_code_sell;

            am.drives.Add(drive);

 

            //Создадим выходной слой (там две группы нейронов, одина регулирует покупку, другая продажу)

            Layer layer1 = new Layer();

            Neuron neuron = new Neuron(); //нейрон активации покупки

            neuron.type = GeneticsCodes.input_atom_code_simple_neuron;

            neuron.init(2);

            neuron.outputs.Add(new AtomLink(am.drives[0], 0));

            layer1.atoms.Add(neuron);

            neuron = new Neuron(); //нейрон цены покупки

            neuron.type = GeneticsCodes.input_atom_code_simple_neuron;

            neuron.init(2);

            neuron.outputs.Add(new AtomLink(am.drives[0], 1));

            layer1.atoms.Add(neuron);

            neuron = new Neuron(); //нейрон активации продажи

            neuron.type = GeneticsCodes.input_atom_code_simple_neuron;

            neuron.init(2);

            neuron.outputs.Add(new AtomLink(am.drives[1], 0));

            layer1.atoms.Add(neuron);

            neuron = new Neuron(); //нейрон цены продажи

            neuron.type = GeneticsCodes.input_atom_code_simple_neuron;

            neuron.init(2);

            neuron.outputs.Add(new AtomLink(am.drives[1], 1));

            layer1.atoms.Add(neuron);

            //создадим атомы для задания статических параметров

            StaticAtom atom = new StaticAtom(1);

            atom.outputs.Add(new AtomLink(am.drives[0], 2)); //задано количество для покупки

            atom.outputs.Add(new AtomLink(am.drives[1], 2)); //задано количество для продажи

            layer1.atoms.Add(atom);

            atom = new StaticAtom(0);

            atom.outputs.Add(new AtomLink(am.drives[0], 3)); //задано номер инструмента для покупки

            atom.outputs.Add(new AtomLink(am.drives[1], 3)); //задано номер инструмента для продажи

            layer1.atoms.Add(atom);

            atom = new StaticAtom(10);

            atom.outputs.Add(new AtomLink(am.drives[0], 4)); //задано срок действия заявки в сек для покупки

            atom.outputs.Add(new AtomLink(am.drives[1], 4)); //задано срок действия заявки в сек для продажи

            layer1.atoms.Add(atom);

 

            //Создадим входной слой (там два нейрона, для анализа котировок и направлений)

            Layer layer2 = new Layer();

            neuron = new Neuron(); //нейрон анализа направления

            neuron.type = GeneticsCodes.input_atom_code_simple_neuron;

            neuron.init(30);

            neuron.outputs.Add(new AtomLink(layer1.atoms[0], 0));

            neuron.outputs.Add(new AtomLink(layer1.atoms[1], 0));

            neuron.outputs.Add(new AtomLink(layer1.atoms[2], 0));

            neuron.outputs.Add(new AtomLink(layer1.atoms[3], 0));

            layer2.atoms.Add(neuron);

            neuron = new Neuron(); //нейрон анализа котировок

            neuron.type = GeneticsCodes.input_atom_code_simple_neuron;

            neuron.init(30);

            neuron.outputs.Add(new AtomLink(layer1.atoms[0], 1));

            neuron.outputs.Add(new AtomLink(layer1.atoms[1], 1));

            neuron.outputs.Add(new AtomLink(layer1.atoms[2], 1));

            neuron.outputs.Add(new AtomLink(layer1.atoms[3], 1));

            layer2.atoms.Add(neuron);

 

            am.layers.Add(layer2);

            am.layers.Add(layer1);

 

            //Создаем сенсоры

            for (int i = 0; i < 30; i++)

            {

                DriveSensor sensor = new DriveSensor();

                sensor.type = GeneticsCodes.sensor_code_orderbook_price;

                sensor.index = i;

                sensor.item = 0;

                sensor.outputs.Add(new AtomLink(am.layers[0].atoms[0],i));

                am.sensors.Add(sensor);

 

                sensor = new DriveSensor();

                sensor.type = GeneticsCodes.sensor_code_orderbook_direction;

                sensor.index = i;

                sensor.item = 0;

                sensor.outputs.Add(new AtomLink(am.layers[0].atoms[1], i));

                am.sensors.Add(sensor);

            }

 

       

        }

К сожалению, ни одной заявки этот робот не выставил. Тогда я посмотрел, а что у него на выходе нейронов, которые соединены с торговым приводом:

Проект "Битва роботов". Шаг 6

Проект "Битва роботов". Шаг 6

Как видно, в перовом случае, числа на выходе активации отрицательные. Для активации они должны быть больше или равно 0.5 (это уровень активации). Во втором случае сигналы активации больше уровня активации, но цены получаются отрицательные, так что торговля тоже невозможна.

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

Последнее обновление ( 10.02.2014 г. )
 
Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги