Часто задаваемые вопросы -> Что нужно сделать, чтобы...

В этом документе перечислены ответы на вопросы, которые наиболее часто задавались пользователями AnyLogic.

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



Общие вопросы

Презентация

Основная библиотека

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

Агенты

Диаграммы и наборы данных

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

Связь с базами данных

          Производительность

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

          Моделирование складов
Пользовательские библиотеки


Общие вопросы

Как изменить размер окна презентации запущенной модели?

По умолчанию размер окна презентации равен 800*600 пикселов. Но Вы всегда можете изменить его на странице свойств Окно Вашего эксперимента.


Я хочу знать текущую модельную дату и время. Можно ли добавить на презентацию что-то вроде часов?

Да, для этого Вам нужно просто перетащить на диаграмму Вашего класса активного объекта элемент Clock из палитры Основная библиотека. При желани Вы можете натсроить внешний вид этого элемента на странице его свойств (мы также советуем Вам сбросить флажок Отображать имя.)

Часы будут выглядеть следующим образом:

Или же Вы можете выбрать секцию Модельная дата для показа в строке состояния окна презентации (настройка строки состояния описана здесь).



Как я могу задать значения параметров модели со страницы эксперимента перед запуском самой модели? 

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

 Чтобы добавить на презентацию эксперимента элементы управления, меняющие значения параметров модели

  1. Давайте рассмотрим этот подход с помощью нашего примера модели "Wandering Elephants". В этой модели есть параметр NumberOfElephants, задающий количество слонов. Мы же хотим разрешить пользователю интерактивно задавать количество слонов перед запуском модели со страницы презентации эксперимента.
  2. Во-первых, нам нужно будет добавить простую переменную и привязать ее к параметру, значение которого мы хотим изменять.
  3. Откройте диаграмму эксперимента Simulation.
  4. Добавьте переменную elephants типа int. Задайте Начальное значение переменной: 50.
    Поскольку эта переменная создается исключительно со вспомогательной целью, Вы можете поместить ее за пределами рамки презентации эксперимента.
  5. Добавьте  бегунок, с помощью которого Вы будете изменять значение параметра. Введите elephants в поле бегунка Значение по умолчанию. Введите следующее Действие:
    elephants = (int)value;
  6. На странице Основные панели свойств эксперимента, введите elephants в качестве начального значения параметра NumberOfElephants
  7. Запустите эксперимент и измените значение параметра с помощью бегунка. Вы увидите, что модель будет проинициализирована заданным Вами с помощью бегунка значением параметра. 

Как я могу получить текущее значение модельного времени?

Текущее значение модельного (логического) времени можно получить, вызвав функцию time()


Моя модель останавливается по прошествии 100 единиц модельного времени. Могу ли я установить другое время останова?

Начальное и конечное время моделирования можно изменить на странице Модельное время эксперимента, с которым Вы работаете. 

По умолчанию модель будет работать 100 единиц модельного времени и затем остановится.



Как я могу найти элемент на диаграмме презентации?

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


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

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



Почему некоторые элементы палитры отображаются значком ? Что он означает?

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

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

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


Теперь Вы можете рисовать элемент в графическом релдакторе. Стоит отметить, что есть две группы элементов, которые рисуются разными способами:


Как можно создать активный объект динамически?

Мы советуем создать вложенный активный объект и ввести в поле Количество на странице его основных свойств 0. Тогда Вы сможете создавать экземпляры-копии этого активного объекта и сразу же задавать значения параметров создаваемых объектов путем вызова следующего метода:

add_activeObjectName(parameter1, parameter2, ...);

Каким способом я могу сослаться из одного активного объекта на другой?

Предположим, что у Вас есть класс активного объекта Main, на диаграмме которого есть два вложенных объекта: objectA и objectB

В этом случае Вы можете ссылаться из одного вложенного объекта на другой следующим образом: get_Main().objectA (этот метод будет ссылаться на objectA из кода, заданного в объекте objectB).


Можно ли изменять значения Динамической переменной извне? Как?

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


Как запустить модель циклически?

Нужно просто добавить в модель событие, выполняющее следующее действие:

