Pull to refresh

Comments 60

UFO just landed and posted this here
Да, признаю ваши заслуги! :D Но думаю, что повторов не будет.
Надеюсь :) во-всяком случае «Hello world», решенный генетическим алгоритмом, интереснее всяческих print «hello world» :)
видимо, это самый «простой» способ вывести Hello World! :)
А представьте, кто-то сегодня решил освоить Си и загуглил «hello world» =)
А как же версия на брэйнфаке?
в том-то и дело, что она короче :)
Вот, кстати, вывести с помощью ГА самый короткий код на Брейнфаке, который выводил бы «Hello, World!», было бы намного интереснее и поучительней.
Если дать программе возможность генетически генерировать другой код, он сможет сгенерировать генератор ботов и потом захватить мир.
Есть такой проэкт, называется Avida. Там чем-то похожим занимаются.
Много кода, мало текста. Если бы я не знал что такое «генетический алгоритм» я бы честно говоря не понял к чему все эти танцы с брутфорсом.
интересно, что за текст образовала человеческая популяция?
Из поста понял 2 вещи:
1. генетический алгоритм — штука интетесная, но мутная, надо будет почитать;
2. все-таки за несколько лет работы с PHP стало непривычно и как-то неудобно смотреть на C.
Вот такая информация поступила…
боюсь вспомнить, как я раньше жил без знания того что вы нам поведали.
Мне всегда казалось что под «генетическим алгоритмом» скриваеться алгоритм поиска екстремума функции…
А данный пример — это тоже поиск экстремума фитнес-функции. Только вот он единственный и известный заранее, что делает весь пример бесполезным.
Да, матиматика нинче не в моде…
Вот программирование, это наше все :(
Best: Idoit!wnsk_! (22)

Мне кажется, он пытается нам что-то сказать…
Мне вот капча периодически что-то сообщает, порой мне кажется, что она со мной пытается заговорить.
И еще автору:
Я бы описал основное применение, а именно:
Чтобы проверить торгового робота на диапазоне параметров можно «проходить» диапазон не в циклах (как сейчас во всех программах), а при помощи генетических алгоритмов. И время сокращается в 9-12 раз.

можно трактовать как I do it — я делаю это, а можно подумать, что популяция просто перепутала местами 3 и 4 символ:)
Zetway: Первое существо, которое создал Бог, говорило только «Hello, World!» и умирало...
Я в генетических алгоритмах не силен, точннее вообще их не знаю и не понимаю. Но решим их изучения наткнулся на странный эффект.
Если добавить символ z в строку, то перебор до этого символа не доходит. Доходит только до «y».
Гдето собака зарыта ;)
for (int j=0; j<tsize; j++)
    citizen.str += (rand() % 90) + 32;

рандом не доходит до буквы z (код 122)
:)
По-моему пример, использующий в качестве фитнесс функции сравнение с эталоном, ужасен. Генетические алгоритмы используют как раз для того, чтобы вычислить этот эталон. Если эталон известен заранее — в генетическом алгоритме нет смысла, в данном случае он не решает вообще никакую задачу.
вот мне этот момент тоже непонятен совершенно.
и полностью дискредитирует идею генетических алгоритмов.
Почему это один некорректный пример «полностью дискредитирует» давно себя отлично зарекомендовавшую идею?

При правильно подобранной фитнес-функции ГА работают очень неплохо, иногда им просто нет альтернативы.
потомучто конерктно в этой статье, рандомный читатель, в соответствии с названием может ожидать «максимально простую реализацию ГА, иллюстрирующую их свойства»
а вместо этого видит максимально корявый пример.
Повторяю вопрос — как один частный корявый пример может дискредитировать идею вообще?
Вы знаете что такое дискредитация? Вот если б я не осознавал, что пример неудачный, то сказал бы что ГА — это баловство. Хотя сомневаюсь, что автор делает это умышленно.
Вы не чувствуете семантической разницы между «полностью дискредитирует» и «ваш пример дискредитирует»?
вы искренне полагаете, что повторение вопроса поможет вашему пониманию ответа на него?

