Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2012, 10:46   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию Генетический алгоритм верно или неверно реализовал?

Стоит задача: реализовать генетический алгоритм для максимизации/минимизации функции. Пару дней посидел поразбирался с теорией, написал код, но как-то немного боязно: вдруг не так понял теоретические сведения.
Не нравится в этом алгоритме то, что значения могут получаться всякий раз разные (хотя там широко используются методы из разряда Random, но все же)
Реализовал указанную задачу в виде консольного приложения под MonoDevelop/Gtk#/Linux, исходники с которым прикладываю к посту. Ни могли бы глянуть и сказать верно реализовано или нет?
Если кому-то позже понадобиться указанный код, но под Windows, можете удалить из него модули Gtk#, добавить .NET Framework и все.
Вложения
Тип файла: zip arc.zip (13.6 Кб, 35 просмотров)
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 24.12.2012, 11:19   #2
Tayfun
Форумчанин
 
Аватар для Tayfun
 
Регистрация: 24.06.2007
Сообщений: 351
По умолчанию

Добрый день! Реализовывал однажды задачу связанную с генетическими алгоритмами. Решал транспортную задачу. Для теории очень помогла статья из википедии, думаю Вы её читали, там все очень просто описано. Реализовывал по такому порядку как описано там:
1. Начальная популяция
Здесь я находил решение транспортной задачи несколькими способами (Метода "серверо-заподного угла", "наименьшего элементами"). Получались две таблицы с данными, это и была моя начальная популяция.
2. Скрещивание
Здесь мы объединяем решения. В моем случае я брал столбцы из одной таблицы и подставлял во вторую и получал множество таблиц (потомки). Для двух таблиц 2*3 получалось вот так:
Начальные:
0 2 1 | 1 0 2
1 0 3 | 2 1 1
Потомки (если где ошибся не судите строго):
1 2 1 | 0 0 1 | 0 2 2 | 0 0 2 | 1 2 2 | 1 0 1
2 0 3 | 1 1 3 | 1 0 1 | 1 1 1 | 2 0 1 | 2 1 3
3. Выбираем жизнеспособные решения (удовлетворяющие условиям)
4. Из оставшихся жизнеспособных выбираем значение функции для которых минимальное. Берем эти решения и переходим к пункту 1.
Вот такая мини эволюция получалась. Критерием остановки цикла было и количество повторений цикла и временные рамки.
Для мутации можно в момент, когда не оказывается жизнеспособных решений добавлять некоторые изменения (рендомные)
В результате чисто теоретически процесс сводится к оптимальному решению через определенный промежуток повторений.

Надеюсь хоть теоретически Вам немного помог.
Я не маюсь бездельем, я от него тащусь!

Последний раз редактировалось Tayfun; 24.12.2012 в 11:22.
Tayfun вне форума Ответить с цитированием
Старый 24.12.2012, 11:42   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Tayfun Посмотреть сообщение
Добрый день!
Добрый
Цитата:
Сообщение от Tayfun Посмотреть сообщение
2. Скрещивание
Здесь мы объединяем решения. В моем случае я брал столбцы из одной таблицы и подставлял во вторую и получал множество таблиц (потомки). Для двух таблиц 2*3 получалось вот так:
Начальные:
0 2 1 | 1 0 2
1 0 3 | 2 1 1
Потомки (если где ошибся не судите строго):
1 2 1 | 0 0 1 | 0 2 2 | 0 0 2 | 1 2 2 | 1 0 1
2 0 3 | 1 1 3 | 1 0 1 | 1 1 1 | 2 0 1 | 2 1 3
Скрещивание, это то, что также принято называть кроссовером? Я сколько ни читал, везде скрещивание выполняется по генам, т.е. есть популяция 1 и 2, значение которых равно (пишу в двоичном коде):
Цитата:
популяция 1:
1001 0110
Цитата:
популяция 2:
1100 1110
в итоге получаем новую популяцию:
Цитата:
1101 1110 (скрестили по второму гену, который выбрали случайно)
выполняем ряд других операций(мутацию и прочее) и считаем значение оптимизируемой функции. Если наше решение улучшилось, "убиваем" предков (1001 0110 и 1100 1110), сохраняем потомков (1100 1110) и прогоняем алгоритм еще раз, в противном случае "убиваем" потомков и вновь прогоняем наш алгоритм. Я делал именно так, не знаю верно или нет, но если верить литературе, то так верно
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 24.12.2012, 12:06   #4
Tayfun
Форумчанин
 
Аватар для Tayfun
 
Регистрация: 24.06.2007
Сообщений: 351
По умолчанию

Цитата:
сохраняем потомков (1100 1110) и прогоняем алгоритм еще раз, в противном случае "убиваем" потомков и вновь прогоняем наш алгоритм
Да все верно, и прогоняете пока не сработают критерии остановки алгоритма.
Отличная работа!
Я не маюсь бездельем, я от него тащусь!
Tayfun вне форума Ответить с цитированием
Старый 25.12.2012, 02:09   #5
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Tayfun Посмотреть сообщение
Да все верно, и прогоняете пока не сработают критерии остановки алгоритма.
Отличная работа!
Спасибо! С Наступающим
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 28.12.2012, 05:23   #6
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Tayfun Посмотреть сообщение
Да все верно, и прогоняете пока не сработают критерии остановки алгоритма.
Отличная работа!
И все же неверно работает мой код, неверно! Решил испробовать его для решения стандартной задачи оптимизации, т.е. оптимизировать функцию Химмельблау:
Цитата:
f(x,y)=(x^2 + y - 11)^2 + (x + y^2 -7)^2
и как итог получил, что минимальное значение функции равно ~190 и достигается оно близ нуля, но мы то с Вами знаем, что функция Химмельблау имеет минимум в точке (3;2), который равен f(3,2)=(9+2-11)^2+(3+4-7)^2=0 - существенная разница, ни правдо ли?
Сейчас буду смотреть на реализованные операторы скрещивания и селекции, т.к. судя по отладчику они работают по меньшей мере странно.
Все же может быть кто в состоянии ткнуть пальцем и с дьявольским сарказмом сказать: "А вот тут у тебя ошибка!"?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки, правильно реализовал или нет? bakanaev Общие вопросы Delphi 23 17.08.2012 22:26
Генетический алгоритм CannibalCorpse Общие вопросы Delphi 0 13.04.2012 15:48
Генетический алгоритм _SeregkA_ Помощь студентам 2 05.01.2012 20:26
Генетический алгоритм Sparky Помощь студентам 5 16.12.2011 20:32
[B]Народ! Проверки мне верно или не верно? мне надо завтра сдавать[/B] Vladislav_87 Паскаль, Turbo Pascal, PascalABC.NET 6 04.06.2008 14:34