每个 Turtle 需要从同一个代理集中挑选不同的代理

Each Turtle need to pick different agents from the same agentset

我的品种 (amministrazione spurgatori) 有问题。 我需要他们每个人从同一个代理集中选择一个不同的目标(带有 segnalato 的检修孔?= true)但他们都前往同一个补丁。 我认为问题出在 "to direzione amministrazione" 中的代码,但我不确定。 有什么建议么? 提前谢谢你

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;; CARATTERISTICHE ;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

globals
[
  grid-x-inc                                                          ;;per definire la grandezza degli isolati (quadrati verd)
  grid-y-inc
  intersections
  manholesO                                                            ;; tombini sulle strade orizzontali
  manholesV                                                            ;; tombini sulle strade verticali
  roads
  valore-Scenario-degrado
]

turtles-own
[
ufficio
segnalati
work
house
goal
speed
applicazione?
]

breed [cittadini cittadino]
breed [amministrazione spurgatore]

patches-own
[
 intersection?                                                          ;;vero se è intersezione tra due strade                                                             ;;vero se è tombino
 ostruzione-da-rifiuti                                                      ;; da definire bene
 segnalato?
]


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;; PROCEDURA DI SETUP ;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to setup
  ca
  reset-ticks
  setup-globals
  setup-patches
  set-Scenario-Degrado
  let goal-candidates patches with [
    pcolor = 37 and any? neighbors with [ pcolor = white]
  ]


 create-cittadini n-of-cittadini
  [
    set size 1
    set color black
    set shape "car"
    set speed 0.07
    set house one-of goal-candidates                                     ;;crea la tartaruga casa
    set work one-of goal-candidates with [ self != [ house ] of myself]  ;;crea una localizzazione diversa per ogni tartaruga
    set goal work                                                        ;;crea direzione attuale
    move-to house
    set applicazione? false
     ]

  ask n-of NOALLATESSERADELTIFOSO cittadini [set applicazione? true]

  create-amministrazione n-of-spurgatori
  [
    set size 1
    set color red
    set shape "person"
    set speed speed
    set ufficio one-of goal-candidates

    set goal ufficio
    move-to ufficio
  ]

end

;;con setup globals si definiscono le dimensioni della griglia in questo caso non è modificabile

to setup-globals

  set grid-x-inc world-width / 7
  set grid-y-inc world-height / 7

end


;;con ask patches definisco le pacth che rappresentano i quadrati intorno alle strade con set road le strade

to setup-patches
 ask patches                                                            ;;caratteristiche generali delle patch verdi
  [ set intersection? false
    set pcolor 37
    ]
 set roads patches with                                                 ;;definisco quali sono le strade attraverso le coordinate
    [(floor((pxcor + max-pxcor - floor(grid-x-inc - 0))
        mod grid-x-inc) = 0) or
    (floor((pycor + max-pycor) mod grid-y-inc) = 0)]

  ask roads [ set pcolor white ]

  ;;vado a definire le intersezioni, capire bene
 set intersections roads with                                            ;; definisco quali sono le intersezioni attraverso le coordinate
   [(floor((pxcor + max-pxcor - floor(grid-x-inc - 0)) mod grid-x-inc) = 0) and
   (floor((pycor + max-pycor) mod grid-y-inc) = 0)]

 set manholesO roads with                                                 ;;definisco quali sono i tombini sulle strade orizzonatli
   [(floor((pxcor + max-pxcor - floor(grid-x-inc - 0)) mod grid-x-inc) = 4) and
   (floor((pycor + max-pycor) mod grid-y-inc) = 0 )]

 set manholesV roads with                                                 ;;definisco quali sono i tombini sulle strade verticali
  [(floor((pycor + max-pycor - floor(grid-y-inc - 0)) mod grid-y-inc) = 4) and
   (floor((pxcor + max-pxcor) mod grid-x-inc) = 0 )]


  setup-intersections
  setup-manholesO
  setup-manholesV


end

to setup-intersections
  ask intersections
  [
   set intersection? true
  ]
end

to setup-manholesO
  if setup-manholes? [
  ask manholesO
 [  set pcolor 109
    set segnalato? false
    set ostruzione-da-rifiuti 0
  ]
  ]
end

to setup-manholesV
  if setup-manholes? [
  ask manholesV
 [  set pcolor 109
    set segnalato? false
    set ostruzione-da-rifiuti 0
  ]
  ]
end

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;; PROCUDERA DI AVVIO ;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:

to go
tick
  network
  go-cittadini
  go-amministrazione
  ask manholesO [                                                          ;;il tempo di svuotamento aumento di 1 ogni tick
    ostruzioneO
  ]
  ask manholesV
  [
  ostruzioneV
  ]

  attappamento
end

to network
  if Metodo-diffusione-applicazione = "Passaparola"
[
    ask cittadini with [applicazione? = true]
    [if any? cittadini in-radius 1 with [applicazione? = false] and random-float 1.0 < Probabilità-connessione
      [create-link-with one-of other cittadini in-radius 1 with [ applicazione? = false ]
      ]
 ]
  ]



    end

to segnalazione
  ask cittadini with [applicazione? = true]
  [
 if [pcolor] of patch-ahead 2 = 103 [
      ask patch-ahead 2 [set segnalato? true]
    ]
  ]

    end


