netlogo взаимоисключающие агентские наборы одновременно
У меня есть 300 работников, и я хочу разделить их на 3 набора по 100 (сейчас, в конце концов, я разделю их, возможно, неравномерно) на основе двух рейтингов. Я написал варианты для достижения следующих целей:
Выберите верхние 100 на X, назначьте значение 1 для переменной A. Выберите слишком 100 на Y (кому УЖЕ не было присвоено значение 1 на A) и назначьте значение 2 для переменной A. Выберите остаток и назначьте значение 3 для A
Я попробовал около дюжины подходов, но безуспешно. Самое близкое, что я получил, - это получить первые 100. НО, поскольку есть связи, есть несколько рабочих, привязанных к 100-му рангу в X. NETlogo случайным образом выбирает одного из них, чтобы получить значение 1 в переменной A, что нормально. Проблема в том, что из-за того, что я не смог выяснить, как одновременно создать три взаимоисключающих набора агентов, используя 2 критерия, я заканчиваю тем, что переназначаю работников со значения 1 на значение 2 на A. Теперь я могу исправить это вручную, но в конечном итоге это будет невозможно.
Вот код, который сделал первое присвоение значения:
спросите максимум 100 рабочих [LPAdv] [set AWeight 1]
Кажется, проблема в том, что я не могу найти способ сослаться на верхние 100 на Y из оставшихся 200. Также я не могу сослаться на нижние 100 из оставшихся 200, потому что работник может быть в Топ-100 на X но НЕ в Top 100 на Y, и в этом случае они (ошибочно) попадут в последовательно идентифицированный набор агентов, если я не удалю их из операции. Я пытался использовать член? и человек другие возможности. По сути, я не знаю, как одновременно сбросить первые 100 из 300 и только "отсортировать" оставшиеся 200, чтобы выполнить назначение.
Я просмотрел несколько источников ответа, но пока безрезультатно. Я добился большого прогресса в своем коде с субботы, но это камень преткновения.
Любая помощь с благодарностью!
Спасибо! SLuke
2 ответа
ПОСТАНОВИЛИ! (УРА!)
В случае, если у кого-то еще есть проблема, я сделал следующее:
ask max-n-of 100 workers [LPAdv] [set AWeight 1]
ask workers [ifelse AWeight = 1 [set LPMid2 -1000] [set LPMid2 LPMid]]
ask max-n-of 100 workers [LPMid2] [set MWeight 1]
ask workers [set PreWeight ( AWeight + MWeight )]
ask workers [if PreWeight = 0 [set RWeight 1]]
Обратите внимание, что LPMid2 устанавливает AWeight= от 1 до -1000, что является выходом за пределы диапазона для фактической переменной LPMid, которая понадобится мне позже.
Извините, что беспокою список; Я надеюсь, что ответ будет полезен для кого-то еще, если у них есть подобная проблема.
Вот, пожалуй, более легкая для чтения и более масштабируемая (не проверенная) версия вашего кода, которая, мы надеемся, даст вам некоторые идеи о том, как исключить некоторые черепахи, когда вы пытаетесь выбрать из подмножества.
ask max-n-of 100 workers [LPAdv] [set AWeight 1]
ask max-n-of 100 workers with [AWeight != 1] [LPMid2] [set MWeight 2]
Кроме того, вам не нужны два оператора ask в операторе and (а запрос в два раза менее эффективен):
ask workers
[ set PreWeight ( AWeight + MWeight )
if PreWeight = 0 [set RWeight 1]
]