Anylogic - Внутренняя ошибка (и): У двигателя все еще запланировано x событий: xyz: [null]

После остановки симуляции я иногда получаю следующее сообщение об ошибке:

Пример:

Exception during stopping the engine:
INTERNAL ERROR(S):
Engine still has 6 events scheduled: 2386.0:  [null]

java.lang.RuntimeException: INTERNAL ERROR(S):
Engine still has 6 events scheduled: 2386.0:  [null]

at com.anylogic.engine.Engine.g(Unknown Source)
at com.anylogic.engine.Engine.stop(Unknown Source)
at com.anylogic.engine.ExperimentSimulation.stop(Unknown Source)
at com.anylogic.engine.gui.ExperimentHost.executeCommand(Unknown Source)
at com.anylogic.engine.internal.webserver.l.onCommand(Unknown Source)
...

Моя имитационная модель выглядит так: Имитационная модель с 5 машинами

Модель представляет собой симуляцию задачи планирования работы магазина и выполняет следующие действия:

  1. Генерация рабочих агентов через inject(20) в блоке источника
  2. Задания отправляются на компьютер, определенный базой данных, и ожидают в блоке ожидания
  3. Задания освобождаются от блока ожидания другими агентами
  4. Задания обрабатываются в сервисном блоке
  5. Задания повторяют процесс еще 4 раза

В Шаге 3 всего 5 агентов - давайте назовем их " Агент планирования" - и они используют Wait.free() способ освободить агентов. Один агент контролирует один блок ожидания. Все 5 агентов планирования работают одновременно и синхронизируются через Main агент (Main уведомляет агентов планирования). Блокировки разблокируются сразу после начала симуляции. Они существуют также для целей синхронизации. Каждый агент планирования имеет свой собственный поток, который запускается через Thread.start() событием тайм-аута (происходит один раз, время = 0), определенным в Main,

Поток из агента планирования выглядит примерно так:

new Thread(new Runnable() {
    public void run() {
        synchronized (sync_obj) {
            sync_obj.waituntilJobarrives();
            sync_obj.Waitblock.free(a_Job);
            synv_obj.waituntilJobisfinished();
            repeat();
        }
    }
});

Теперь вот моя проблема: когда я запускаю симуляцию, задания генерируются нормально и перемещаются в назначенный им блок ожидания. После этого агенты планирования начинают свою работу и освобождают работу, но иногда агент планирования вызывает Waitblock.free() метод и работа не освобождается (проверяется с помощью traceln() когда метод был вызван). Чтобы дважды проверить проблему, я реализовал кнопки, которые вручную вызывает Waitblock.free() метод, но Агенты Работы все еще не покинут блок ожидания. Если агент не освобождает задание, симуляция магазина заданий застревает там. Симуляция продолжается, но 20 заданий никогда не завершаются, и сообщение об ошибке не отображается (технически ошибки нет). Только после остановки симуляции в консоли появляется сообщение об ошибке, показанное выше.

Хуже всего то, что эта ошибка не появляется постоянно. Иногда симуляция работает просто отлично, а иногда блок ожидания перестает реагировать. Обычно после достаточно длительного моделирования появляется эта ошибка, и один или несколько блоков ожидания перестают реагировать.

Прочитав сообщение об ошибке, я полагаю, что движок получил приказ освободить агентов из блока ожидания. Это просто не будет делать это сейчас. Как или я могу контролировать порядок событий, запланированных движком (Personal Learning Edition)? Или есть другой способ решения проблемы?

Я благодарен за любую помощь!

1 ответ

У меня была эта проблема в моих тестовых наборах. Я исправил это, позвонив:

engine.finish();

вместо того:

engine.stop();

Я расскажу вам свои мысли, но информации может быть недостаточно, чтобы сделать вывод:

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

Это означает, что когда вы останавливаете симуляцию, вам нужно дать симуляции хотя бы миллисекунду времени, чтобы иметь возможность завершить запланированные события... В этом случае ваши запланированные события находятся в потоке. Поэтому решением этой проблемы было бы остановить симуляцию с помощью finishSimulation(), прежде чем нажать кнопку "Стоп". Вы должны уничтожить потоки до запуска функции finishSimulation()... Я не уверен в этом, но попробуйте.

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

Другие вопросы по тегам