AnyLogic
Развернуть
Размер шрифта

Устранение ошибок

В этом документе перечислены решения проблем, которые наиболее часто встречались пользователям AnyLogic. Если вы столкнулись с какой-то проблемой или ошибкой, и не нашли ее решения ни в Справке AnyLogic, ни в разделе Часто задаваемые вопросы, то вы можете обратиться за помощью к Службе технической поддержки (воспользовавшись командой Обратиться за помощью...).

Общие ошибки

Произошла ошибка "No more handles"

Эта ошибка часто происходит при работе с некоторыми конфигурациями аппаратных средств, например, когда вы щелкаете по сложному элементу управления в панели Свойства.

Не существует простого способа решить эту проблему. Мы рекомендуем закрыть все модели, с которыми вы не работаете в данный момент, и перезапустить AnyLogic.

В качестве временного решения вы можете закрыть сообщение об ошибке, а затем щелкнуть по панели Свойства и продолжить работу:

Это поможет вам на время избавиться от ошибки, затем вам придется повторить эти действия.

Произошла ошибка компиляции: Неправильное имя типа агента: слово уже закреплено за исполняющим модулем AnyLogic

Вы создали тип агента с именем, которое уже используется в AnyLogic (например, Map).

Дважды щелкните мышью по описанию ошибки в панели Ошибки. AnyLogic переключится в поле свойств Имя соответствующего типа агента. Задайте новое имя для типа агента и скомпилируйте модель заново. После этого ошибка должна исчезнуть.

Произошла ошибка "Out Of Memory". Как я могу ее исправить?

Эта ошибка свидетельствует о том, что вашей модели не хватает памяти для хранения данных или для вычислений. Она может произойти как при запуске модели, так и во время ее работы. Зачастую она дополняется уточнением "Java heap space". Такая ошибка не говорит о том, что вы исчерпали ресурсы вашего компьютера, и в большинстве случаев она может быть исправлена.

Наиболее очевидным способом устранения такой ошибки является увеличение объема выделенной Java памяти. По умолчанию объем памяти, выделенной для модели, ограничен 64 мегабайтами, что даже близко не приближается к обычным объемам физической памяти современных компьютеров. Поэтому вы можете легко позволить себе выделить больший объем памяти для вашей модели. Для этого нужно будет перейти к странице свойств Дополнительные вашего эксперимента и ввести необходимое число в поле Максимальный размер памяти.

