Руководство для новичков по исправлению ошибок в моделях AnyLogic

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

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

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

В статье мы рассмотрим:

  1. Навигацию по модели
  2. Ошибки компиляции
  3. Ошибки при выполнении модели

Навигация по модели

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

Элементы интерфейса AnyLogic
Элементы интерфейса AnyLogic (нажмите, чтобы увеличить)

В верхней части экрана находятся Menu и Toolbar. Слева направо отображаются следующие основные компоненты:

  1. Панель Projects – здесь расположены все ваши открытые модели. Если вы новичок, лучше оставить одну модель открытой, чтобы не запутаться.
  2. Панель Palette – содержит список всех элементов, которые могут быть добавлены на диаграмму агента для построения моделей.
  3. Graphical editor или Canvas – пространство, на которое вы перетаскиваете элементы из Palette для создания не только логической структуры модели, но и её визуального представления.
  4. Панель Properties – здесь отображаются свойства выбранных элементов модели.

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

Внизу находится Status bar и два окна – Console и Problems. Этим двум элементам будет уделено основное внимание в данной статье, поскольку именно они помогают при работе с ошибками.

Поиск элементов модели

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

Поиск элементов модели
Поиск элементов модели

Другой способ поиска элементов – через кнопку Search (Ctrl + F для Windows или Command + F для Mac).

Окно, которое появляется при нажатии на кнопку Search
Поиск элементов модели через кнопку Search

Именно эти способы поиска элементов в модели понадобятся вам при работе с ошибками и проблемными элементами.

Ошибки компиляции


Они обнаруживаются в процессе компиляции и генерации кода. Такие ошибки появляются еще до запуска модели и отображаются на панели Problems.

Ошибки на панели Problems
Ошибки на панели Problems

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

Откройте панель Problems в нижней части экрана в AnyLogic, чтобы увидеть все обнаруженные ошибки. Чтобы отфильтровать их, воспользуйтесь функциями Filter problems by model (нажмите на кнопку, а затем на модель на панели Projects) или Filter problems by selection (нажмите на кнопку, а затем на агента на панели Projects, которого вы хотите проверить на ошибки).

Фильтры на панели Problems
Фильтры на панели Problems

Рассмотрим проблемы компиляции, возникшие в примерах моделей на вебинаре.

Ошибка компиляции 1: "[NAME] cannot be resolved… (…to a variable/…or is not a field)"

Это сообщение может означать следующее:

Ниже приведены несколько сценариев для устранения данной ошибки.

Разрешение имён: имя вызываемого элемента неверно

Исправление неправильного имени элемента
Исправление неправильного имени элемента (нажмите, чтобы увеличить)

Ошибка указывает на проблему с именем популяции агентов, на которую вы ссылались. По замыслу автора модели, блок Source должен был ссылаться на совокупность агентов под названием Customers. Поэтому в данном случае вы можете просто удалить mypopulation и из выпадающего меню выбрать предложенное имя популяции – Customers.

Теперь, если вы снова нажмете кнопку Build model (или F7), вы увидите, что ошибка устранена. Попробуйте сделать это самостоятельно с демо-примером ошибки – name resolution [ZIP].

Разрешение имён: опечатка

Исправление опечатки в модели AnyLogic
Исправление опечатки в модели AnyLogic (нажмите, чтобы увеличить)

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

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

В этом случае можно оставить ту часть имени, в которой вы уверены, затем вызвать автодополнение кода (Ctrl + Space или Option + Space) и выбрать правильный вариант из предложенных.

Автодополнение кода в действии в AnyLogic
Автодополнение кода в действии

Теперь, если вы снова нажмете Build model (или F7), вы увидите, что ошибка устранена. Попробуйте сделать это самостоятельно с демо-примером ошибки – name resolution [ZIP].

Разрешение имён: имя не отображается в автодополнении кода

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

Исследование причин отсутствия элемента в автодополнении кода в AnyLogic
Причина, по которой элемент не появляется в автодополнении кода (нажмите, чтобы увеличить)