new Thread() {
    public void run() {
        // останов модели
        getExperiment().stop();
        try {
            // задержка
            this.sleep(1000);
        } catch(Exception e) {};
        // повторный запуск
        ((Simulation) getExperiment()).button.action();
    }
}.start();


Как я могу удалить все элементы реплицированного объекта? Я хочу удалить всех агентов из моей модели.

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

while( people.size() > 0 ) {
        remove_peoplepeople.get( 0 ) );
}

Можно ли передать конкретное значение автономному приложению из командной строки?

Чтобы передать аргументы командной строки автономному приложению, Вы должны просто указать список значений аргументов (в случае Windows Вы просто пишете его в .bat файле приложения, после перечисления всех требуемых JAR файлов), например:

25 107.8 "useful text"

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

Чтобы получить переданные значения в модели, пожалуйста, используйте метод эксперимента getCommandLineArguments().

Этот метод возвращает массив аргументов командной строки, переданных автономному приложению. Чтобы получить, скажем, первое значение из массива, нужно вызвать getCommandLineArguments()[0], чтобы второе - getCommandLineArguments()[1], и т.д.

Пожалуйста, обратите внимание, что этот метод возвращает строковые значения типа String. Вы можете получить числа из строк String с помощью методов: Integer.parseInt(), Double.parseDouble()

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


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

AnyLogic предоставляет уникальную возможность экспорта Ваших имитационных моделей:


Как можно изменить порядок отображения параметров на странице свойств моего вложенного объекта?

Если я создаю вложенный активный объект, то порядок параметров на странице его основных свойств будет фиксированным. Могу ли я его поменять в соответствии со своими требованиями?

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



Можно ли управлять выполнением модели с помощью клавиатуры?

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

Демо модель: Controlling Model With Keyboard


Можно ли отключить показ презентации эксперимента при запуске модели, так чтобы сразу показывалась презентация корневого объекта?

Пожалуйста, введите следующий код в дополнительном свойстве Код инициализации эксперимента Вашего простого эксперимента:

run();
getEngine().getPresentation().setPresentable( getEngine().getRoot() ); 


Поддерживает ли AnyLogic импорт моделей из других инструментов моделирования?

Да, на данный момент AnyLogic 6 поддерживает импорт моделей Vensim®. Теперь Вы можете просто открыть модель Vensim® (пункт меню Файл|Импорт|Из Vensim), и она будет автоматически преобразована (сконвертирована) в модель AnyLogic, аналогичную исходной модели Vensim®. После этого Вы сможете продолжить работу над этой моделью уже в AnyLogic.

AnyLogic 5 поддерживает конвертацию моделей iThink/STELLA, конвертор можно найти на нашем веб сайте, здесь.


Можно ли открыть стороннее приложение (например, Блокнот) из модели AnyLogic? Как?

Да, открыть сторонее приложение можно. Следующий код, например, открывает текстовый файл file.txt в программе Windows Блокнот:

