Здравствуйте!
Как сделать, чтобы экземпляры реплицированного активного
объекта в количестве 10 штук переходили из состояния в другое
состояние через каждые 3 секунды модельного времени?
Создал переменную var=0 и var1 = 0 в main'е. Прикрутил таймер с периодом 1
сек на var1++; переход стейтчарта (в MyClass) задал
"по условию" var1>=3. Действие перехода: var++.
Переменная значение меняет, а переход не срабатывает. :(
Oleg — 04.11.07
Забыл сказать: надо бы, чтобы они переходили по одному.
Maxim G — 06.11.07
не очень понял описание, но попробую перечислить разные варианты
1. если надо, чтобы объект выходил из состояния через 3 секунды
(например, устройство входит в состояние подготовка и должно
выйти из этого состояния через 3 секунды), то можно сделать
переход (transition) в следующее состояние и в качестве условия
перехода указать timeout со значением 3. Тогда все объекты,
независимо от состояния друг друга, попав в это состояние, будут
выходить из этого состояния через 3 секунды
2. можно создать событие occurs periodically с timeout со значением 3. Если надо,
чтобы все агенты синхронно изменяли состояние, то таймер надо
положить на уровеь выше агента. А если независимо, то событие
должно находиться в агенте. Из этого события можно отправлять
карте состояний сообщения, например, statechart.fireEvent( "tick" ); Чтобы
стейтчарт реагировал на это сообщение, в нем должен быть переход
по message типа String и с message equals to "tick"
Oleg — 06.11.07
И так, и так попытался. Всё равно элементы реплицированного
объекта, находящиеся в state1, отправляются в state2 через 3 сек. все за
раз. А нужно, чтобы, к примеру, реплицированный объект с 10
экземплярами отправлял из состояния state1 в состояние state2 свои
экземпляры по одному через каждые 3 сек.
Как-будто бы реплицированный объект - копилка с 10 монетами. И из
неё через каждые 3 сек. достаётся по одной монете (1 рублю). Вот что
не могу никак сделать.
P.S. Сделал даже, чтобы из "копилки" вынимались по одной
"монеты" через случайный период времени, задав в качестве
перехода стейтчарта таймаут с функцией распределения случайной
величины. А через постоянный промежуток времени "вынимать
монеты" не получается. Задаю таймаут перехода стейтчарта
константой, и все экземпляры ("монеты") "вываливаются"
за раз. :(
Maxim G — 06.11.07
Тогда создайте на Main таймер и переменную типа int с нулевым
начальным условием. В таймере (срабатывает каждые 3 секунды):
((Car)cars.get( currentCar )).statechart.fireEvent( "Go" );
currentCar++;
Здесь cars - реплицированный массив, Car - типа объекта в этом массиве,
statechart - карта состояний внутри объекта. Этот код будет каждые 3
секунды отправлять команду машине под номером currentCar и
увеличивать этот номер на 1.
Oleg — 06.11.07
Отлично! :) Спасибки!
А куда можно вписать что-то типа такого:
public void stopTimer1() {
if (var=10) timer1.reset();
}
В дополнительный код класса Main пишу, выдаёт: "incompatible types". :( А
всего лишь хотелось остановить таймер после отправки всех
"машин".
Oleg — 06.11.07
Фух.. Разобрался. Эх уж этот синтаксис Java... if (var==10) timer1.reset();
...Тут ещё вопросик напросился: А что, в эксперименте по
варьированию параметров нельзя перебирать параметр типа integer??? И
почему?
Maxim G — 07.11.07
кстати, это код timer1.reset() придется запустить из другого события.
Прямо из action события, которое рассылает сообщения агентам, этот
код таймер не остановит.
Integer - можно! выбираете range, нижнюю границу, верхнюю границу и шаг 1!
Oleg — 07.11.07
Хм.. В общих свойствах эксперимента по варьированию параметров
ставлю: перебор значений одного параметра: нач. значение 1, кон.
значение 100, шаг 1. Жалуется на "set_параметр(int) in имя.Main cannot be applied
to (double)". Ставлю ему double и нормалёк. Странновато как-то. Для
integer'a-то 100 не такая уж и большая цифра.
P.S. AnyLogic 5.4.1 (сборка 772)
Виктор Глейм — 08.11.07
Олег, действительно, в качестве параметра для перебора должен
быть указан параметр типа double.
Поскольку тип double представляет более широкое множество по
сравнению с int, Вам ничто не мешает поменять тип параметра с int на
double. При этом, как Вы понимаете, все равно можно будет оперировать
этим параметром как целочисленным, изменяя его значение на целые
величины.
Антон — 16.02.12
Здравствуйте, извините, что не по теме.
У меня проблема.
Требуется, что бы например 4 агента, появлялись в среде из базы
данных, с помощью запроса???