Другим способом является определение источника потребления памяти в вашей модели и устранение его путем небольшой переработки или оптимизации кода или структуры модели. Ниже мы перечислим наиболее часто встречающиеся причины чрезмерного потребления памяти:

  • Большое количество агентов или сложная структура данных внутри агента
    Объем памяти, необходимый для работы агентной модели, обычно пропорционален количеству агентов в модели. И естественно, чем сложнее структура агента, тем больше памяти он занимает. Чтобы минимизировать расходуемый на агента объем памяти, вы должны учесть следующее:
    • если у всех агентов есть параметр с одним и тем же значением, то лучше вынести такой параметр из типа агента на уровень выше, в тип агента, в который вложен массив агентов — в этом случае вместо множества экземпляров параметра будет создан только один
    • если возможно, избегайте создания больших структур данных в классе агента
  • Функции системной динамики delay при небольшом временном шаге
    Реализация функции delay() в AnyLogic подразумевает хранение истории значений, задерживаемых за время периода задержки. Данные запоминаются с частотой временного шага. Поэтому, например, если у вас выбраны минуты в качестве единиц модельного времени, период задержки равен одному дню, а величина временного шага равна 0.001, то соответствующая структура данных будет занимать примерно 11 мегабайт памяти. Если же функция задержки работает с массивами, то вы можете умножить это значение на количество элементов в массиве.
    Одним из решений может быть увеличение значения фиксированного временного шага (на странице дополнительных свойств эксперимента). Другим решением может быть использование функции задержки порядка n (например, delay3()) вместо функции delay().
  • Наборы данных, автоматически создаваемые для динамических переменных
    Если в модели есть динамические переменные (например, накопители, потоки или вспомогательные переменные), то AnyLogic создаст для каждой такой переменной набор данных, в котором будет хранить историю изменения значений переменной, чтобы ее можно было отображать в графиках окон инспекта этих переменных. Если в вашей модели много таких переменных, то лучше отключить сбор истории значений для этих переменных (снять флажок Автоматически создавать наборы данных для динамических переменных на странице дополнительных свойств типа агента).
  • Большое количество агентов в дискретно-событийных моделях
    "Пустой" агент, т.e. агент без добавленных пользователем полей, занимает порядка 100 байт. Следовательно, 1,000,000 агентов, одновременно присутствующих в модели, потребуют порядка 100 Мб памяти. Если же вы добавите у агента дополнительные параметры, то и размер памяти потребуется существенно больший.
    Если вы полагаете, что агенты ошибочно накапливаются в каком-то месте модели, то лучше будет проверить все блоки, которые могут хранить большое количество агентов, особенно такие, у которых включена опция Максимальная вместимость.
  • Изображения, чертежи САПР, карты ГИС
    При отображении изображений, чертежей САПР и карт ГИС во время выполнения модели происходит рендеринг и одноразовое кэширование изображения в памяти. Чем больше изображение на экране, тем больше памяти оно занимает. Даже если у изображения небольшой первоначальный размер, но вы увеличите его масштаб во время моделирования, то симметрично увеличится и используемый сегмент памяти.
  • Ссылки на неиспользуемых агентов
    Иногда пользователи создают свои собственные ссылки на других агентов. Например, в агентной модели у вас может быть коллекция людей, и вы можете захотеть хранить списки их контактов и связей, таких как "друг", "коллега" и т.д. Обычно такие ссылки реализуются как коллекции агентов. Если вы создаете и удаляете агентов динамически, то именно вам нужно будет следить за тем, чтобы ссылки на “мертвых” агентов не оставались в коллекциях.
  • Коллекции
    Коллекции представляют собой Java объекты, которые могут занимать все больше и больше памяти по мере добавления в них элементов. Если ваша модель содержит коллекции, то имеет смысл проверить, не добавляете ли вы случайно в коллекции одни и те же элементы, или, может, забываете удалять оттуда ненужные более элементы.
  • Большое количество активных динамических событий
    Динамические события могут быть также источником чрезмерного потребления памяти — одно динамическое событие без параметров занимает порядка 100 байт памяти. Чтобы проверить количество одновременно запланированных событий, включите секцию Модельный шаг строки состояния — и вы увидите это количество в квадратных скобках.
  • Крупномасштабные сети
    Объем памяти, необходимый для работы со крупномасштабными сетями (особенно, если это сети с большим количеством узлов) прямо пропорционален возведенному в квадрат количеству узлов сети. Например, сеть с 1000 узлов требует около 15 мегабайт памяти, а сеть с 2000 узлов — около 60 мегабайт. Чтобы снизить нагрузку на память, вы можете разбить свою сеть на несколько сетей поменьше.
Произошла ошибка "IndexOutOfBoundsException"

Вероятно, вы обращаетесь к несуществующему элементу популяции/коллекции. Эта ошибка, как правило, возникает при вызове таких функций, как get(i), remove(i), и так далее, когда значение передаваемого аргумента i превосходит размер популяции.

В таких случаях код может выглядеть следующим образом: collection.get(0). В данном случае вы пытаетесь обратиться к элементу пустой коллекции collection.

Еще один пример — функция remove_people(people(1)), где удаляется элемент популяции people.

Произошла ошибка при переименовании элемента с заменой ссылок на него

При выполнении переименования с заменой ссылок на заменяемое имя по команде Ctrl + Enter, появилось диалоговое окно, информирующее о возникновении фатальной ошибки:

Не стоит пугаться такой ошибки, это не ошибка AnyLogic или вашей модели. Как вы можете увидеть из приведенного в диалоговом окне описания, "This refactoring cannot be performed correctly due to syntax errors in compilation unit", то есть переименование не было выполнено вследствие того, что в данном элементе (чаще всего — типе агента) есть ошибки компиляции. Это означает, что вы пытались произвести переименование с заменой ссылок на меняемое имя в тот момент, когда в классе были критические ошибки. Эти ошибки сделали класс некомпилируемым, и поэтому AnyLogic не смог произвести переименование и перекомпилировать код класса заново.

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

Мне было показано сообщение о том, что срок действия лицензии на Сервис технической поддержки истек

При приобретении AnyLogic вы автоматически получили право на бесплатное использование Сервиса технической поддержки в течение года с момента покупки AnyLogic. В течение этого времени вы могли обращаться с любыми вопросами в службу технической поддержки, а также скачивать и устанавливать обновления AnyLogic. Поэтому если вы приобрели AnyLogic более года назад и не обновляли срок действия лицензии на Сервис технической поддержки, то срок действия лицензии на использование вами Сервиса технической поддержки уже истек, о чем вас и уведомляет данное сообщение.

