1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
|||||||||||
1 | |||||||||||
Какая-то ошибка с памятью, где накосячил?18.08.2011, 18:21. Показов 2554. Ответов 24
Метки нет (Все метки)
Всех приветствую! Собственно программа - зачаток простого генетического алгоритма. Что делает: создается популяция с заданным количеством индивидов, которые есть бинарные строки, нужно найти строчку с максимальным количеством переходов 1-0.
1) создаем популяцию и заполняем случайно; 2) вычисляем пригодность; 3) проверяем нет ли в популяции нужного решения (если есть, то все); 4) селекция равномерная, методом "рулетки". Заполняем рулетку с зависимости от пригодности индивида (чем больше пригодность, тем больше ячеек на поле рулетки он получает); 5) Выполняется скрещивание, выбирая индивидов на которых указало "колесо рулетки" 6) применяем оператор мутации 7) повторяем шаги 2-6 заданное число итераций.
Путем установки точек останова выяснил, что косяк, возможно, возникает где то в блоке с селекцией, но что там не так понять не могу.
0
|
18.08.2011, 18:21 | |
Ответы с готовыми решениями:
24
Задача про ГАИ и файлы (где накосячил в коде?) Где я накосячил? Где-то накосячил КРИТИКА: ищу где накосячил |
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
18.08.2011, 19:01 | 2 |
Не хочу код читать, но совет дам. Замени массивы на std::vector и вместо [] используй at(), тогда сразу найдёшь, где за границы выходишь (если выходишь) или с распределением памяти косячишь.
Добавлено через 28 минут Ну да. У тебя выход за пределы массива. Но я носиком тыкать не буду. Ты перепиши на вектора с использованием at и сразу ошибку найдёшь. Причём очень грубую. А вот если бы использовал std::vector то допустить её было бы гораздо сложнее. А если бы вместо [] использовал бы at(), то сразу бы нашёл ошибку. Проектируй правильно и проблем меньше будет сразу. И оставшиеся проблемы быстрее находить будешь.
0
|
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
|
18.08.2011, 19:13 [ТС] | 3 |
Deviaphan, может все же ткнете (просто сроки поджимают, надо руководителю хоть что-то показать)? И еще в хороший мануал про std::vector и at(), поскольку я нуб нубом пока еще , но цель все же научиться делать правильно, а не абы как.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
18.08.2011, 19:23 | 4 |
Строка 151 - выход за границы массива. На малых размерах работает по ошибке из-за неопределённого поведения.
Если бы использовался вектор, то не пришлось бы передавать размер массива. Если бы использовался at, выход за границы был бы сразу обнаружен. Хороший мануал в MSDN или в литературе по STL. Добавлено через 3 минуты Вернее, там выход за границы безболезненный, но fitness может стать больше, чем положено и влияет на весь последующий код. Вот.
0
|
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
||||||
19.08.2011, 11:04 [ТС] | 5 | |||||
Deviaphan, спасибо! Во я косячник но все же где то еще есть косяк, поскольку у меня такое же поведение и если вместо fitness_1 используется fitness.
Переписал вот так тот кусочек:
ЗЫ: время ночь, капитально разбираться сяду завтра, почитаю про вектор и at, счас спать пора уже. Добавлено через 15 часов 12 минут Тема актуальна, косяка не видно( Добавлено через 2 минуты Нашел где накосячил, рулетка переполняется, когда индивидов много, видимо следствие округления. Может кто подскажет как исправить?
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
19.08.2011, 11:23 | 7 | |||||
Исправлять ошибку принципиально не стал, но вот код, в котором в ошибку тебя будут тыкать носиком:
0
|
Заблокирован
|
|||||||
19.08.2011, 11:24 | 8 | ||||||
Вбил ИД
Введите размер популяции 30 Введите число прогонов 3 Введите вероятность мутаци Вот как отработала твоя программа
1 поколение
0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 Его пригодность 1 2 2 2 2 4 3 2 1 2 1 2 3 2 2 3 2 3 3 3 3 3 2 2 2 2 2 2 3 2 Рулетка 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 5 5 5 6 6 6 6 7 7 7 8 9 9 9 10 11 11 11 12 12 12 12 13 13 13 14 14 14 15 15 15 15 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 2 0 20 20 20 21 21 21 21 22 22 22 23 23 23 24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 28 29 29 29 29 29 29 29 Промежуточное поколение 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 2 поколение 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 Его пригодность 3 3 2 2 2 4 2 2 3 1 2 2 3 1 3 3 3 3 2 2 2 3 2 2 2 2 3 1 3 3 Рулетка 0 0 0 0 1 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 5 5 5 6 6 6 7 7 7 8 8 8 8 9 10 10 10 11 11 11 12 12 12 12 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 18 18 18 19 19 19 20 20 20 21 21 21 21 22 22 22 23 23 23 24 24 24 25 25 25 26 26 26 26 27 2 8 28 28 28 29 29 29 29 29 Промежуточное поколение 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 3 поколение 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 Его пригодность 2 4 3 2 2 2 2 2 2 2 2 3 2 2 2 3 2 2 3 3 3 3 2 3 2 3 3 3 3 4 Рулетка 0 0 0 1 1 1 1 1 2 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 11 12 12 12 13 13 13 14 14 14 15 15 15 15 16 16 16 17 17 17 18 18 18 18 19 1 9 19 19 20 20 20 20 21 21 21 21 22 22 22 23 23 23 23 24 24 24 25 25 25 25 26 26 26 26 27 27 27 27 28 28 28 Промежуточное поколение 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 Последняя популяция 1 0 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
19.08.2011, 11:25 | 9 |
Ладно, намекну. Рулетка размером 100, а запись происходит за её пределами иногда.
0
|
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
|
19.08.2011, 15:14 [ТС] | 10 |
Deviaphan, да собственно я это написал еще тут я конечно нуб, но я стараюсь исправляться и косяки ищу
Я по вектору только англоязычные мануалы нашел, работы было много, даже не брался пока что, просто угнетало, что код не работает. Я понял, что косяк в самодельной функции округления, которая при большом количестве строк дает большую погрешность, к сожалению ничего умнее, чем сделать рулетку поболее мне сейчас в голову не приходит...
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
19.08.2011, 15:24 | 11 |
Когда у меня упало, pos было равно 99 и p = 3. Если при таких малых числах погрешность округления составляет единицы и десятки процентов...
Добавлено через 1 минуту Я не могу понять, чего ты пытаешься добиться в функции raund (это лишком сложно для меня). Скажи по человечески, как тебе округлить надо и я подскажу. Добавлено через 2 минуты По STL на русском. Николай Джосьютис "С++. Стандартная библиотека". И вообще, пошёл в программирование, изволь учить английский до уровня "Со словарём".)
0
|
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
|
19.08.2011, 15:57 [ТС] | 12 |
Deviaphan, уровень английского есть, но уровень лени тоже высок.
Мне надо перевести вероятность к репродукции индивида (pi = fi/SUM(f)) в количество ячеек которое он займет на рулетке. Просто делается все на коленке, пока по другому никак, к сожалению, отсюда реализация того, что первым в голову пришло.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
19.08.2011, 15:58 | 13 |
Всё равно не понятно. Каким образом округление связано с переводом?
Или объясни так, чтобы я понял (про округление) или жди тех, кто это может понять.)
0
|
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
|
19.08.2011, 16:01 [ТС] | 14 |
Кусочек лекции чтоб было понятнее
0
|
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
|
19.08.2011, 16:03 [ТС] | 15 |
Deviaphan, с округление связано так: вычисляем вероятность, получаем например 0,012345. Это Число надо перевести в количество ячеек, я их пытался получить, округляя это число 0,012345 -> 12, это дает очень большую погрешность с большой популяцией, как оказалось.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
19.08.2011, 16:06 | 16 |
Я конкретно про функцию round спрашиваю. До ближайшего целого округлять должна или что это вообще? Не понимаю.(
Добавлено через 45 секунд Ну не округление это.)))
0
|
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
|
19.08.2011, 16:07 [ТС] | 17 |
Deviaphan, ааа, округляет до ближайшего двузначного целого грубо говоря. В общем вытаскивает первые 3 старших разряда из дробной части в целую.
Добавлено через 16 секунд Deviaphan, а как это назвать? Пусть будет увеличение порядка с округлением, например
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
19.08.2011, 16:09 | 18 | |||||
То же самое делает.
Ближайшее целое для этого будет ноль. В общем, название не правильное. Функционал чуть выше.
0
|
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
|
|
19.08.2011, 16:10 [ТС] | 19 |
Deviaphan, ой можно по косточкам пожалуйста? Что делает floor, в какой оно библиотеке, и что значет 1е3?
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
19.08.2011, 16:13 | 20 |
Это 1000
Округляет до меньшего целого. Есть ещё ceil. MSDN Т.к. округляет до меньшего, а не до ближайшего, то добавляем 0,5 Можно и без floor, сразу в int приводить. Я сперва думал, что double должен возвращаться.
0
|
19.08.2011, 16:13 | |
19.08.2011, 16:13 | |
Помогаю со студенческими работами здесь
20
Не могу разобраться где накосячил Накосячил при разводке, а где не пойму. Датчик света, где накосячил [Решено] Не получается реализовать часть задачи, не пойму где я накосячил Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |