Decirle a una tortuga en netlogo en qué posición para ir después del procedimiento

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

  •  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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top