Если вы хотите продлить срок действия лицензии, чтобы и в дальнейшем иметь возможность работать с последними обновлениями AnyLogic и обращаться за консультациями в службу технической поддержки, вам нужно будет продлить срок действия лицензии на Сервис техподдержки. Для этого, пожалуйста, свяжитесь с нами адресу support@anylogic.com.

Я успешно экспортировал(а) модель в виде отдельного Java приложения, но при попытке запуска созданного .bat-файла ничего не происходит

Все, что я вижу — это лишь следующее сообщение об ошибке: 'java' is not recognized as an internal or external command, operable program or batch file.

Simulation Applications (модели, созданные с помощью опции AnyLogic Экспорт -> Отдельное Java приложение) являются Java приложениями и требуют установки Java на той машине, на которой вы хотите запустить ваше приложение. Вы можете скачать дистрибутив Java с веб-сайта Oracle.

В моей модели присутствует стохастика, но все прогоны эксперимента выдают одни и те же результаты

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

Задание случайного начального числа генератора случайных чисел более подробно описано здесь.

Результаты прогонов моей модели не являются воспроизводимыми, хотя я и выбрал фиксированное начальное число в свойствах генератора случайных чисел

Вероятно, вы используете в вашей модели функцию random(). Именно она и может быть источником стохастики.

Опция Фиксированное начальное число задает свойства генератора случайных чисел, который используется функциями вероятностных распределений AnyLogic. Полный список этих функций можно найти здесь.

Функция же random() принадлежит классу java.lang.Math и обладает своим собственным генератором случайных чисел. Поэтому при каждом новом прогоне модели эта функция будет возвращать новые случайные числа. И если вы хотите, чтобы результаты прогонов вашей модели были воспроизводимыми, выберите опцию Фиксированное начальное число и используйте только функции вероятностных распределений AnyLogic.

Еще один возможный источник случайности — использование коллекции HashMap. Использование в модели коллекций такого типа может привести к тому, что даже при выбранной опции Фиксированное начальное число генератора случайных чисел, результаты такой модели будут различаться (будут невоспроизводимыми).

Я не могу найти файл журнала ошибок (.log-файл)

Файл журнала ошибок находится в одном из следующих каталогов (в зависимости от вашей операционной системы):

  • Windows:
    "Users/<имя пользователя>/.<название версии AnyLogic>/Workspace/.metadata/.log"
    где имя пользователя — это имя вашего аккаунта в ОС Windows, а название версии AnyLogic — либо AnyLogicPLE, либо AnyLogicProfessional, либо AnyLogic University (в зависимости от того, с какой версией вы работаете).
    Если в проводнике Windows не включено отображение расширений файлов, то файл может выглядеть безымянным.
  • macOS:
    "<Домашний каталог>/.<название версии AnyLogic>/Workspace/.metadata/.log"
    где Домашний каталог — это название вашей домашней директории, а название версии AnyLogic — либо AnyLogicPLE, либо AnyLogicProfessional, либо AnyLogic University (в зависимости от того, с какой версией вы работаете).
    Эта директория по умолчанию скрыта. Чтобы сделать ее видимой, в директории Домашний каталог следует нажать Command + Shift + . на клавиатуре.
  • Linux:
    "~/.<название версии AnyLogic>/Workspace/.metadata/.log"
    где название версии AnyLogic — либо AnyLogicPLE, либо AnyLogicProfessional, либо AnyLogic University (в зависимости от того, с какой версией вы работаете).
Для моей библиотеки не создается Javadoc документация

Когда я экспортирую свою библиотеку, создается только .jar-файл. Я не могу увидеть файлы документации Javadoc, хотя и выбираю при экспорте опцию Создать Javadoc.

Причина может быть одной из следующих:

  1. На вашем компьютере не установлен компонент Javadoc
  2. Путь к приложению javadoc.exe не прописан в переменных среды Windows. Чтобы прописать его, перейдите в Панель управления|Система|Дополнительные и нажмите на кнопку Переменные среды. Затем выберите переменную Путь, нажмите Редактировать... и добавьте путь к приложению javadoc.exe.

После этого попробуйте сделать экспорт библиотеки еще раз.

Эта Javadoc-документация не будет отображаться помощником подстановки кода для блоков вашей библиотеки — эта возможность пока еще не реализована.
Пропала панель инструментов AnyLogic

Вероятно, это произошло в результате непреднамеренного изменения расположения элементов пользовательского интерфейса AnyLogic.

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

