Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
user posted image
Здесь, то что без особых усилий можно выудить из документа.
Metod_Otjiga.7z (, : 124)
Вопрос: Как мне получить результат
в тоже виде, что и у автора статьи
то есть путь из связанных точек? :blush: :-?

Заранее спасибо) :thanks:

Автор: ^D^ima 05.06.18, 17:52
RusSun
Тебе свет клином сошелся на той статье?

Загугли фразу:
https://www.google.com/search?ei=5swWW_veJs...1.0.xiU94fZ7gc4

Добавлено
Цитата RusSun @
 N := a[Index1];

А ничего что 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 раза. :blink: :jokingly:

Но вопрос мой не в этом. ;) :)
Автор статьи получает какие-то результаты, которые интерпретирует например так
user posted image

Вопрос: Как мне получить результат
в тоже виде, что и у автора статьи или хотя бы похожий результат,
то есть чтобы из полученных точек можно было построить "путь из связанных точек"
То есть что не так с примером :-?

Автор: 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
У вас там много ошибок. По парочки в каждой функции. Я поправил оснавные.

user posted image

:dance: Metod_Otjiga1.5.zip (, : 137)

Автор: RusSun 27.06.18, 14:58
:thanks: Надеюсь, тема будет полезна не только мне :)

В картинке у Вас включена была зеленая серия.
А в конечном варианте осталась только красная.
Зеленая использовалась для теста?

Автор: Pavia 27.06.18, 16:24
Да там видео слиплось вначале идёт кусок с тестом там цвет зелёный. А потом убрал лишнее осталось красная.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)