Чтобы решить проблему, снимите галочку с опции Ignore и нажмите Build model (или F7). Теперь проверьте, исчезла ли ошибка. Попробуйте сделать это самостоятельно с демо-примером ошибки – name resolution [ZIP].

Разрешение поля имён: неверное имя параметра

Ошибка указывает на то, что имя параметра Task priority: priority_value неверно. Если речь идет об агенте типа Customer, искать решение нужно среди элементов данного агента.

Исправление неверного имени параметра в AnyLogic
Исправление неверного имени параметра (нажмите, чтобы увеличить)

Оказывается, есть параметр с именем priority_level, который вам и нужен. Измените имя в параметре Task priority и нажмите Build model (или F7), чтобы увидеть, исчезла ли ошибка. Попробуйте сделать это самостоятельно с демо-примером ошибки – name field resolution [ZIP].

Разрешение поля имён: тип объекта не указан

Unit указывает на ресурсный блок под названием employeePool. Если вы ищете элемент с названием skill_rating в агенте Employee, то увидите его там, поэтому проблема не в названии, как это было в предыдущих примерах.

Если ошибка была найдена в блоке Seize и вы ссылаетесь на агент типа Employee, убедитесь, что был указан тип единицы. Сначала вам нужно привести конкретную единицу: (Employee)unit. Затем укажите, что skill_rating относится ко всему объекту ((Employee)unit).skill_rating.

Указание типа объекта в AnyLogic
Указание типа объекта

Попробуйте сделать это самостоятельно с демо-примером ошибки – name field resolution [ZIP].

Ошибка компиляции 2: "Метод [FUNCTION(ARG)] в типе [OBJECT_TYPE] неприменим для аргументов [(ARG)]"

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

Ошибка в типе аргумента в AnyLogic
Ошибка в типе аргумента (нажмите, чтобы увеличить)

Пользователь установил тип аргумента как double, но в блоке Delay передал только одно значение. Для решения данной проблемы необходимо добавить второе значение.

Добавление второго значения для решения проблемы в AnyLogic
Добавление второго значения для решения проблемы (нажмите, чтобы увеличить)

Попробуйте сделать это самостоятельно с демо-примером ошибки – name field resolution [ZIP].

Ошибка компиляции 3: "Несоответствие типов: невозможно преобразовать [TYPE_A] в [TYPE_B]"

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

Переменная неправильного типа в модели
Переменная неправильного типа в модели (нажмите, чтобы увеличить)

В данном случае проблема заключается в условии блока SelectOutput для агента Customer. Вы обнаружите, что Type указан как Double, хотя поле Condition в блоке SelectOutput требует Boolean. Простое изменение типа решает проблему.

Попробуйте сделать это самостоятельно с демо-примером ошибки – type mismatch [ZIP].

Ошибка компиляции 4: "Синтаксическая ошибка, [MESSAGE]"

Ошибки компиляции такого типа легко понять. Рассмотрим наиболее распространённые из них и способы их решения.

  • Синтаксическая ошибка в лексеме")", удалите лишний знак. Это значит, что присутствует лишний символ, который нужно удалить.
  • Синтаксическая ошибка, вставьте ")" для завершения выражения (Expression). У вас отсутствует символ в Expression. Expression — это комбинация переменных, операторов и функций, которая вычисляется в одну переменную. Например, при объявлении переменной result следующим образом: int result = 2 * (3+4); выражением будет 2 * (3+4).
  • Синтаксическая ошибка, вставьте ";" для завершения выражения (Statement). У вас отсутствует символ в Statement. Statement — это полная единица исполнения в Java. Она может выполнять действие или изменять состояние. Пример: int age = 25;
  • Синтаксическая ошибка, вставьте "}" для завершения BlockStatements. У вас отсутствует символ в Block Statements. Block Statements — это группа операторов в фигурных скобках {}.

Ошибка компиляции 5: "Недостижимый код"

Если вы видите эту ошибку, это означает, что после завершающего символа ";" в коде присутствует лишний символ.

Ошибка компиляции 6: "Метод [FUNCTION_NAME] не определен для типа [OBJECT_TYPE]"

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

