Decirle a una tortuga en netlogo en qué posición para ir después del procedimiento
-
21-12-2019 - |
Pregunta
Por lo tanto, tengo mi robot con éxito el riego de las plantas como por este proyecto NetLogo posición de la Tortuga
y después de la finalización de todas las plantas (tortugas) siendo "regadas" me gustaría que la tortuga para volver a la base.Por lo tanto, tengo esta línea:if count leaves = 0 [move-to base 0]
a continuación,
if at-base-no-leaves [stop]
donde at-base-no-leaves
se define como
to-report at-base-no-leaves
ifelse any? bases-here and count leaves = 0
[report true]
[report false]
end
Pero me da este error:
Usted no puede utilizar la garrapata en una tortuga contexto, debido a que la garrapata es solo observador.
Cómo puedo obtener el robot se mueva en la base y parar allí?Cualquier ayuda es muy apreciada.
Aquí está mi código completo:
;plant watering agent
breed [robots robot] ; Name of the breed of plant robots
breed [leaves leaf] ; Name of the breed of plants in need of water
breed [ watered water-1] ; Name of the breed of watered plants
breed [ bases base] ; Name of the breed of charging station
globals
[
background-colour ; colour of the background except for obstacles
obstacles-colour ; colour of the obstacles
robot-colour ; colour of the robot
clock ; tracking time
watered-plants ; plants watered
distance-traveled ; distance traveled by the robot
battery-life ; battery life left
water-poured ; how much water has been used
]
to setup
;clear all
clear-all
set-default-shape robots "ufo side" ; sets shapes for agent
set background-colour green + 3 ; set colour of background light green
set obstacles-colour brown ; set colour of obstacles brown
set robot-colour gray ; set colour of robot to gray
setup-base
set clock 0 ;initialize time
set distance-traveled 0 ;initialize distance
set battery-life 100 ;initialize battery life to 100%
set water-poured 0 ;initialize water used to 0
;set boundary obstacles. These patches tell the robot to stay within identified bounds.
ask patches
[
set pcolor background-colour ; set colour of background
if (pxcor >= max-pxcor - boundary-width) ; boundary width can vary
[ set pcolor brown ]
if (pxcor <= min-pxcor + boundary-width)
[ set pcolor brown ]
if (pycor >= max-pycor - boundary-width)
[ set pcolor brown ]
if (pycor <= min-pycor + boundary-width)
[ set pcolor brown ]
]
setup-leaves ;add plants to the world. These are added after the border is created so not to create the plants outside of the 'border of the house'
; creates colour, size and random location of single robot
create-robots 1
[
set size robot-size
set color robot-colour
;let this-patch one-of patches with [pcolor != obstacles-colour] ; sets an initial random position within the outside boundary; this works if we want to set a random position every time for the robot
;set xcor [pxcor] of this-patch
;set ycor [pycor] of this-patch
setxy 15 -14 ; robot starts at the charging station
]
end
; creating plants (leaves)
to setup-leaves
create-leaves num-plants [ ; number of plants can vary
rand-xy-co ; set random positions for the plants
set shape "flower" ; initialize the plant to color red and size 2
set color red
set size 2
]
end
;setup base (charging station)
to setup-base
create-bases 1 [
set shape "electric outlet"
set color white
setxy 16 -15
set heading 0
set size 3
]
end
;detecting a plant (leaf)
to-report detect-leaf
ifelse any? leaves-here
[report true] ; set as true if plant breed is detected
[report false]
end
;watering a leaf (plant)
to water-leaf
set watered-plants watered-plants + 1 ;when a plant is watered, increase counter by 1
set water-poured watered-plants * ((4 * (100 - soil-moisture)) / 50) ; when plant is watered, increase water-poured counter
; this formula is based on the average amount of water a houseplant needs >> 4 oz at 50% soil moisture
set clock clock + 10 ; add 10 ticks to the clock when watering plants since the robot has to spend time to water
set battery-life battery-life - 5 ; 5% of battery life is spent for each plant watered
ask one-of leaves-here [ ; mark breed as watered when plant is watered; change flower color to yellow
set breed watered
set shape "flower"
set color yellow
set size 3 ;increase the size of the flower (grown)
]
end
to-report at-base
ifelse any? bases-here
[report true]
[report false]
end
to-report at-base-no-leaves
ifelse any? bases-here and count leaves = 0
[report true]
[report false]
end
to charge
set battery-life 100 ;charge with 100% battery
set clock clock + 10 ;add additional time to the clock
end
; This defines how the robot should move.
to make-move
if battery-life <= 0 [stop] ; robot cannot run if it doesn't have any battery life
if at-base and battery-life <= 99 [charge]
;This behaviour is modified from the Look Ahead Example model in the Models Library
let this-patch patch-ahead 1
if detect-leaf [water-leaf stop]
ifelse (this-patch != nobody) and ([pcolor] of this-patch = obstacles-colour)
[ lt random-float 360 ] ; We see an obstacle patch in front of us. Turn a random amount.
[ fd 1 ] ; Otherwise, it is safe to move forward.
set distance-traveled distance-traveled + 1 ; every step increases distance-traveled counter by 1
end
;Procedure when the button Go is pressed
to go
;The robot moves around.
if count leaves = 0 [move-to base 0]
if at-base-no-leaves [stop] ;stop when all leaves are watered
set clock clock + 1 ;update time
;wait .05 ; wait for better viewing
set battery-life 100 - (distance-traveled / 900) ; battery life varies based on distance traveled
ask robots [without-interruption [make-move]] ;robots move
update-and-plot ;update the graphs
tick
end
;plot velocity graph
to update-and-plot-velocity
set-current-plot "Velocity"
plotxy distance-traveled clock
end
;plot water usage graph
to update-and-plot-water-usage
set-current-plot "Water Usage"
plotxy water-poured watered-plants
end
;plot energy usage graph
to update-and-plot-energy-usage
set-current-plot "Energy Usage"
plotxy clock (100 - battery-life)
end
;plot watered plants graph
to update-and-plot-watered-plants
set-current-plot "Watered Plants"
plotxy clock watered-plants
end
;plot wilting plants graph
to update-and-plot-wilting-plants
set-current-plot "Wilting Plants"
plotxy clock count leaves
end
;call all the graphs
to update-and-plot
update-and-plot-velocity
update-and-plot-water-usage
update-and-plot-energy-usage
update-and-plot-watered-plants
update-and-plot-wilting-plants
end
; Creates obstacles in the environment by drawing them on the world
to make-obstacles
if mouse-down?
[ ask patches
[ if ((abs (pxcor - mouse-xcor)) < 1) and ((abs (pycor - mouse-ycor)) < 1)
[set pcolor obstacles-colour]]
]
end
; Removes obtacles in the environment.
to erase-obstacles
if mouse-down?
[ ask patches
[ if ((abs (pxcor - mouse-xcor)) < 1) and ((abs (pycor - mouse-ycor)) < 1)
[set pcolor background-colour]]
]
end
; Detecting obstacles
; Obstacles are obstacles and other agents.
to-report detect-obstacle
ifelse any? patches in-cone 2 90 with [pcolor = brown] or any? other robots in-cone 2 90
[report true]
[report false]
end
; The robot avoids any obstacles in the environment.
;to avoid-obstacles
;if (count patches in-cone radius-length radius-angle with [pcolor = obstacles-colour] > 0) ; there is an obstacle nearby
;[
;set heading heading + random 45 - random 45
;]
;end
; This instructs the agent to move the pen up if it is down, or vice versa.
to plot-paths
ifelse (pen-mode = "up")
[ pen-down ]
[ pen-up ]
end
; Utilities. Positions a new turtle randomly on the grid, taking care not to
;place it on top of another turtle
to rand-xy-co
move-to one-of patches with [ pcolor != obstacles-colour and not any? turtles-here ]
end
Solución
Usa bases-here
en su at-base-no-leaves
el reportero, que hace que sea una "tortuga o el parche de" reportero.Entonces usted está llamando at-base-no-leaves
directamente en su go
el procedimiento, que se convierte en hace go
una "tortuga o parche" procedimiento...en la que usted no puede llamar a la garrapata.
Para evitar este problema, simplemente llame at-base-no-leaves
desde el contexto en el que se supone que se llama de, es decir, una tortuga contexto:
ask robots [
if count leaves = 0 [move-to base 0]
if at-base-no-leaves [stop]
]
Como en el interior, hay un patrón que se utiliza en at-base-no-leaves
y algunos otros reporteros que debe evitar:
to-report at-base-no-leaves
ifelse any? bases-here and count leaves = 0
[report true]
[report false]
end
No hay ninguna necesidad de que el ifelse
, aquí:que son, básicamente, sólo la utilizan para convertir una expresión booleana en...una expresión booleana del mismo valor (por ejemplo, si es true, false si el valor es false).Sólo tiene que utilizar su condición directamente:
to-report at-base-no-leaves
report any? bases-here and count leaves = 0
end
También se puede sustituir count leaves = 0
con not any? leaves
para la coherencia y la claridad.
Finalmente, usted probablemente tendrá que poner reset-ticks
al final de su setup
procedimiento.