Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Delphi: Общие вопросы > Метод отжига |
Автор: RusSun 05.06.18, 16:41 |
Всем привет! Пред пред предисловие: Я сделал поиск по данной теме Вот текст моего запроса: "метод отжига delphi" и Гугл меня не очень обрадовал результатами. Две темы и ничего конкретного в одной нет ответа, в другой ссылка без разбора и продолжения не было. Если Вам скучно, проходите мимо. Не стоит писать что-то вроде Баян... и т. д. Присылайте конкретные ссылки где эта тема обсуждалась и пришла к решению. Предисловие: Долго думал, стоит ли создавать данную тему, взвесив за и против решил, что нужно. Предыстория: Метод отжига показался мне интересным для получения решения задач требующих полного перебора (что долго). У меня в задаче есть множество точек по которым мне необходимо строить маршрут, я пока не придумал как сгенерировать данное множество не сложно. Поэтому хотелось бы посмотреть действие "метода отжига" на чем-то уже простом и понятном можно найти описание на методе "Коммивояжёра". Основная: Вот вторая из двух ссылок, те что "дал Гугл". programmersforum Вот нашлось. Вроде бы смотри и радуйся. Цитата Pavia дает ссылку. Этих методов оптимизации вагон и маленькая тележка. Вот поискал вот код: http://surface.syr.edu/cgi/viewcontent.cgi...ecs_techreports __________________ Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ. У дзен программиста программа делает то что он хотел, а не то что он написал . Но на второй вкладке elf01 признает что ничего не может сделать так Цитата elf01;1591197 Вы вообще о чем, я решить то сам могу, вы видели что я написал? там нет функций generate и swap, хотя в коде они присутствуют. Вам ли ж бы написать, вы хоть документ открывал, что добрый человек кинул? Там все цифры для примера есть. Итак пробую добавить недостающее generate <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> procedure generate(var i, j: integer); begin randomize; i:= random(10); j:= random(10); if (i=0) or (j=0) then begin i:= 1; j:= 1; end; if i=j then generate(i,j); end; и swap Со swap я не смог его сделать, без того чтобы delphi на него не ругалось, поэтому просто сделал так <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> begin b[1]:= a[(i + k - 2) mod n + 1]; a[(i + k - 2) mod n + 1]:=a[(j - k + n) mod n + I]; a[(j - k + n) mod n + I]:=b[1]; end; Хотя должно быть что-то ... но не робит (думаю потому, что var Index1, Index2: tour "не равны" локальному N:tour) <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> procedure Swap(var Index1, Index2: tour); var N:tour; begin N := a[Index1]; a[Index1] := a[Index2]; a[Index2] := N; end; Но вопрос мой не в этом. Автор статьи получает какие-то результаты, которые интерпретирует например так https://yadi.sk/i/VKENa_bg3XAirk Здесь, то что без особых усилий можно выудить из документа. Metod_Otjiga.7z (, : 124) Вопрос: Как мне получить результат в тоже виде, что и у автора статьи то есть путь из связанных точек? Заранее спасибо) |
Автор: ^D^ima 05.06.18, 17:52 |
RusSun Тебе свет клином сошелся на той статье? Загугли фразу: https://www.google.com/search?ei=5swWW_veJs...1.0.xiU94fZ7gc4 Добавлено А ничего что tour это массив и как ты можешь целому массиву присвоить элемент массива? Попробуй так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> procedure Swap(var Index1, Index2: tour); var N:tour; begin N[1] := a[Index1]; a[Index1] := a[Index2]; a[Index2] := N[1]; end; И вообще ты бы привел код целиком, а тот будем как с Fester ты мне про Фаму я про Ерему. |
Автор: RusSun 05.06.18, 19:04 |
Цитата ^D^ima @ И вообще ты бы привел код целиком, а тот будем как с Fester ты мне про Фаму я про Ерему. Цитата RusSun @ Здесь, то что без особых усилий можно выудить из документа. Прикреплённый файлMetod_Otjiga.7z (8,57 Кбайт, скачиваний: 0) |
Автор: ^D^ima 06.06.18, 07:09 |
swap должна менять местами элементы массива который ты ей передаешь. Передаешь ты ей массив из локальной переменной процедуры, а свап ничего не возвращает взамен. Или сделай глобальную переменную, или из свап функцию или в процедуре свап возвращай значение. |
Автор: RusSun 26.06.18, 18:16 |
Цитата ^D^ima @ swap должна менять местами элементы массива который ты ей передаешь. Передаешь ты ей массив из локальной переменной процедуры, а свап ничего не возвращает взамен. Или сделай глобальную переменную, или из свап функцию или в процедуре свап возвращай значение. Написал, что просто сделал напрямую, тем более там три строки. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> b[1]:= a[(i + k - 2) mod n + 1]; a[(i + k - 2) mod n + 1]:=a[(j - k + n) mod n + I]; a[(j - k + n) mod n + I]:=b[1]; Если так сильно хотите, то код тестового примера был прикреплен к теме и скачан 4 раза. Но вопрос мой не в этом. Автор статьи получает какие-то результаты, которые интерпретирует например так Вопрос: Как мне получить результат в тоже виде, что и у автора статьи или хотя бы похожий результат, то есть чтобы из полученных точек можно было построить "путь из связанных точек" То есть что не так с примером |
Автор: Pavia 26.06.18, 18:56 |
Цитата RusSun @ в тоже виде, что и у автора статьи или хотя бы похожий результат, то есть чтобы из полученных точек можно было построить "путь из связанных точек" То есть что не так с примером А в чем трудности? Берёшь и как есть выводишь. Разве, что масштаб увеличить. Да смещение подобрать. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> var Path:tour; i:Integer; begin Canvas.MoveTo(Round(Path[0].x),Round(Path[0].y)); for i:=0 to Length(Path)-1 do Canvas.LineTo(Round(Path[i].x),Round(Path[i].y)); Canvas.LineTo(Round(Path[0].x),Round(Path[0].y)); end; |
Автор: RusSun 27.06.18, 00:15 |
https://yadi.sk/i/yZ6d3SLC3YTAvA Вот так? Metod_Otjiga1.rar (, : 118) |
Автор: Pavia 27.06.18, 11:08 |
RusSun У вас там много ошибок. По парочки в каждой функции. Я поправил оснавные. Metod_Otjiga1.5.zip (, : 137) |
Автор: RusSun 27.06.18, 14:58 |
Надеюсь, тема будет полезна не только мне В картинке у Вас включена была зеленая серия. А в конечном варианте осталась только красная. Зеленая использовалась для теста? |
Автор: Pavia 27.06.18, 16:24 |
Да там видео слиплось вначале идёт кусок с тестом там цвет зелёный. А потом убрал лишнее осталось красная. |