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

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

Пример:

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)?Или есть другой способ решения проблемы?

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

РЕДАКТИРОВАТЬ : При удалении Hold-block, ошибка Engine still has X events scheduledне появляется так часто.Но «Wait-Block» по-прежнему не отвечает на метод Waitblock.free(), и в консоли появляется следующее сообщение об ошибке:

java.lang.RuntimeException: root.w_Warteblock1.readyEntities.output.readyNotificationAsync.event: negative timeout: -1.25
    at com.anylogic.engine.Engine.error(Unknown Source)
    at com.anylogic.engine.EventOriginator.g(Unknown Source)
    at com.anylogic.engine.EventOriginator.c(Unknown Source)
    at com.anylogic.engine.EventTimeout.restart(Unknown Source)
    at com.anylogic.libraries.processmodeling.AsynchronousExecutor_xjal.a(Unknown Source)
    at com.anylogic.libraries.processmodeling.OutputBlock.notifyReady(Unknown Source)
    at com.anylogic.libraries.processmodeling.OutputBuffer.a(Unknown Source)
    at com.anylogic.libraries.processmodeling.OutputBuffer.take(Unknown Source)
    at com.anylogic.libraries.processmodeling.Wait.free(Unknown Source)

Это больше похоже на общую ошибку, которую я могу уловить так,Мой текущий обходной путь - блок try и catch вокруг Thread, который вызывает метод Waitblock.free() и перезапуск симуляции с прогрессом симуляции, сохраненным в файле excel.

1 Ответ

0 голосов
/ 28 февраля 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...