Как управлять взаимодействием агентов в простых эволюционных играх AnyLogic?

Изучая возможности моделирования AnyLogic на основе агентов, я хочу смоделировать простую эволюционную игру.

Настройка. Существует N агентов (четное число), каждый из которых имеет два состояния, то есть Cooperate и Defect, и они могут переключаться между состояниями в зависимости от результатов взаимодействия за период времени. В следующем периоде (итерации или шаге) они снова должны взаимодействовать во вновь совпадающих случайных парах. Я предполагаю, что популяция должна каким-то образом случайным образом разделиться на пары (хотя некоторые люди предлагают использовать своего рода суперагента, брокера, который отвечает за координацию всех уникальных пар).

В настоящий момент я вижу примеры игр в AnyLogic, например Segregation game, но настройки другие, и я не нашел примерной модели или учебника, где агенты взаимодействуют случайными парами (некоторые ссылки будут Добро пожаловать).

Вопрос: Как смоделировать такую ​​настройку, чтобы убедиться, что каждый агент взаимодействовал парами в каждый период (такт) и ни один из них не оставался без взаимодействия, и ни один из них не участвовал более чем в одной паре. Любые подсказки приветствуются.

Примечание. Тип взаимодействия в парах (одноразовая игра) на данный момент не важен (скажем, один агент отправляет сообщение своему собеседнику). Я за логикой организации взаимодействий.


person garej    schedule 16.11.2019    source источник


Ответы (1)


Предположим, что ваша популяция агентов относится к типу MyAgent с популяцией myAgents. Каждый из этих агентов имеет двунаправленное соединение под названием agentLink, которое связывает одного агента с другим того же типа, что и на этом рисунке:

ссылка агента

Затем для создания случайных пар вы можете использовать этот код:

for(MyAgent a : myAgents){
    a.agentLink.disconnect(); // remove previous connections
}
for(MyAgent a : myAgents){
    if(!a.agentLink.isConnected()){ //check if there is no pair already
       MyAgent b=randomWhere(myAgents,m->!m.agentLink.isConnected() && !m.equals(a)); //find a random agent which is not equal to "a" and not connected to someone else
       a.agentLink.connectTo(b); //link them together
    }
}

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

person Felipe    schedule 16.11.2019
comment
все работает отлично, спасибо. Еще один вопрос: в каком месте следует вводить этот фрагмент кода? Я вставил его Main > Space and Network > On before step: с установленным Enable steps (я понимаю, что ответ зависит от идеи моделиста, но просто как рекомендация по умолчанию). - person garej; 16.11.2019
comment
вы сказали это ... это зависит от вашей модели :) Нет рекомендаций по умолчанию - person Felipe; 16.11.2019