告诉netlogo中的乌龟在程序完成后要去哪个位置

时间:2014-07-30 01:52:16

标签: netlogo

所以,我按照这个项目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

1 个答案:

答案 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