Форум

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

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