Gli agenti del logo netto che sono di fila e separati da una patch vuota devono morire

StackOverflow https://stackoverflow.com/questions/9445844

  •  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
 ]
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top