Artem — 27.11.07
ТОлько начинаю работать с пакетом AnyLogic (версия 5.4.1) Пытаюсь
создать модель железнодорожного перегона, поделенного на
блок-участки. Наиболее подходящим, в этом случае, представляется
агентный подход. Создал корневой объект span и вложенные train и section.
Посоветуйте, каким образом задать условие движения поезду по
перегону, если требуется, что у поезда всегда было свободно
впереди 2 блок-участка?
Виктор Глейм — 28.11.07
Артем, если объекты типа Section соединены с помощью портов, то
решить Вашу проблему легко.
В блоке Section необходимо создать переменную (коллекцию), которая
будет хранить все соседние блоки типа Section, соединенные с данным.
Таким образом, у Вас будет возможность опрашивать соседние блоки,
а через них и последующие, заняты они или нет. Переменную
необходимо инициализировать в начале моделирования с помощью
посылки сообщений определенного, заданного Вами, типа от одного
блока к другому через порты (посмотрите, как это сделано в Enterprise
Library).
Артем — 29.11.07
Виктор, спасибо за подсказку!
Создал сообщение occupy и булевскую переменную free, внутреннюю
для Section. Для генерации сообщений использую объект Sourse из Enterprise
Library. Однако сообщения (заявки) так и остаются в объекте Source. В
строке "Действие при получении" для сообщения типа occupy
порта ввел код Section.item(0).free = false;
Не могли бы Вы уточнить, как, все таки, занимать и освобождать Section?
Виктор Глейм — 29.11.07
Артем, использовать в данном случае объекты Enterprise Library не имеет
смысла. Проще создать экземпляр сообщения и отправить его,
используя метод порта send(Object).
Артем — 30.11.07
Виктор, теперь возникла трудность, а как это сообщение отправить
не всем сразу объектам Section, а только первому - Section(0), а потом
пересылать его далее, выполняя условие проверки свободности 3-х
участков впереди занятого? Огромная благодарность за советы! :)
Виктор Глейм — 30.11.07
Артем, если Вы используете переменную для хранения ссылки на
соседний объект Section, то можно опрашивать блоки по цепочке. То
есть сначала узнать, свободен ли соседний блок, затем, узнав
соседний блок того объекта, опросить его, и т. д.
Артем — 30.11.07
а каким образом, в данном случае, хранить в переменной ссылку на
соседний объект?
Виктор Глейм — 30.11.07
Артем, Вам нужно создать в блоке Section переменную типа Section. Блоки
Section у Вас, насколько я понял, соединены через порты. С помощью
обмена сообщениями между портами, как это сделано в Enterprise Library,
Вам нужно зарегистрировать блоки, то есть инициализировать
переменные типа Section полученными ссылками.
Артем — 04.12.07
Виктор, я создал объект Gen, таймер которого выполняет действие
port.send(new Object());
и связанные с ним реплицированные объекты Stantion, содержащие
переменную free (начальное значение true - свободен). Но все таки не
могу разобраться, как пересылать это сообщение далее, проверяя
условие свободности (в моем случае сообщение из Gen отсылается
сразу всем объектам Stantion).
Артем — 04.12.07
прошу прощение, объекты Section :))
Виктор Глейм — 05.12.07
Если Вы используете реплицированный объект Section, то, очевидно,
необходимо соединить порты этих объектов последовательно. Это
можно сделать вручную, с помощью коннектора, либо динамически,
написав код. Далее, посылая сообщение первому из объектов, Вы
сможете пересылать его следующим за ним, вызывая при получении
сообщения все тот же метод send.
Артем — 07.12.07
Виктор, а как в коде обратиться к какому-либо из реплицированных
объектов, т.е., например, проверить, находится объект (переменная
"занят"/"свободен") под номером i в заданном состоянии
или нет?..Пытаюсь написать m.section.item(i).port.send(msg); ,
где m - переменная типа Section c начальным значением null,
i - переменная типа integer c начальным значением 0,
увеличивающаяся при пересылке на 1,
но выдается ошибка "cannot resolve symbol: variable section"
Артем — 07.12.07
...переменная m инициализируется в Section, как m = (Section)getOwner();
Спасибо!!!
Виктор Глейм — 07.12.07
Артем, наверное, Вы имели в виду: m = (Main) getOwner()?
Артем — 07.12.07
Прошу прощения, действительно 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"
Виктор Глейм — 07.12.07
Артем, переменная с названием "sections" не может быть найдена в
области видимости класса, где написан данный код. Если переменная
"sections" находится в объекте класса Main, то и обращайтесь к ней
соответствующим образом: m.sections.item(i);
sasa-80 — 06.09.11
MESSAGE
santander2011 — 09.09.11
MESSAGE
samichenko — 01.10.11
MESSAGE
stroteg — 08.10.11
MESSAGE
somchina — 09.10.11
MESSAGE
Sabotronik — 25.11.11
MESSAGE
dbr1001 — 06.12.11
MESSAGE
igrock1987 — 24.01.12
MESSAGE
ceramics61000 — 02.02.12
MESSAGE
z.a.b.i.r.i.v.s.e — 23.03.12
promisss_ss — 31.03.12
MESSAGE
promisss_ss — 21.04.12
MESSAGE
Betman2012 — 13.05.12
MESSAGE