NetLogo: синтаксис foreach - PullRequest
       15

NetLogo: синтаксис foreach

1 голос
/ 09 июля 2019

Очень простой вопрос, я не понимаю, почему мой код foreach ничего не делает (без сообщений об ошибках, но без последствий). Таким образом, у моих черепах есть 3-мерная переменная (намерение), которая предварительно установлена ​​на [0 0 0]. Моя последняя проблема намного сложнее, чем это, но проще говоря, я сейчас пытаюсь изменить каждое измерение этого вектора на единицу, то есть [1 1 1].

Я создал процедуру под названием change-intention, которая использует foreach, чтобы произвести это, безрезультатно:

to change-intention
ask turtles [
    (foreach intention [ x -> set x 1])
    ]
end

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

Спасибо!

1 Ответ

3 голосов
/ 09 июля 2019

Несколько проблем. Во-первых, списки не являются изменяемыми - если вы хотите изменить значение в списке, вы должны создать новый список с этим значением. Во-вторых, вы не можете использовать set для этого, вы должны использовать replace-item.

Код самодостаточен - откройте новую модель и попробуйте ее, изменив вызов в процедуре testme на разные реализации. Процедура «изменение намерения» - это то, как вы в настоящее время думаете об этом (в любом случае, моя интерпретация). Процедура изменения-интерпретации2 - это способ реализации вашего подхода, замены каждого элемента и создания нового списка (для устранения выявленных проблем).

Однако, лучший способ сделать это с помощью процедуры map вместо foreach, поскольку все значения изменяются сразу, а не циклически перебирают список и обрабатывают каждое из них. Конечно, это не так просто реализовать в вашей реальной модели.

turtles-own [intention]

to testme
  clear-all
  create-turtles 1
  [ set intention [0 0 0]
  ]
  ask turtles [ type "before call:" print intention ]
  change-intention2
  ask turtles [ type "after call:" print intention ]
  reset-ticks
end

to change-intention1
ask turtles
[ foreach intention
  [ x ->
      print "here"
      set intention 1
  ]
]
end

to change-intention2
ask turtles
[ foreach intention
  [ x ->
      let pp position x intention
      type "here:" print pp
      set intention replace-item pp intention 1
  ]
]
end

to change-intention3
ask turtles
[ set intention map [ x -> 1 ] intention
]
end
...