每只海龟都需要从同一个代理集中挑选不同的代理



我的品种(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. 将所有其他patches with [segnalato? = true]替换为 Segnalati(因为您实际上定义了此补丁集 - 一旦定义,您应该只使用该名称,以便 NetLogo 不必不断重新创建补丁集来计算它。
  3. 认识到如果只有一个塞尼亚拉托,那么它也是最近的塞尼亚拉托
  4. 将逻辑流合并到一个if-else语句中,因此 NetLogo 只有一个真值测试要评估,而不是三个

查看此代码,您显然可以删除行set goal one-of segnalati并具有相同的效果。

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

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

最新更新