поясняю:
этот пример может быть единственно известным читателю, заинтересовавшемуся статьёй.
Довольно таки странный пример. Мне не известны люди, выстраивающие свое мнение о какой либо теме на основании первой же левой статьи. Тем более что даже эта статья содержит библиографические ссылки.
данная статья в той форме как есть у непосвящённого читателя достигает единственной цели — продемонстрировать абсурдность ГА.

в чём ещё смысл этой левой статьи?
Она демонстрирует непонимание автором смысла ГА, только и всего. Сами то ГА при чем?
этот смысл доступен только тем, кто понимает ГА.
а не рандомному читателю, с позиций которого я о ней сужу.
Рандомный читатель, найдя какую либо статью, пройдет по приведенным в статье ссылкам, прочитает соответствующий раздел в Википедии и только после этого составит какое-то мнение. Это если тема хоть немного ему интересна. Если нет, то никакого мнения он составлять и не будет.
читатель пройдёт по ссылкам, если его заинтересовала статья.

если ему интересна тема сама по себе — он сделает это и без статьи.
Поделитесь нормальным примером. Очень интересно попробовать.
мерси. второй пример захватывает. Рассылаю по контакт листу.
Во, и я задлася тем же вопросом. Есть эталон, программа пытается его найти брутфорсом, хотя вот он лежит в памяти. Сразу зреет вывод, что либо пример бестолковый, либо генетические алгоритмы туфта. Не увидел реального толку от ГА в этом примере. Хотя очень хотелось…
Перенесите в «Ненормальное программирование». Ибо это самый извращенный способ вывода «hello world»
Так и сделаю, если хабровчане поддержат ваше предложение.
В коде, имху, ошибка.

...
buffer[i].str = population[i1].str.substr(0, spos) + population[i2].str.substr(spos, esize - spos);
...

Вместо substr(spos, esize - spos) надо substr(spos, tsize - spos)
#pragma warning(disable:4786) // отключаем отладочные предупреждения
А за такое предлагаю бить по рукам, сильно и больно.
да, нельзя, что бы такое вошло в привычку, на сколько бы ты ни был в себе уверен.
UFO just landed and posted this here
Спасибо всем, кто помог сделать статью лучше и полнее. Больше сотни в избранном, значит результат есть, а это главное.
Мы вот с другом задумались. У вас ведь задача получается с одним глобальным экстремумом? И локальные экстремумы совпадают с глобальным.
Можно ли вашу целевую функцию сделать функцией с двумя глобальными экстремумами. Чтобы задача интереснее была.
Ну и мы сделали так:
1) ввели вторую цель той же длины #define GA_TARGET2 std::string(«Hello gnome!»)
2) изменили целевую функцию
population[i].fitness = 0;
fitness = 0;
for (int j=0; j<tsize; j++) {
fitness += abs(int(population[i].str[j] — target[j]));
}
population[i].fitness = fitness;
fitness = 0;
for (int j=0; j<tsize; j++) {
fitness += abs(int(population[i].str[j] — target2[j]));
}

population[i].fitness *= fitness;

Т.е. определили её как произведение модулей разности целевых векторов и особи.
И теперь алгоритм падает то к одному то ко второму экстремуму.
Ну и мы сделали так:
1) ввели вторую цель той же длины #define GA_TARGET2 std::string(«Hello gnome!»)
2) изменили целевую функцию
population[i].fitness = 0;
fitness = 0;
for (int j=0; j<tsize; j++) {
fitness += abs(int(population[i].str[j] — target[j]));
}
population[i].fitness = fitness;
fitness = 0;
for (int j=0; j<tsize; j++) {
fitness += abs(int(population[i].str[j] — target2[j]));
}

population[i].fitness *= fitness;

Т.е. определили её как произведение модулей разности целевых векторов и особи.
И теперь алгоритм падает то к одному то ко второму экстремуму.
тьфу. «Some error… We know...»
Sign up to leave a comment.

Articles