Форум

ТОлько начинаю работать с пакетом AnyLogic (версия 5.4.1) Пытаюсь создать модель железнодорожного перегона, поделенного на блок-участки. Наиболее подходящим, в этом случае, представляется агентный подход. Создал корневой объект span и вложенные train и section. Посоветуйте, каким образом задать условие движения поезду по перегону, если требуется, что у поезда всегда было свободно впереди 2 блок-участка?
Артем, если объекты типа Section соединены с помощью портов, то решить Вашу проблему легко. В блоке Section необходимо создать переменную (коллекцию), которая будет хранить все соседние блоки типа Section, соединенные с данным. Таким образом, у Вас будет возможность опрашивать соседние блоки, а через них и последующие, заняты они или нет. Переменную необходимо инициализировать в начале моделирования с помощью посылки сообщений определенного, заданного Вами, типа от одного блока к другому через порты (посмотрите, как это сделано в Enterprise Library).
Виктор, спасибо за подсказку! Создал сообщение occupy и булевскую переменную free, внутреннюю для Section. Для генерации сообщений использую объект Sourse из Enterprise Library. Однако сообщения (заявки) так и остаются в объекте Source. В строке "Действие при получении" для сообщения типа occupy порта ввел код Section.item(0).free = false; Не могли бы Вы уточнить, как, все таки, занимать и освобождать Section?
Артем, использовать в данном случае объекты Enterprise Library не имеет смысла. Проще создать экземпляр сообщения и отправить его, используя метод порта send(Object).
Виктор, теперь возникла трудность, а как это сообщение отправить не всем сразу объектам Section, а только первому - Section(0), а потом пересылать его далее, выполняя условие проверки свободности 3-х участков впереди занятого? Огромная благодарность за советы! :)
Артем, если Вы используете переменную для хранения ссылки на соседний объект Section, то можно опрашивать блоки по цепочке. То есть сначала узнать, свободен ли соседний блок, затем, узнав соседний блок того объекта, опросить его, и т. д.
а каким образом, в данном случае, хранить в переменной ссылку на соседний объект?
Артем, Вам нужно создать в блоке Section переменную типа Section. Блоки Section у Вас, насколько я понял, соединены через порты. С помощью обмена сообщениями между портами, как это сделано в Enterprise Library, Вам нужно зарегистрировать блоки, то есть инициализировать переменные типа Section полученными ссылками.
Виктор, я создал объект Gen, таймер которого выполняет действие port.send(new Object()); и связанные с ним реплицированные объекты Stantion, содержащие переменную free (начальное значение true - свободен). Но все таки не могу разобраться, как пересылать это сообщение далее, проверяя условие свободности (в моем случае сообщение из Gen отсылается сразу всем объектам Stantion).
прошу прощение, объекты Section :))
Если Вы используете реплицированный объект Section, то, очевидно, необходимо соединить порты этих объектов последовательно. Это можно сделать вручную, с помощью коннектора, либо динамически, написав код. Далее, посылая сообщение первому из объектов, Вы сможете пересылать его следующим за ним, вызывая при получении сообщения все тот же метод send.
Виктор, а как в коде обратиться к какому-либо из реплицированных объектов, т.е., например, проверить, находится объект (переменная "занят"/"свободен") под номером i в заданном состоянии или нет?..Пытаюсь написать m.section.item(i).port.send(msg); , где m - переменная типа Section c начальным значением null, i - переменная типа integer c начальным значением 0, увеличивающаяся при пересылке на 1, но выдается ошибка "cannot resolve symbol: variable section"
...переменная m инициализируется в Section, как m = (Section)getOwner(); Спасибо!!!
Артем, наверное, Вы имели в виду: m = (Main) getOwner()?
Прошу прощения, действительно Main (у меня называется Span) в поле "Действие при получении" в коде Section пишу: for( int i=0; i<sections.size(); i++ ) { Section si = sections.item(i); if (free==true){ free=false; si.port.send(msg); } } но выдается ошибка "cannot resolve symbol: variable sections"
Артем, переменная с названием "sections" не может быть найдена в области видимости класса, где написан данный код. Если переменная "sections" находится в объекте класса Main, то и обращайтесь к ней соответствующим образом: m.sections.item(i);
MESSAGE
MESSAGE
MESSAGE
MESSAGE
MESSAGE
MESSAGE
MESSAGE
MESSAGE
MESSAGE
MESSAGE
MESSAGE
MESSAGE

Ваше сообщение