Муравьиный алгоритм. Задача Коммивояджера. NetLogo
Прошу помощи с программой в NetLogo. Делаю все по мануалу, но из-за того, что совершенно новый для меня язык, реализовать задачу сложновато. К сожалению pdf ссылку не могу скинуть на мануал, так как он в закрытом доступе, поэтому 7 фото мануала расположены в самом низу, остальные вам надо будет взять у меня, написав мне (к сожалению новым пользователям вроде меня нельзя вставлять много ссылок) Так же я написал код, который не могу отладить уже 3 день из-за не понятных мне ошибок. Буду очень рад, если кто-то откликнется!
breed [nodes node]
breed [ants ant]
links-own [len ph visits best?]
;len - длина ребра
;ph - уровень феромона
;visits - кол-во муравьев, прошедших по этому ребру на текущей итерации алгоритма
;best? - логическое значение, показывающее, входит ли данное ребро в текущий оптимальный маршрут
globals [best-len sel rnd max-ph next sum-weights] ;
;best-len - длина лучшего марштура
;sel
;rnd
ants-own [current to-visit visited-links path-len]
;current - текущая вершина графа
;to-visit - список вершин
;visited-links - набор связей
;path-len - длина текущего маршрута
to setup
clear-all
ask patches [set pcolor white]
create-nodes graph-size
ask nodes [setup-node]
create-ants ants-number
ask nodes [
create-links-with other nodes [
set color blue
set ph 1
set len link-length / max-pxcor
]
]
ask ants [
set hidden? true
]
reset-ticks
end
to setup-node
set shape "circle"
set size 1
set color orange
if layout = "random"[
setxy random-xcor random-ycor
]
if layout = "circle"[
let a 360 / graph-size * who
let r max-pxcor - 1
setxy (r * sin a) (r * cos a)
]
if layout = "grid"[
let n ceiling sqrt graph-size
let d (2 * max-pxcor - 2) / (n - 1)
set xcor min-pxcor + 1 + d * (who mod n)
set ycor min-pycor + 1 + d * floor (who / n)
]
end
;Муравьиный алгоритм
to go
ask ants[
set current 0
;set to-visit list (graph-size) (range 1 graph-size)
set to-visit (range 1 graph-size)
set visited-links no-links
set path-len 0
]
ask links [
set visits 0
]
repeat graph-size [ask ants [move-ant]]
ask ants [
let dt Q / path-len / graph-size
ask visited-links [set ph ph + dt]
check-best
set max-ph max visited-links
ask visited-links [
set ph ph / max-ph
color-link
]
]
; ask links [
; ;set max-ph max ph
; set ph ph / max-ph
; color-link
; ]
reset-timer
;error "Stop here!"
end
to move-ant
choose-next
;set next nodes choose-next ;;;;;;;;;
set to-visit remove next to-visit
let l [len and ph] of current ;one-of
set visited-links visited-links + l
ask links[
set visits l + 1
]
set path-len [len] of l
set next current
end
to choose-next
let weights map get-weight to-visit
set rnd random sum weights
set sel 0
(foreach to-visit weights select)
show sel
; if to-visit = 0[
;
; ]
end
to-report get-weight [c]
let l link current c
report [(ph ^ alpha) / (len ^ beta)] of l
end
to select [c w]
if (rnd > 0) and (rnd < w) [
set sel c
set rnd rnd - w
]
end
to check-best
let best-ant min path-len
let bp path-len
if ticks = 0 or bp < best-len [
set best-len bp
ask links [set visits best? = false]
ask visited-links [set best-ant best? = true]
]
end
to color-link
if show-best? = true [
set thickness 0.25
set color green
set hidden? not best?
]
if show-best? = false[
set hidden? visits = 0 and ph < 0.1
set thickness 0.5 * visits / ants-number
set color scale-color blue ph 2 0
]
end
- https://wampi.ru/image/Rjh5tOk
- https://wampi.ru/image/Rjh5Xdt
- https://wampi.ru/image/Rjh59u7
- https://wampi.ru/image/Rjh6dUY
- https://wampi.ru/image/Rjh66z8
- https://wampi.ru/image/Rjh6YWr
- https://wampi.ru/image/Rjh6My4