所以,我按照这个项目NetLogo Turtle position
让我的机器人成功浇灌植物在所有植物(乌龟)完成浇水后#p>我希望乌龟能够回到基地。
所以,我有这条线:
if count leaves = 0 [move-to base 0]
然后,
if at-base-no-leaves [stop]
其中at-base-no-leaves
定义为
to-report at-base-no-leaves
ifelse any? bases-here and count leaves = 0
[report true]
[report false]
end
但是我收到了这个错误:
你不能在海龟环境中使用tick,因为tick只是观察者。
我怎样才能让机器人在基地移动并停在那里?任何帮助表示赞赏。
这是我的完整代码:
;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
答案 0 :(得分:1)
您在bases-here
记者中使用了at-base-no-leaves
,这使得它成为了一只海龟或补丁&#34;记者。然后,您可以直接在at-base-no-leaves
程序中调用go
,这样就会使go
成为一只&#34;乌龟或补丁&#34;程序......你不能打电话给。
要避免此问题,只需从应该调用的上下文中调用at-base-no-leaves
,即乌龟上下文:
ask robots [
if count leaves = 0 [move-to base 0]
if at-base-no-leaves [stop]
]
作为一个内部,你可以在at-base-no-leaves
和其他一些你应该避免的记者中使用一种模式:
to-report at-base-no-leaves
ifelse any? bases-here and count leaves = 0
[report true]
[report false]
end
这里不需要ifelse
:你基本上只是用它来将一个布尔表达式转换为......一个相同值的布尔表达式(例如,如果为true则为true,如果为false则为false) 。直接使用你的条件:
to-report at-base-no-leaves
report any? bases-here and count leaves = 0
end
您还可以将count leaves = 0
替换为not any? leaves
,以保持一致性和清晰度。
最后,您可能需要在setup
程序结束时放置reset-ticks
。