Настройка нового целевого патча, но исключающего ток в Netlogo

70
11

Я создаю симуляцию, которая копирует поведение shoplifter. Черепахи разделяются между "профессиональными" и "начинающими" торговцами магазинами, и если "профессионалы" восприняты безопасностью магазина, они могут (1/2) хотеть выбрать новый магазин для таргетинга "требуется новый магазин".

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

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

До сих пор я пытался сделать несколько дополнений к следующему коду, чтобы исключить текущее целевое хранилище, это включает в себя изменения "членских патчей", поскольку "магазин", в котором был обнаружен shoplifter, добавлен в этот "патч-набор", который будет информировать более позднюю команду. Кроме того, я составил список восходящих значений "безопасность", чтобы сообщить "shoplifter" о том, чтобы нацелить "хранилище" на "безопасность" (значение, определяющее уязвимость магазина), как и элемент 1 в списке, но я боюсь, что это может не работают, потому что их исходный целевой магазин может не быть элементом 0, поскольку они нацелены на хранилище с наименьшей "защитой" в радиусе 10 единиц.

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

*** Редактирование: в идеале я мог бы использовать код, чтобы использовать "mypatches", поэтому каждый раз, когда профессиональный shoplifter воспринимается в магазине, который может быть добавлен в mypatches, и последующее целевое хранилище может исключить все магазины, которые являются членами mypatches.

to new-target-store
ask turtles [ if
new-store-required = 1 and professional = 1 and (random-float 1 < 0.5) [
set target-store min-one-of store in-radius 10 [security]
]
]

end

Изменить 2: Я исправил, что было не так.

спросил(а) 2018-08-23T19:46:00+03:00 2 года назад
1
Решение
57

Вы можете захотеть включить свой код setup или урезанную его версию, если она действительно длинная, чтобы убедиться, что ответы соответствуют структуре, которую вы использовали. Я бы подошел к этому, имея turtles-own переменную turtles-own черепаху, чтобы сохранить свою текущую цель, которую они могут попытаться заполнить, если она пуста (вместо того, чтобы использовать для этого дополнительные булевы). Кроме того, вы можете конвертировать свои варианты 1/0 в true/false для более чистого кода. Проверьте этот пример:

globals [ stores ]

patches-own [ security ]

turtles-own [
current-target
professional?
mypatches
]

to setup
ca
ask n-of 20 patches [
set pcolor green
set security 1 + random 10
]
set stores patches with [ pcolor = green ]

crt 5 [
setxy random-xcor random-ycor
pd
set professional? one-of [ true false ]
set current-target nobody
set mypatches ( patch-set )
]
reset-ticks
end

Это создает мир с некоторыми зелеными патчами, которые сгруппированы в patch-set называемый stores. Кроме того, у вас есть черепахи с булевым professional? установленный как true, так и false. Они инициализируются без хранения current-target хранилища и пустой mypatches patch-set mypatches.

Теперь у вас есть черепахи, проверяющие, существует ли их current-target. Если это не так, они могут назначить хранилище этой переменной из набора магазинов (possible-targets, здесь), которые не равны patch-here запрашиваемой черепахи. Профессиональные воры могут дополнительно уточнить possible-targets чтобы исключить любые магазины, в которых они были задержаны, за исключением любых магазинов, которые являются членами их patch-set mypatches. Подробнее в комментариях:

to go
ask turtles [
; if you have no target currently
if current-target = nobody [
; Create a temporary patch set made up of all stores except for
; the one that I'm currently in
let possible-targets stores with [ self != [patch-here] of myself ]
ifelse professional? [
; Have professional thieves revise their possible targets to exclude
; any in the patchset mypatches, then choose a possible target
set possible-targets possible-targets with [ not member? self [mypatches] of myself ]
set current-target min-one-of possible-targets in-radius 10 [ security ]
] [
; Have amateur thieves choose randomly from the possible targets
set current-target one-of possible-targets
]
]
; move closer to your current target, or
; move to it exactly if you're near enough
ifelse current-target != nobody [
face current-target
ifelse distance current-target > 1 [
fd 1
] [
move-to current-target
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; *** do your shoplifting attempt/check here ***
; For this example, just have professional thieves sometimes
; add this patch to their mypatches patchset
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
if professional? and random-float 1 < 0.5 [
set mypatches ( patch-set mypatches patch-here )
]
; Reset current-target to nobody
set current-target nobody
]
] [
; if no suitable nearby targets, wander randomly
rt random 61 - 30
fd 1
]
]
tick
end

Если вы запустите это достаточно долго, ваши профессиональные воры перестанут быть в состоянии найти целевые магазины, поскольку они добавили все магазины в свою переменную mypatches.

ответил(а) 2018-08-24T02:07:00+03:00 2 года назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема