Gli agenti del logo netto che sono di fila e separati da una patch vuota devono morire
-
12-11-2019 - |
Domanda
Immagina di avere la stessa razza di tartaruga che è posizionata come sotto ed è separata da una patch vuota.
1234 56 78 9 <br/>
AAAA AA AA A
Quando viene generata una posizione casuale. Lascia che la posizione 2 sia il bersaglio, voglio che tutti gli agenti posizionati a 1 2 3 4 muoiano poiché tutti dovrebbero essere collegati insieme. Allo stesso modo 5 e 6 moriranno se la posizione 5 o 6 viene selezionata.
Ho provato a usare link e vicini ma non sembrano funzionare. Quando l'ho provato, le tartarughe in posizione 4 e 3 sono le uniche desideri che muoiono.
Di seguito è riportato il codice che ho usato per collegare le tartarughe:
if (any? virus-on neighbors)
[set create-links-with virus-on neighbors [tie]]
Di seguito è riportato il codice che ho usato per uccidere la turle:
ask virus-on patch in_xcor in_ycor [
ask link-neighbors [die]
die
]
Soluzione
Una cosa certa è che non è necessario affrontare il problema di creare collegamenti tra le tartarughe che stai per uccidere. Il tuo problema principale è identificare quali tartarughe devono morire e questo può essere realizzato con una procedura ricorsiva: hai una tartaruga target che deve morire, ma vuoi che chieda ai suoi vicini di fare lo stesso (e loro, a loro volta, per chiedere loro, ecc.)
Il processo è reso leggermente più complesso dal fatto che uccidere una tartaruga nel mezzo della ricorsione rovini le cose, ma puoi aggirare questo usando una variabile di tartaruga che funge da bandiera per contrassegnare le tartarughe che devono essere uccise, E poi uccidendo tutti quelli alla fine.
Il seguente codice dovrebbe fornire un esempio completamente funzionante:
turtles-own [ marked-for-death ]
to setup
clear-all
ask patch 1 0 [ sprout 1 ]
ask patch 2 0 [ sprout 1 ]
ask patch 3 0 [ sprout 1 ]
ask patch 4 0 [ sprout 1 ]
ask patch 6 0 [ sprout 1 ]
ask patch 7 0 [ sprout 1 ]
ask patch 9 0 [ sprout 1 ]
end
to go
ask turtles [ set marked-for-death false ]
ask turtles-on patch 2 0 [ mark-for-death ]
ask turtles with [ marked-for-death = true ] [ die ]
end
to mark-for-death
set marked-for-death true
ask (turtles-on neighbors) with [ marked-for-death = false ] [ mark-for-death ]
end
Questo esempio uccide la tartaruga sulla patch 2 0 e tutti quelli che sono collegati ad essa. Dovrai regolarlo per scopi propri ma dovrebbe essere sufficiente per farti andare ...
Modificare:
Versione leggermente più elegante, in quanto non richiede una variabile di tartaruga (supponendo lo stesso setup
procedura):
to go
let marked [ marked-for-death [] ] of turtles-on patch 2 0
ask turtle-set marked [ die ]
end
to-report marked-for-death [ marked ]
set marked fput self marked
ask (turtles-on neighbors)
with [ not (member? self marked) ]
[ set marked marked-for-death marked ]
report marked
end