Выбор элемента из списка в Netlogo - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно выбрать объект в сумке, содержащей 20 элементов с атрибутами c (color) и s (size). Цвет и размер - это числа (например, c= {red = 256, black = 0, ... } = {256, 0, ...}). Как и в Python, я бы использовал random.choice в библиотеке numpy, я обнаружил в сети, что соответствующая функция в Netlogo является расширением rnd. В поисках возможного решения я сделал

Отредактировано:

breed[people person]
people-own 
  [
   ball
   size
   color 
   bag
  ]    
to setup
      create-people 5
  [ set color gray
    setxy random-xcor random-ycor
  ]
  ask people[
  set bag [ ] ; 0 items
  ]
end

Чтобы создать шары:

to create-balls
  set color random 300 ; color
  set size random-float 5 ; size
  let this-ball self
  ask one-of people [ ; ask one of people to put the ball created into the bag
      set bag fput this-ball bag ; add ball to the bag
  ]
end

Код ниже должен включатьчасть рисунка:

to draw
ask one-of people [
 rnd:weighted-one-of bag [ ] ; I do not know what I'd write in the brackets
]
end

Как вы можете легко видеть, у меня много сомнений относительно того, как реализовать код. Как выбрать один предмет из сумки в зависимости от его размера (или цвета)?

Не могли бы вы мне помочь с этим?

1 Ответ

2 голосов
/ 31 октября 2019

Вот полная модель, которая создает людей и шары в качестве агентов черепахи, и 30 из них выбираются в зависимости от их размера. Затем он открывает окно проверки для человека, который выбрал наибольшее количество шаров.

extensions [rnd]

breed [people person]
people-own [ my-balls ]

breed [balls ball]
balls-own [ chosen? ]

to setup
  clear-all
  create-people 20
  [ setxy random-xcor random-ycor
    set my-balls (turtle-set nobody)
  ]
  create-balls 50
  [ hide-turtle
    set size one-of [1 2 3 4 5]
    set color one-of [red white blue yellow]
    set chosen? false
  ]
  repeat 30 [draw-ball]
  inspect max-one-of people [count my-balls]
end

to draw-ball
  ask one-of people
  [ let bag-of-balls balls with [not chosen?]
    let choice rnd:weighted-one-of bag-of-balls [size]
    ask choice [set chosen? true]
    set my-balls (turtle-set my-balls choice)
  ]
end

Некоторые вещи, на которые следует обратить внимание:

  1. В этом коде НЕТ списков. Есть ситуации, когда вы должны использовать списки. Обычное использование включает память, где важен порядок (например, вы хотите отслеживать только 5 последних увиденных людей) или когда один и тот же агент может появляться несколько раз. И команды списка очень мощные. Однако, если вам не нужен список, вы должны использовать наборы агентов.
  2. У каждого человека есть своя сумка под названием «my-balls», в которой находятся выбранные им шары. Это инициализируется как список черепах как часть установки.
  3. Я использовал переменную с именем 'selected?'он принадлежит каждому шару для отслеживания того, находится ли он в сумке для следующего выбора. Тогда мешок с шарами создается только как все шары, которые еще не выбраны.
  4. Код для взвешенного случайного выбора (при выборе из наборов агентов) просто имеет имя переменной, содержащей вес в качестве репортера,но вы можете использовать некоторую функцию, такую ​​как rnd:weighted-one-of bag-of-balls [size ^ 2], если вам нужна более сложная схема взвешивания.
...