Эта команда восстанавливает принятые по умолчанию настройки расположения панелей, редактора и панелей инструментов (когда панели Проекты и Палитра прикреплены к левому краю окна AnyLogic, панель Свойства — к правому и т.д.), и в том числе и располагает панель инструментов на ее первоначальном месте под меню AnyLogic.

При открытии модели из снэпшота появляется ошибка Stack overflow

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

Причиной ошибки является ограничение стандартной библиотеки Java, используемой AnyLogic для сериализации классов. Чтобы обойти проблему, отключите сохранение проблемных переменных или параметров в секции Специфические их свойств.

Чтобы значения переменных и параметров корректно сохранялись в снэпшотах, переключитесь на режим нестандартной сериализации. Для этого добавьте следующую строчку в значение свойства Custom Modifiers:

@AnyLogicCustomSerialization

Примечание: Чтобы свойство Custom Modifiers было доступно в секции Специфических свойств элемента, необходимо включить Режим разработчика библиотек на экране Инструменты > Настройки > Разработка.

Библиотека моделирования процессов

Возникла ошибка "java.lang.RuntimeException:... Агент не смог покинуть порт"

Эта ошибка не является ошибкой AnyLogic, а свидетельствует скорее о логической ошибке в вашей диаграмме процесса или "узком месте" в моделируемой вами системе. Причина ее в том, что агенты не могут покинуть выходной порт, отмеченный красным кружком на анимированной диаграмме процесса, и войти во входной порт последующего блока.

Некоторые блоки могут выталкивать агентов, не дожидаясь, когда последующие блоки будут готовы их принять. Если агент не может покинуть блок в течение нулевого модельного времени, возникает ошибка выполнения модели. Таким образом, AnyLogic исключает возможность скрытой буферизации или блокирования, поэтому вы всегда будете знать о произошедшем в вашей модели переполнении и сможете найти это "узкое место" модели.

Чтобы решить эту проблему, нужно будет либо добавить блок-буфер (например, Queue) после блока с выделенным портом, либо перейти на протокол потока агентов PULL в блоке, где возникает ошибка. Чтобы переключиться с протокола PUSH на протокол PULL, в свойствах блока откройте секцию Специфические и отключите опцию Разрешить вытеснение.

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

Вы пытаетесь присоединить ресурс(ы) к агенту с помощью блока ResourceAttach, но агент и ресурс находятся в этот момент в разных точках сети. Поэтому вам вначале нужно сделать так, чтобы они находились в одном узле сети (переместив либо агента, либо ресурс), а уже потом соединять их вместе.

Либо же агент предварительно не занял этот ресурс, а это условие является обязательным при соединении агента с ресурсом — прежде, чем соединять агента с ресурсом, нужно его занять с помощью блока Seize.

Я пытался динамически соединить порты блоков библиотеки, но ничего не произошло

Если вы динамически измените соединения портов блоков библиотеки с помощью методов connect()/disconnect() или map()/unmap(), то конечные порты не узнают о новом соединении и будут продолжать функционировать согласно устаревшей информации о топологии соединений, установленной при запуске модели. Чтобы обновить информацию о соединениях портов, нужно вызвать метод refreshConnections() у тех портов, которые были динамически соединены или отсоединены от других портов. Например, если программно был соединен порт out блока myService, то после этого вам нужно будет выполнить следующий код:

myService.release.out.refreshConnections();

Демо-модель: Connecting Library Objects Dynamically Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

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

Блок Unbatch не извлекает агентов из поступающих агентов-партий
В моей диаграмме процесса есть комбинация блоков Batch — Unbatch, но блок Unbatch не извлекает агентов из поступающих на его вход агентов-партий, собранных ранее блоком Batch.

Чтобы разрешить блоку Unbatch извлекать агентов из поступающих на его вход агентов-партий, вы должны сбросить флажок Постоянная партия на странице свойств предшествующего блока Batch.

Пешеходная библиотека

Если я использую нестандартные фигуры больших размеров для анимации пешеходов, то пешеходы двигаются поверх друг друга (их фигуры накладываются друг на друга во время анимации). Правильное ли это поведение?

Пешеходная библиотека была разработана для моделирования пешеходных потоков. Предполагалось, что пользователи будут использовать настоящие размеры пешеходов и моделируемых пространств. Разумеется, вы можете рисовать большие фигуры и использовать их для анимации пешеходов, но диаметр в 20 метров, конечно, не отражает реальность. Если вы хотите увеличить размер ваших пешеходов, мы рекомендуем увеличить масштаб анимации.

