Попросите черепах противостоять множеству патчей с наибольшей суммой - PullRequest
0 голосов
/ 05 июля 2019

Я работаю в NetLogo над моделью движения животных. Я создал шесть различных наборов агентов, которые содержат патчи в конусе 16 60 (попросив моих черепах повернуть rt 60, прежде чем вычислять следующий набор агентов). Затем я попросил каждый набор агентов вычислить сумму взвешенного индекса (переменная исправления между 0-1) и сохранить значение в глобальной переменной. Итак, теперь я дал шесть областей, окружающих каждую черепаху, и значение, которое представляет собой ценность ресурса всего набора агентов для черепахи. Я пытаюсь заставить своих черепах распознать, какой набор агентов имеет наибольшую сумму взвешенного индекса, и перейти к случайному патчу внутри него. Я сталкиваюсь с проблемами, потому что глобальная переменная, представляющая суммированный взвешенный индекс, не привязана к расположению набора агентов, поэтому я не знаю, как перейти от этого шага. Моя единственная идея - создать сложную цепочку ifelse, где я прошу черепах сравнивать суммированные значения и смотреть на набор агентов, соответствующий этому значению, но это кажется довольно длинным. Будем очень благодарны за любые идеи или предложения о том, как решить эту проблему или прояснить мой вопрос!

Я попытался составить список и вызвать with-max, но, опять же, здесь сообщается о максимальной сумме в виде числа, а не набора операторов, которому он принадлежит.

; This code gets called in my go procedure as ask bears []
;I am first creating the agentsets
  set heading 0
  set n-patches patches in-cone 16 60
  rt 60
  set ne-patches patches in-cone 16 60
  rt 60
  set se-patches patches in-cone 16 60
  rt 60    
  set s-patches patches in-cone 16 60
  rt 60    
  set sw-patches patches in-cone 16 60
  rt 60    
  set nw-patches patches in-cone 16 60

; Now I'm adding the index value for all patches within each agentset
  set n-sum sum [weighted-index] of n-patches
  set ne-sum sum [weighted-index] of ne-patches
  set se-sum sum [weighted-index] of se-patches
  set s-sum sum [weighted-index] of s-patches
  set sw-sum sum [weighted-index] of sw-patches
  set nw-sum sum [weighted-index] of nw-patches

; Lost after this

1 Ответ

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

Во-первых, нет необходимости использовать глобальные переменные, просто используйте let для создания временной локальной переменной.

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

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

to testme
  clear-all
  ask patches [ set pcolor one-of [ 28 54 110 ] ]
  create-turtles 3
  [ setxy random-xcor random-ycor
    set color white
  ]
  ask turtles
  [ set heading 0
    let n-patches patches in-cone 16 60
    rt 60
    let ne-patches patches in-cone 16 60
    rt 60
    let se-patches patches in-cone 16 60
    rt 60
    let s-patches patches in-cone 16 60
    rt 60
    let sw-patches patches in-cone 16 60
    rt 60
    let nw-patches patches in-cone 16 60 
    let directions-list shuffle (list n-patches ne-patches se-patches s-patches sw-patches nw-patches)
    print directions-list
    let sums-list map [ thisDir -> sum [pcolor] of thisDir ] directions-list
    print sums-list
    let max-sums max sums-list
    print max-sums
    let chosen position max-sums sums-list
    print chosen
    face one-of item chosen directions-list
  ]
end

Вы могли бы использовать to-report процедуры, чтобы упростить вычисление шести наборов агентов, но я этого не сделал, так как хотел использовать ваш код, чтобы обеспечить его читабельность

Это распечатывает вещи, чтобы вы могли видеть, что они делают. Обратите внимание, что shuffle предназначен для обеспечения случайного выбора, если 2 или более имеют одинаковые итоги. Помните, что списки NetLogo индексируются 0, поэтому position будет возвращать от 0 до 5, а не от 1 до 6.

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

...