try {
    String link = "file.txt";
    Runtime rt = Runtime.getRuntime();
    Process pr = rt.exec("c:\\Windows\\notepad.exe"+" "+link);

catch (java.io.IOException e) {
  e.printStackTrace();
}


Как сделать так, чтобы при нажатии кнопки в окне Simulation отображался не корневой объект, а один из вложенных?

Для этого нужно заменить строку:

getEngine().getPresentation().setPresentable( getEngine().getRoot() );

в свойстве Действие этой кнопки на строку: 

getPresentation().setPresentable(((Main)getEngine().getRoot()).myClass); 

Здесь корневой класс активного объекта называется Main. В этот класс вложен объект myClass. По нажатию на кнопку будет показана презентация именно этого объекта.


Презентация

Как я могу добавить фигуру на презентацию во время выполнения модели?

Вы можете динамически добавлять фигуры и элементы управления на презентации Ваших классов активных объектов прямо во время выполнения модели. Например, чтобы добавить фигуру myShape, нужно вызвать метод presentation.add(myShape)

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


Фигура вращается вокруг своего верхнего левого угла, но мне нужно, чтобы она вращалась вокруг своего центра. Как я могу сделать это?

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

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

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

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


Можно ли во время выполнения модели изменить порядок расположения фигур при их наложении?

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


Как можно узнать координаты щелчка по презентации во время выполнения модели?

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

Это реализовано следующим образом: на диаграмме нарисован прямоугольник. Когда пользователь щелкает мышью по прямоугольнику, вызывается код, заданный в его динамическом свойстве Действие по щелчку. Координаты мыши доступны здесь как переменные clickx и clicky

Демо модель: Getting Mouse Coordinates


Каким образом можно добавить активную URL ссылку на презентацию модели?

Вы можете добавить на презентацию кнопку и ввести следующий код в поле Действие этой кнопки:

try {
String link = "http://www.xjtek.com";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("c:\\Program Files\\Internet
Explorer\\iexplore.exe"+" "+link);
}
catch (java.io.IOException e) {
    e.printStackTrace();
}

При нажатии на эту кнопку будет запущен браузер Internet Explorer, который откроет содержимое указанной веб ссылки.


Есть ли возможность добавления на презентацию полосы прокрутки?

Пожалуйста, изучите демо модель. Она демонстрирует одну из возможных реализаций полосы прокрутки области презентации. 

Демо модель: Scrollable Presentation

На презентации класса Main Вы можете увидеть набор кнопок навигации и функцию scrolling. По щелчку по определенной кнопке презентация будет прокручиваться в соответствующую сторону. Кнопки же навигации будут оставаться на своих местах в левом верхнем углу окна презентации. 

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


Основная библиотека

Как можно подсчитать количество заявок, прошедших через объект Основной библиотеки?

Используйте для этого метод count() соответствующего выходного порта объекта. Например, если у Вас есть объект source, и Вы хотите узнать, сколько заявок покинуло его порт out, Вам нужно будет написать source.out.count() 

Чтобы узнать имя порта, обратитесь, пожалуйста, к Справочному руководству по Еnterprise Library, откройте статью, описывающую этот конкретный объект, и посмотрите на приведенную в самом верху картинку значка объекта - там будут написаны и имена портов.


Как можно измерить время пребывания заявки в (под)системе?

Начиная с версии AnyLogic 6.5 Основная библиотека (Enterprise Library) содержит два объекта (TimeMeasureStart и TimeMeasureEnd), позволяющих измерять время, проводимое заявками между двумя заданными точками в диаграмме процесса. С помощью этих объектов Вы можете легко измерять время пребывания заявки в (под)системе.

Демо модель: Measuring Length of Stay



Могу ли я изменить фигуру заявки на время ее пребывания в каком-то определенном объекте? Как?

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

Initially entity shape is set up to be entityShape group. This group in fact consists of two more groups: closedBox and openedBox representing a box in two corresponding states.

Here the entity shape is accessed in On enter actions of flowchart blocks as entity.getShape(). Then one of two groups composing this shape is set to be visible and the other - to be invisible.

Thus we achieve a simple animation effect when entities are displayed with one shape (denoting a closed box) while being moved on conveyors and with another one (an opened box) - when being checked at our Delay object checking

Демо модель: Changing Entity Shape


Как получить доступ к заявкам, находящимся в данный момент в объекте Основной библиотеки?

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


Мне нужен объект наподобие SelectOutput, но с большим количеством выходных портов. Как можно его реализовать?

Вы можете просто использовать новый объект Основной библиотеки: SelectOutput5.  Объект направляет входящие заявки в один из пяти выходных портов в зависимости от выполнения заданных (детерминистических или заданных с помощью вероятностей) условий. 

У объекта есть два режима работы: Условия и Вероятности


Можно ли соединять порты объектов Основной библиотеки динамически?

Вы можете динамически соединять и рассоединять порты объектов Основной библиотеки динамически с помощью методов connect()/disconnect() или map()/unmap() портов.

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

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

myService.release.out.refreshConnections();

Демо модель: Connecting Enterprise Library Objects Dynamically

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


Можно ли изменить значение параметра объекта диаграммы процесса во время выполнения модели? Как?

Да, Вы можете изменять значения всех параметров. 

Чтобы изменить значение параметра, Вам нужно вызвать автоматически создаваемый метод set_кодовоеИмяПараметра(), передавая ему в качестве аргумента значение, которое Вы хотите присвоить параметру.

Например, чтобы изменить Вместимость объекта queue (задать значение 50), Вы должны вызвать метод queue.set_capacity(50);

Вы можете спросить - а как можно узнать кодовое имя параметра, которое используется в имени метода? Так вот, программные или кодовые имена параметров библиотеки Вы можете найти в Справочном руководстве по Еnterprise Library. Например, чтобы найти программное имя для параметра Интенсивность прибытия объекта Source, откройте статью документаци по объекту Source и найдите соответствующий раздел Интенсивность прибытия. В строке Синтаксис Вы найдете нужоне Вам кодовое имя этого параметра:


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


Можно ли создать конвейер с динамически меняющейся скоростью?

Да, с помощью метода set_speed() объекта Conveyor (см. пример модели).

Демо модель: Conveyor with Dynamic Speed


Можно ли создать ресурс, который будет освобождать сам себя по прошествии заданного таймаута?

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

Демо модель: Releasing Resource on Timeout

Пожалуйста, посмотрите на приведенную демо модель. Запрашиваемая Вами функциональность может быть реализована в AnyLogic, но она требует использования дополнительных объектов. Мы создадим вспомогательную "родственную" заявку для каждой поступающей заявки, которая будет захватывать ресурс, ждать ровно 60 секунд и затем освобождать ее. Если исходная заявка захочет освободить ресурс раньше, то она сообщит своей "родственной" заявке, чтобы она прекратила процесс и немедленно освободила ресурс. Идентификаия двух "родственных" заявок осуществляется путем сравнения уникального идентификатора, хранящегося в поле id. Посмотрите на код в поле Действие при выходе объекта delayArbitrary, чтобы понять, как извлекается "родственная" заявка. 

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


Можно ли узнать в объекте Unbatch количество заявок, составляющих поступившую заявку-партию?

Да, количество заявок, составляющих партию, доступно в параметре Действие при входе объекта Unbatch как batch.contents.size().


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

Как получить доступ к наборам данных, автоматически создаваемым для динамических переменных?

Автоматически создаваемые для динамических переменных наборы данных (только в случае выбора соответствующей опции на странице Дополнительных свойств класса активного объекта) названы следующим образом: 


Тип

Имя

Описание

Для скалярных переменных
DataSet _ds_variable Набор данных, созданный для скалярной переменной  variable

Для массивов
DataSet[] _ds_array Плоский массив наборов данных, каждый из которых хранит значения определенного элемента массива array

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


Агенты

Какое количество агентов можно эффективно моделировать в AnyLogic?

AnyLogic может эффективно моделировать до нескольких миллионов агентов. Точное количество естественно зависит от используемого Вами программного и аппаратного обеспечения. 

Чтобы оценить быстродействие агентной модели на Вашем компьютере, пожалуйста, запустите модель Bass Diffusion Agent Based - она является неплохим тестом, позволяя оценить, как быстро выполняется модель с 1 миллионом агентов. 

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

 На самом деле, вряд ли имеет смысл задавать вопрос именно таким образом - куда более интересен ответ на вопрос “А сколько агентов мне действительно нужно моделировать?” Например, если Вам нужно промоделировать население страны (примерно 100,000,000 человек), то нужно ли создавать 100 миллионов агентов? Ответ будет следующий: почти всегда - нет! Есть несколько техник, позволяющих сократить затраты на вычисления и при том гарантировать корректные результаты. Например, если все регионы страны имеют одни и те же условия, то Вы можете моделировать только один регион численностью, скажем 5,000,000 человек, а затем экстраполировать полученные результаты на все население страны.


Можно ли создавать агентов динамически? Как?

Да, для этого нужно использовать метод add_имяОбъектаАгентов(), где имяОбъектаАгентов - имя реплицированного вложенного объекта (находящегося обычно на диаграмме класса Main), который моделирует популяцию агентов и отображается на диаграмме значком . Если Вы хотите создавать агентов только динамически, начав моделирование с нулевой численности популяции и постепенно добавляя агентов, то в свойстве Количество вложенного объекта, моделирующего агентов, нужно будет написать 0.

Посмотрите на приведенный пример модели. В этой модели агенты создаются событием newAgent. В действии этого события вызывается метод add_people(), создающий новых агентов. Этот метод назван так потому, что имя вложенного объекта в этой модели - people.

Демо модель: Event Generating New Agents


Можно ли сделать так, чтобы агент двигался вдоль заданного пути?

Да, для этого нужно использовать метод агента moveTo(x, y, path), который инициирует движение к точке с координатами (x,y) вдоль заданной ломаной линии (path).    

Демо модель: Agent Moving Along Path


Можно ли переместить агента из одной среды в другую?

Прямое перемещение агентов из одной среды в другую не поддерживается.

Но есть два "обходных" решения. 

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

Если по каким-то причинам требуется наличие нескольких сред, то можно предложить другое решение: 

  1. удалите агента из первой среды; 
  2. создайте нового агента с теми же значениями параметров; 
  3. добавьте его во вторую среду. 

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


Есть ли в AnyLogic функции поиска агентов, находящихся в пределах заданных координат?

Встроенных функций такого рода в AnyLogic нет. В случае дискретного пространства Вы можете найти агента, находящегося в
определенной ячейке, используя метод environment.getAgentAtCell(i,j). В остальных случаях следует использовать цикл для прохода по всем агентам.


Диаграммы и наборы данных

Как отобразить модельную дату и время в метках временной оси диаграмм?

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

Более подробно о том, как можно включить отображение модельных дат, можно прочитать здесь.


Как можно собрать статистику по нескольким прогонам модели?

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


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

Как я могу узнать, является ли в текущий момент времени состояние диаграммы состояний активным или нет?

Используйте метод isStateActive() диаграммы состояний.

Например, чтобы узнать, является ли состояние stateOne диаграммы состояний myStatechart активным, напишите

myStatechart.isStateActive(stateOne); 

в коде класса активного объекта, на диаграмме которого задана эта диаграмма состояний.


Можно ли узнать время, оставшееся до срабатывания перехода?

Да, если Ваш переход называется transitionA, то время, оставшееся до срабатывания этого перехода по таймауту, можно узнать так:  transitionA.getRest().


Связь с базами данных

Как можно считать данные из конкретной ячейки рабочей книги Excel?

Начиная с версии 6.5 в AnyLogic входит элемент Файл Excel, предоставляющий возможность легкого доступа к файлам MS Excel 1997-2007 (.xls) из моделей AnyLogic. С помощью этого объекта Вы можете:

Пожалуйста, посмотрите на приведенный ниже пример модели, демонстрирующий выполнение всех этих операций с помощью объекта Файл Excel

Демо модель: Reading and Writing Excel Files


Производительность

Есть ли возможность отключения графического интерфейса для повышения скорости выполнения модели?

Да, в AnyLogic Professional для такого случая включен метод runFast().

В AnyLogic Advanced же есть два других способа ускорения выполнения модели.

Первый - использовать эксперимент варьирования параметров, включающий в себя одну итерацию. Он запускает модель с помощью метода runFast() и не выполняет отрисовку анимации.

Второй - использовать простой эксперимент, написав в его дополнительном свойстве Действие перед "прогоном" модели или в Действии при запуске корневого активного объекта следующий код:

getEngine().setRealTimeMode( false );
getPresentation().getPanel().setFrameManagementAdaptive( false );
getPresentation().getPanel().setFrameRate( 0.1 );

Просто запустите эксперимент и не переходите на анимацию корневого объекта, а оставайтесь на странице с презентацией эксперимента.

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


Можно ли оптимизировать производительность модели с помощью профайлера Java?

Есть ли возможность использования профайлера Java Profiler с Anylogic? Я хочу определить, какие методы в моей модели наиболее затратны с точки зрения использования ЦП, и оптимизировать мою модель.

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


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

Как можно узнать координаты пешехода?

Координаты пешехода можно получить с помощью методов ped.getX(), ped.getY() и ped.getZ(). Вы можете вызывать эти функции, например, в действиях при входе, выходе пешеходов из объектов Пешеходной библиотеки и т.д.


Как наиболее эффективно промоделировать эвакуацию в результате происхождения чрезвычайного происшествия?

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

Почти у всех объектов диаграммы процесса Пешеходной библиотеки есть специальные методы cancel(ped) и cancelAll(). Используйте эти методы для эвакуации пешеходов. 

Первый метод прерывает выполнение текущей команды и заставляет заданного пешехода ped немедленно покинуть блок через порт ccl

Второй метод делает то же самое со всеми пешеходами, находящимися в объекте в момент вызова метода.

Порт ccl обычно располагается на нижней границе значка объекта: 

Чтобы задать альтернативное поведение для эвакуируемых пешеходов, Вам нужно будет нарисовать еще одну диаграмму процесса и соединить порты ccl объектов основной диаграммы с входным портом объекта PedEnter этой альтернативной диаграммы процесса.

Более того, при вызове как cancel(ped), так и cancelAll() выполняется код параметра Действие при отмене, так что Вы можете выполнить какие-то дополнительные действия с эвакуаируемыми пешеходами, например, изменить цвет их фигурок.


Можно ли изменить фигуру анимации пешехода? Я хочу отображать его на анимации картинкой, а не просто кружком или крестиком.

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

Вы можете выбрать любую стандартную фигуру презентации АnyLogic, или же нарисовать нужную Вам картинку с помощью нескольких стандартных фигур, объединив их в группу

Вы можете также загрузить изображение из файла картинки любого общепринятого формата с помощью элемента Изображение.

Ну и самое главное - пешеходы теперь могут отображаться и на трехмерной анимации. Используйте расположенные на палитре 3D Объекты стандартные трехмерные изображения, или загружайте свои собственные с помощью элемента 3D Объект.

Чтобы пешеход отображался на анимации какой-то нестандартной фигурой или изображением, нужно просто указать имя этой фигуры в поле Фигура презентации создающего пешеходов объекта (например, PedSource или PedEnter).

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

Демо модель: Subway Entrance Hall

Например, в приведенном выше примере модели создающиеся различными источниками пешеходы используют для анимации различные 3D объекты (их выбирает функция choosePedShape, чей вызов помещен в полях Фигура анимации этих объектов).


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

Простейшим способом моделирования нескольких однотипных точек обслуживания (коими в данном случае являются турникеты) является использование объекта PedServices

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


Как я могу промоделировать эскалатор (или движущуюся лестницу)?

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

Чтобы перевести объект в режим "движущегося этажа", выберите флажок Движущийся этаж на странице его свойств и задайте скорость и направление его движения в расположенных ниже полях Со скоростью, м/с и Направление, в радианах.

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

Демо модель: Several Floors


Моделирование складов

Можно ли моделировать складскую логистику с помощью AnyLogic?

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

Основная библиотека AnyLogic содержит четыре объекта (NetworkStorage, NetworkStorageZone, NetworkStoragePut и NetworkStoragePick), предназначенных для упрощения моделирования хранилищ с множеством ячеек хранения, имеющих периодическую структуру, таких, как зоны хранения складов, в рамках моделей, построенных с помощью объектов Основной библиотеки для моделирования транспортных сетей.

Пример модели: Wholesale Warehouse


Как я могу промоделировать один складской стеллаж (а не два, расположенных друг напротив друга)?

В AnyLogic зоны хранения задаются с помощью объекта NetworkStorage, который всегда моделирует именно два стоящих друг напротив друга стеллажа и проход между ними. Но Вы можете выбирать ячейки, в которые будете помещать поддоны/товары. Каждая складская ячейка имеет три координаты: ряды (0..1), местоположение в ряду (0..npositions), и уровень (0..nlevels). И Вы можете все так же итерироваться по уровням и местоположениям в ряду, но использовать только один ряд из двух, скажем, с индексом 0.


Пользовательские библиотеки

Где нужно добавлять комментарии к элементам библиотеки, чтобы они попали в Javadoc документацию?

Разрабатывая библиотеку в AnyLogic, я заметил, что есть возможность генерации Javadoc документации, и решил включить ее в состав библиотеки. Где именно я должен писать комментарии к элементам модели, чтобы они попали в Javadoc?

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