每个 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
我所做的是:
- 首先将
patches with [segnalato? = true]
替换为 patches with [segnalato?]
- 您不需要 =true 位(您也可以说 not
而不是 =false)
- 用 segnalati 替换了所有其他
patches with [segnalato? = true]
(因为您实际上定义了这个补丁集 - 一旦定义了它,您应该只使用名称,这样 NetLogo 就不必继续重新创建补丁集数一数
- 认识到如果只有一个 segnalato 那么它也是最接近的 segnalato
- 将逻辑流合并到一个
if-else
语句中,因此 NetLogo 只有一个真值测试需要评估,而不是三个
看这段代码,显然可以删掉set goal one-of segnalati
行,效果一样
说了这么多,我看不出这段代码有什么逻辑上的错误。每个 amministrazione 应该选择最接近的 segnalato 作为它的目标。
我要做的是创建更多的 segnalato,然后手动检查靠近 segnalato 的几个 amministrazione,看它是否选择了正确的。可能是您碰巧在不靠近任何 amministrazione 的位置创建了您的 segnalato,因此 amministrazione 最终大多选择相同的 segnalato,因为它恰好位于中心。
我的品种 (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
我所做的是:
- 首先将
patches with [segnalato? = true]
替换为patches with [segnalato?]
- 您不需要 =true 位(您也可以说not
而不是 =false) - 用 segnalati 替换了所有其他
patches with [segnalato? = true]
(因为您实际上定义了这个补丁集 - 一旦定义了它,您应该只使用名称,这样 NetLogo 就不必继续重新创建补丁集数一数 - 认识到如果只有一个 segnalato 那么它也是最接近的 segnalato
- 将逻辑流合并到一个
if-else
语句中,因此 NetLogo 只有一个真值测试需要评估,而不是三个
看这段代码,显然可以删掉set goal one-of segnalati
行,效果一样
说了这么多,我看不出这段代码有什么逻辑上的错误。每个 amministrazione 应该选择最接近的 segnalato 作为它的目标。
我要做的是创建更多的 segnalato,然后手动检查靠近 segnalato 的几个 amministrazione,看它是否选择了正确的。可能是您碰巧在不靠近任何 amministrazione 的位置创建了您的 segnalato,因此 amministrazione 最终大多选择相同的 segnalato,因为它恰好位于中心。