Установить конечный пункт назначения агентов для многоугольника в Netlogo - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь, чтобы агент начинался внутри многоугольника, называемого зимой, и заканчивался многоугольником, называемым летом. Мне удалось успешно запустить агент в зимнем полигоне, но я изо всех сил пытаюсь установить конечный пункт назначения для патча в летнем полигоне. Я продолжаю получать эту ошибку для оператора назначения патча:

"WITH expected a true/false value from (patch 1 63), but got 0 instead.
error while observer running ONE-OF
  called by procedure SETUP
  called by Button 'setup'"

Вот мой код:

    extensions [ gis ]
    globals [
      elevation
      vegetation
      roads
      fence
      q
      max-energy
      dest-patch
      winter
      summer

    ]
    patches-own [
      used?
      pelev
      veg
      is-road?
      is-fence?
      veg-suitability
      resource
      elev-suitability
      is-winter?
      is-summer?
    ]

    turtles-own [
      start-patch
      target-patch
      energy

    ]

    to setup
      clear-all

      set max-energy 10
      set dest-patch one-of patches with [is-summer?] ; **this is where I get my error when I try to setup my model.

      set winter gis:load-dataset ("Lowuse_winter.shp")
      ;gis:set-world-envelope gis:envelope-of winter
      ask patches [ set is-winter? false]
      ask patches gis:intersecting winter
      [ set is-winter? true]

      gis:set-drawing-color blue
      gis:draw winter 1

      set summer gis:load-dataset ("Lowuse_summer.shp")
      ;gis:set-world-envelope gis:envelope-of summer

      ask patches [ set is-summer? false]
      ask patches gis:intersecting summer
      [ set is-summer? true]

      gis:set-drawing-color green
      gis:draw summer 1

      ;; set fence gis:load-dataset ("highfence_project.shp")
      ;gis:set-world-envelope gis:envelope-of fence

     ;'ask patches [ set is-fence? false ]
      ;ask patches gis:intersecting fence
      ;[ set is-fence? true ]

      ;gis:set-drawing-color [255   0   0]
      ;gis:draw roads 1
      ;ask patches[
      ;  if is-fence? = true [set pcolor red]
      ;]


      crt 15
      [
        set size 4
        set energy random (deer-gain-from-food)
        set start-patch patch-here
        set color yellow
    ;    set xcor -17
    ;    set ycor -17
        move-to one-of patches with [is-winter?]
        pen-down
      ]
      reset-ticks
    end


to go
  ask turtles [
    if patch-here = dest-patch [stop]
    ifelse energy < deer-gain-from-food / 10 ;; If only 10% of energy
    [
      ifelse [resource] of patch-here > 0 ;; Is there anything to eat
      [; If there is - eat it and restore energy
        forage
      ]
      [ ; If not - mvoe to a neighboring patch with resources
        forage-move
      ]
    ]
    [
      migrate-move
    ]
    set energy energy - 1
  ]

    paint-resource

    tick
end

to forage
  set energy energy + deer-gain-from-food
  ask patch-here [
;    set resource resource - 0.1
    set resource 0
  ]
end

to forage-move
  set target-patch max-one-of neighbors with [ veg-suitability > 0] [ resource ]
  move-to target-patch ; error for "move-to expected input but got nobody instead"
  set used? TRUE
end

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Полученное вами сообщение, что «WITH ожидал значение true / false от (patch 1 63), но вместо этого получил 0». было связано с тем, что is-summer? был инициализирован с clear-all до 0, поэтому

set dest-patch one-of patches with [is-summer?]

дает оператору with номер ноль, а не значение true / false. Эта строка кода должна go позже в процедуре установки, после , патчи установили для своей переменной is-summer? либо true, либо false, возможно, непосредственно перед строкой

;; set fence gis:load-dataset ("highfence_project.shp")

Обратите внимание, что ответ ZINAN10 исключает сообщение об ошибке, но если разместить его там, где он сейчас, это эквивалентно высказыванию

set dest-patch one-of patches with [0 = true]

, что, конечно, никогда не соответствует действительности. dest-patch будет nobody. В общем, если переменная действительно имеет значение true / false, вы не должны использовать оператор =, поскольку он будет скрывать именно ту ошибку, с которой вы здесь столкнулись.

Надеюсь, это поможет, Charles

1 голос
/ 11 апреля 2020

Я не уверен, что вы подразумеваете под конечным пунктом назначения, но из того, что я вижу, я думаю, может быть, у вас должно быть здесь истинное или ложное значение.

set dest-patch one-of patches with [is-summer? true/false]

Попробуйте или уточните, где ваша ошибка is.

Отредактируйте, да, попробуйте добавить туда значение true или false, сейчас оно пустое.

...