Блокировка выхода (с определенной вероятностью)
Вы можете использовать встроенные распределения вероятностей в AnyLogic, чтобы получить один из ваших вариантов с требуемой вероятностью. В вашем случае вы можете использовать равномерное распределение для каждого выхода, чтобы определить, является ли он препятствием или нет. Запустите это, например, при запуске модели. Поскольку мы не можем реально «преградить» целевую линию, мы идем наоборот: мы собираем тех, кто не загораживается, и разрешаем выбирать только тех из них, которые являются пунктами назначения. Для этого мы сохраняем каждый доступный выход в Коллекции availableExits . Позже, когда мы решаем, какой выход выбрать, мы сообщим функции принятия решения, что нужно учитывать только те из списка. Поместите это в раздел On Startup ваших Main свойств:
if(uniform(0,1)<0.8){ // 20% probability of obstruction
availableExits.add(targetLine1);
}
if(uniform(0,1)<0.6){ // 40% probability of obstruction
availableExits.add(targetLine2);
}
if(uniform(0,1)<0.9){ // 10% probability of obstruction
availableExits.add(targetLine3);
}
Определить коллекцию ДоступноВыходы как это:
![Collection](https://i.stack.imgur.com/tDQMr.png)
Поток процесса для эвакуации
Для эвакуации вы можете подготовить отдельный технологический процесс, в который агенты входят при запуске эвакуации. Этот поток может быть присоединен к основному потоку процесса через порты ccl / эвакуации блоков пешеходной библиотеки.
![Process](https://i.stack.imgur.com/xfXP0.png)
В отдельном потоке процесса эвакуации поместите блок moveTo, в котором назначение определяется функцией.
![GoTo Block](https://i.stack.imgur.com/Hl3pq.png)
Ближайший доступный выход
Эта функция будет перебирать все выходы в вашей коллекции availableExits и выбирать ближайший. Входной параметр имеет тип Пешеход и называется ped , выходной параметр имеет тип TargetLine .
![Function Head](https://i.stack.imgur.com/fv7fA.png)
if(availableExits.size()<1){
error("No exit is available");
return null;
}
double currentDistance = ped.getPosition().distance2D(new Point(availableExits.get(0).getX(),availableExits.get(0).getY());
double minDistance = currentDistance;
TargetLine closestExit = availableExits.get(0);
for(int i=1;i<availableExits.size();i++){
currentDistance= ped.getPosition().distance2D(new Point(availableExits.get(i).getX(),availableExits.get(i).getY());
if(currentDistance<minDistance){
minDistance = currentDistance;
closestExit = availableExits.get(i);
}
}
return closestExit;