Как назначить кратчайшее расстояние всем агентам в NetLo go? - PullRequest
3 голосов
/ 04 марта 2020

Как назначить кратчайшее расстояние всем агентам

  • Текущий статус: Мои коды находят кратчайший путь только для 1 человека, но не могут, когда есть более 1 человека.
  • Вопрос: Как я могу назначить кратчайший путь для каждого человека?

Фон

Я манипулировал моделью сетки traffi c внутри NetLo go библиотека моделей для создания алгоритма кратчайшего пути для пешеходов (несколько близко к A *). Приведенный ниже интерфейс показывает, что агент стоит в своем источнике, который окрашен в бледно-желтый цвет и имеет тот же цвет, что и пункт назначения. Он также отлично работает для 3 человек.

  • 1 человек 1 person
  • 3 человека 3 people

Настройка

Здесь это кусок кода, который я написал в качестве установки. Похоже, в этом разделе нет проблем.

globals
[
  grid-x-inc               ;; the amount of patches in between two roads in the x direction
  grid-y-inc               ;; the amount of patches in between two roads in the y direction
  intersections ;; agentset containing the patches that are intersections
  roads         ;; agentset containing the patches that are roads
  population
]

breed[people person]

patches-own
[

  father
  navigated?
  active?
  Heuristic
  step
  total-cost
  is-intersection?
  start
  finish
]

people-own
[
  origin
  destination
  h-distance ;; short for heuristic distance. Euclidean distance to goal
  path
]

to setup
  clear-all
  setup-globals
  setup-patches
  setup-people
  setup-destination
  reset-ticks
end

to setup-globals
  set grid-x-inc world-width / grid-size-x
  set grid-y-inc world-height / grid-size-y

  ask patches
  [
    set father nobody
    set navigated? false
    set active? false
    set total-cost 0
  ]
end


to setup-patches
  ;; initialize the patch-owned variables and color the patches to a base-color
  ask patches [ set pcolor brown + 3 ]

  ;; initialize the global variables that hold patch agentsets
  set roads patches with
    [(floor((pxcor + max-pxcor - floor(grid-x-inc - 1)) mod grid-x-inc) = 0) or
    (floor((pycor + max-pycor) mod grid-y-inc) = 0)]
  set intersections roads with
    [(floor((pxcor + max-pxcor - floor(grid-x-inc - 1)) mod grid-x-inc) = 0) and
    (floor((pycor + max-pycor) mod grid-y-inc) = 0)]
  ask roads [ set pcolor white ]

  ask intersections [ set is-intersection? true
    ask neighbors [ set is-intersection? true ]]

end


to setup-people
    create-people no-of-people
  [
    set shape "person"
    set size 1
    set color black
    move-to one-of patches with [pcolor != brown + 3]
    set origin patch-here
    set destination one-of patches with [pcolor != brown + 3 and is-intersection? != true]
    set h-distance distance destination
  ]
  set population []  ;; create list of individuals
  let sort-turtles sort people set population sort-turtles
end


to setup-destination
foreach population [ individual ->
  ask individual [
   let roads_ roads with [pcolor = white]
   ask roads_ [
     set navigated? false
     set active? false
     set Heuristic 0
     set step 0
     set total-cost 0
     set start false
     set finish false
   ]]
    let current [origin] of individual
    let target [destination] of individual

ask individual [
    if target != nobody [
      ask current [
        set pcolor (10 + random 130)
        set step 0
        set start true
        set finish false
        set navigated? false
      ]
      ask target [
        set pcolor [pcolor] of current
        set navigated? true
        set start false
        set finish true
      ]]
  ]]
end

Проблема 1: Установите все пути

set-path отслеживает все шаги от исходного патча до любого места внутри виртуального Мир. Код раскрасит дорогу до желтого и добавит метку на пути. Эта процедура будет повторяться 50 раз, чтобы найти все возможные шаги.

Проблема возникает в этом разделе, где этот код работает только для одного агента, а не для всех агентов.

to set-path

repeat 50 [
  ask patches with [pcolor = white and pcolor != yellow] [
      if any? neighbors4 with [ start = true ] or
       any? neighbors4 with [ pcolor = yellow ]
    [ set pcolor yellow
      let laststep [step] of one-of neighbors4 with [pcolor = yellow or
                                                            start = true]
        ifelse [plabel] of patches != nobody [
          set step laststep + 1
          set plabel step
          set father step
          set total-cost father + heuristic
          set plabel-color red][set plabel ""]
  ]]]

  let allroads [self] of patches with [pcolor != brown]
  let final_location one-of patches with [finish = true]

  foreach allroads [ road_patch ->
    ask road_patch [set Heuristic distance final_location]
    ]
end

Проблема 2. Задайте кратчайший путь

Эта процедура находит кратчайший путь, находя исправления и добавляя их в список с именем path. Поскольку предыдущая процедура работала только для одного агента, эта процедура также назначит исправления одному агенту, а это не то, что мне нужно.

to shortest-path
  ask patches with [start = true] [
    let maxsteps 0
    ask patches with [navigated? = true]
  [ let check-steps min-one-of neighbors4 with
        [pcolor != brown + 3 and pcolor != white][step]
    set maxsteps [step] of check-steps
  ]

  let num (range maxsteps 0 -1)
  let paths []

  foreach num [ navigation ->
  ask patches with [navigated? = true] [
    let nav-patch min-one-of neighbors4 with
        [step = navigation and pcolor != brown + 3][step]
    if nav-patch != nobody [ask nav-patch [set navigated? true set paths fput self paths]]
    ]]
  ask people [set path paths]

    ]
  ask patches with [pcolor = yellow][set pcolor white set plabel ""]
end

Резюме: как я хочу, чтобы модель выглядела

Может кто-нибудь решить мою проблему? Большое спасибо заранее !!

...