to go-cittadini

 ask cittadini
  [face next-patch                                                      ;;per andare verso la direzione quindi definisce il movimento (forse non serve up-car?)
    fd speed
    variation-speed
    direzione-cittadini
    segnalazione
    ask link-neighbors [ set applicazione? true ]
      ]
  ask cittadini  with [applicazione? =  true][ ask in-link-neighbors
  [ set applicazione? true]
  ]

end

to go-amministrazione
  ask amministrazione
  [
    face next-patch2
    fd 0.05
    direzione-amministrazione
  ]
end

to direzione-cittadini
  if goal = house and (member? patch-here [ neighbors4 ] of house) [ set goal work ]
  if goal = work and (member? patch-here [ neighbors4 ] of work) [ set goal house ]
end

to direzione-amministrazione

  set segnalati patches with [segnalato? = true]

  if not any? patches with [segnalato? =  true] [set goal ufficio]
  if any? patches with [segnalato? = true ] [set goal one-of segnalati]

  if count patches with [segnalato? = true] > 1 [
    set goal min-one-of (patches with [segnalato? = true]) [distance myself]
  ]

  spurgo

end

to spurgo

  ask amministrazione [
    if [segnalato?] of patch-here = true [
      set ostruzione-da-rifiuti 0
      set segnalato? false
  ]
  ]

end


to variation-speed
  if rain? [
  ifelse [pcolor] of patch-ahead 2 = 103
  [set speed 0]
  [ifelse pcolor = 107
    [set speed 0.025]
    [set speed 0.05]
  ]
  ]


end

to ostruzioneO                                                              ;; il tombino cambia colore in base al livello di ostruzione
  if setup-manholes?  [
    ifelse ostruzione-da-rifiuti >= 600

      [ifelse ostruzione-da-rifiuti >= 1200
        [set pcolor 103]
        [set pcolor 107]
      ]
  [set pcolor 109]
  ]
end


to ostruzioneV                                                               ;; il tombino cambia colore in base al livello di ostruzione
if setup-manholes? [
  ifelse ostruzione-da-rifiuti >= 600

      [ifelse ostruzione-da-rifiuti >= 1200
        [set pcolor 103]
        [set pcolor 107]
      ]
  [set pcolor 109]
  ]
end


to attappamento
  ask cittadini [ if any? cittadini-on manholesO [set ostruzione-da-rifiuti ostruzione-da-rifiuti + valore-Scenario-degrado] ]
  ask cittadini [ if any? cittadini-on manholesV [set ostruzione-da-rifiuti ostruzione-da-rifiuti + valore-Scenario-degrado] ]

end

to set-Scenario-degrado
  if Scenario-degrado = "Basso" [
    set valore-Scenario-degrado random-float (2 - 0) + 0
  ]
  if Scenario-degrado = "Medio" [
    set valore-Scenario-degrado random (4 - 2) + 2
  ]
  if Scenario-degrado = "Alto" [
    set valore-Scenario-degrado random-float (6 - 4) + 4
  ]
end

to-report next-patch

  let choices neighbors with [ pcolor = white or pcolor = 109 or pcolor = 107 or pcolor = 103]                      ;;qui per farli passare sui tombini modificare con i colori che si impostano

  let choice min-one-of choices [ distance [goal] of myself ]                                                   ;;fai fare la distanza alla tartaruga
  report choice
end



 to-report next-patch2

  let choices neighbors with [ pcolor = white or pcolor = 109 or pcolor = 107 or pcolor = 103 ]                      ;;qui per farli passare sui tombini modificare con i colori che si impostano

  let choice min-one-of choices [ distance [goal] of myself ]                                                   ;;fai fare la distanza alla tartaruga
  report choice
end

首先,请编辑您的问题,而不是在更新后写下答案。这是您的代码的更简洁版本。

to go-amministrazione
  ask amministrazione
  [ face next-patch2
    fd 0.05
    direzione-amministrazione
  ]
end

to direzione-amministrazione
  set segnalati patches with [segnalato?]
  if-else any? segnalati
   [ set goal one-of segnalati
     set goal min-one-of segnalati [distance myself]
   ]
   [ set goal ufficio ]
  spurgo
end

我所做的是:

  1. 首先将 patches with [segnalato? = true] 替换为 patches with [segnalato?] - 您不需要 =true 位(您也可以说 not 而不是 =false)
  2. 用 segnalati 替换了所有其他 patches with [segnalato? = true](因为您实际上定义了这个补丁集 - 一旦定义了它,您应该只使用名称,这样 NetLogo 就不必继续重新创建补丁集数一数
  3. 认识到如果只有一个 segnalato 那么它也是最接近的 segnalato
  4. 将逻辑流合并到一个 if-else 语句中,因此 NetLogo 只有一个真值测试需要评估,而不是三个

看这段代码,显然可以删掉set goal one-of segnalati行,效果一样

说了这么多,我看不出这段代码有什么逻辑上的错误。每个 amministrazione 应该选择最接近的 segnalato 作为它的目标。

我要做的是创建更多的 segnalato,然后手动检查靠近 segnalato 的几个 amministrazione,看它是否选择了正确的。可能是您碰巧在不靠近任何 amministrazione 的位置创建了您的 segnalato,因此 amministrazione 最终大多选择相同的 segnalato,因为它恰好位于中心。