Ошибка компиляции 7: ошибки компиляции, специфичные для statecharts

Существуют определенные логические правила, которые должны соблюдаться в statecharts. Наиболее распространёнными ошибками являются:

  • Hanging statechart entry. Точка входа ни с чем не связана, но если добавить состояние из палитры, то ошибка исчезнет.
Ошибка Hanging statechart entry в AnyLogic
Ошибка "Hanging statechart entry"
  • Branch state without outgoing transitions. Достаточно добавить новый переход от Branch к другому элементу.
Ошибка Branch state without outgoing transitions в AnyLogic
Ошибка "Branch state without outgoing transitions"

Ошибки, возникающие при выполнении модели


Они возникают во время выполнения модели и связаны с языком программирования Java или же с недочетами в логической структуре. Подробные сведения о каждой ошибке можно увидеть в Console.

Ошибка при выполнении модели 1: "Agent cannot leave port [NAME], it has no connections"

Эта ошибка в логической структуре симуляции связана с дискретно-событийными блок-схемами.

Ошибка Agent cannot leave port в AnyLogic, иллюстрированная блок-схемой
Ошибка "Agent cannot leave port"

В этом случае вы получите сообщение "Agent cannot leave port root.shortDelay.out", следовательно вам нужно добавить блок Delay или Sink. Попробуйте сделать это самостоятельно с демо-примером ошибки – no port connection [ZIP].

Ошибка при выполнении модели 2: "An agent was not able to leave the port [NAME] at time [TIMESTAMP]/ date [DATESTAMP]"

Эта ошибка связана с логической согласованностью в симуляции и в структуре блок-схем. Обычно она вызвана блоком Source при заполнении блока до максимальной ёмкости.

Ошибка “Agent was not able to leave the port” в AnyLogic, иллюстрированная блок-схемой
Агент не смог покинуть порт из-за ограничения по ёмкости

Чтобы исправить ошибку, можно увеличить ёмкость вручную или использовать протокол Pull. Попробуйте сделать это самостоятельно с демо-примером ошибки – leave port [ZIP].

Ошибка при выполнении модели 3: "[TYPE_A] cannot be cast to [TYPE_B]"

Эта ошибка относится к коду на языке Java и возникает, когда вы пытаетесь привести тип агента к несовместимому типу при выполнении модели.

У вас в модели имеются два разных типа агентов: EmployeePrimary и EmployeeBackup. Оба типа управляются через ресурсные пулы в Main.

Но когда вы запускаете модель, она пытается преобразовать EmployeePrimary в EmployeeBackup, что вызывает ошибку. Для решения данной ошибки необходимо запросить модель проверить фактический класс единицы. Для это нужно добавить условие в параметр Unit rating в блоке Seize.

Исправление неверного приведения типов в AnyLogic
Исправление неверного приведения типов

Попробуйте сделать это самостоятельно с демо-примером ошибки – incorrect casting [ZIP].

Ошибка при выполнении модели 4: "NullPointerException"

Она срабатывает, когда вы пытаетесь выполнить операцию непосредственно с нулевым значением ("null" — это ключевое слово в Java, которое указывает на отсутствие значения).

Попробуйте сделать это самостоятельно с демо-примером ошибки – null pointer exception [ZIP].

Ошибка при выполнении модели 5: "IndexOutOfBoundsException"

Она возникает, когда вы пытаетесь получить доступ к коллекции (например, массиву или списку) по недопустимому индексу, основанному на размере этой коллекции. Правильный индекс не должен быть меньше 0 или больше размера коллекции.

Исправление ошибки недопустимого индекса в AnyLogic
Исправление ошибки недопустимого индекса (нажмите, чтобы увеличить)

Попробуйте сделать это самостоятельно с демо-примером ошибки — index out of bounds [ZIP].

Заключение

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

И помните, что вы всегда можете обратиться к сообществу AnyLogic на платформе StackOverflow. Там вы найдёте ответы на многие вопросы и сможете обменяться опытом с другими специалистами.


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

Похожие материалы