Агенты

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

Чтобы получать сообщения в диаграмме состояний необходимо пересылать входящие сообщения этой диаграмме.

Откройте диаграмму того типа агента, который получает сообщения. Зажмите правую кнопку мыши и перетащите диаграмму вниз в графическом редакторе. Вы увидите элемент connections:

Щелкните по этому элементу. Откройте секцию Взаимодействие в панели Свойства и поставьте флажок возле соответствующей диаграммы состояний в таблице Перенаправлять сообщение в.

При запуске агентной модели возникла ошибка "Ошибка при выполнении дискретного события: d != com.anylogic.engine.MessageDeliveryType"

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

Подробное описание способов взаимодействия агентов и доставки сообщений вы найдете в статье Взаимодействие агентов справки AnyLogic.

Диаграммы состояний

В моей модели возникли ошибки "Элемент не достижим. Соедините его с диаграммой состояний, объявленной с помощью Начала диаграммы состояний"

Каждый элемент диаграммы состояний (состояние, переход и т.д.) должен принадлежать какой-то диаграмме состояний, т.e. переход должен соединять какие-то состояния или псевдо-состояния, а состояние должно быть соединено с диаграммой состояний. В тех случаях, когда конечные точки ваших переходов будут просто "висеть в воздухе" или же состояния не будут соединены с другими элементами корректно объявленной диаграммы состояний, возникнут упомянутые выше ошибки.

Поэтому первым делом вам нужно будет проверить, все ли элементы соединены с диаграммой состояний. Сделайте двойной щелчок по ошибке в панели Ошибки. Вы увидите, что некорректно нарисованный элемент будет выделен в графическом редакторе.

  • Если это состояние, то сделайте его частью корректно заданной диаграммы состояний.
  • Если это переход, то проверьте начальную и конечную точку на предмет соединения с состояниями. Правильно соединенные точки должны при выделении перехода подсвечиваться зелеными точками. Если какая-то точка выделена белым кружком, то это означает, что она не лежит на границе состояния, и для того, чтобы установить корректное соединение, вы должны передвинуть ее туда самостоятельно. На приведенном ниже рисунке вы можете видеть, что конечная точка перехода успешно соединена с нижним состоянием, в то время, как начальная точка не лежит на границе верхнего состояния и для устранения ошибки должна быть туда помещена.

Возможно, вы перепутали индикатор начального состояния с началом диаграммы состояний, как показано на приведенном ниже рисунке:

Как вы можете видеть, пользователь использовал здесь указатель начального состояния вместо начала диаграммы состояний. В таком случае нужно удалить указатель и заменить его элементом Начало диаграммы состояний, как показано на рисунке ниже:

Диаграммы и элементы сбора данных

Диаграмма во время моделирования остается пустой, данные на нее не добавляются

Причина может быть одной из следующих:

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

Причина этого, скорее всего, в том, что ваш набор данных обновляется несколько раз в одни и те же моменты времени. Дело в том, что в AnyLogic обновление набора данных новыми значениями задается сразу в двух разных местах:

  1. В свойствах самого набора данных
  2. В свойствах диаграмм, отображающих значения этого набора данных

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

На гистограмме не отображается функция распределения, хотя флажок "Отображать ф-ю распределения" у нее выбран

Причина того, что на гистограмме не отображается функция распределения, состоит в том, что эта функция не вычисляется соответствующим элементом Данные гистограммы, значения которого отображаются на этой гистограмме.

Перейдите на страницу свойств этого элемента сбора данных и выберите там опцию Считать CDF.

Системная динамика

Возникла ошибка: Метод copyFrom(HyperArray) в типе HyperArray неприменим для аргументов (int)

В вашей модели есть переменная (например, накопитель), объявленная массивом системной динамики. В качестве Начального значения у этого массива задана скалярная величина, а должен быть задан вектор значений. Каждое значение в векторе будет задавать значение соответствующего элемента массива. Начальное значение массива проще будет задать с помощью специального редактора (это описано в данной статье).

Базы данных

Как улучшить работу модели со включенным журналом выполнения модели?

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

Как отключить сбор данных для журнала

  1. После того, как вы завершили хотя бы один прогон модели и собрали информацию для журналов, разверните ветку База данных в панели Проекты.
  2. Разверните ветку элемента Журнал. Вы увидите в ней список журналов.
  3. В дереве проектов выберите ненужный вам журнал и выберите опцию Мне не нужен этот лог в его свойствах.
Как мы можем улучшить эту статью?