Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать диаграмму переходов 
V
    Опции темы
cupper
Дата 16.5.2012, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Есть 4 состояния для приложения A. Для просты восприятие сразу прям как по задаче.

Dead, Not Connected, Hovering (аля завис), Normal.

Тем или иным способом приложение B каждые N секунд присваивает A, одно из этих состояний. Вполне нормальная ситуация, если приложение A работает корректно, то череда его состояний будет Normal -> Normal -> Normal -> ...

Между состояние возможны следующие переходы. 

Dead -> во все
Not Connected -> Dead, Normal
Hovering -> во все
Normal -> во все.

При переходе во любое состояние кроме Normal, производится какое то действие. Переход самого в себя не может быть (т.е. Dead -> Dead), на Практике, если A сломан, то на каждой итерации проверки, ему будет присваиваться статус Dead, но только при первом таком переходе (например Normal -> Dead) должно выполнится некое действия соответствующее состянию Dead. В дальнейшем (Dead -> Dead) просто игнорируется.

До появление состояние Hovering, все это было реализовано следующим образом

Код

bool first_dead = false;
bool first_not_connected = false;

bool is_dead = false;
bool is_not_connected = false;

is_dead = CurrentTime - LastCheckTime > SomePeriod;
is_not_connected = !A.is_connected();

if(is_dead)
{
    if(!first_dead)
    {
        first_dead = true;
        do_something();
    }
    first_not_connected = false;
}
else if(is_not_connected)
{
    if(!first_not_connected)
    {
        first_not_connected = true;
        do_something();
    }
    first_dead = false;
}
// it's Normal state
else
{
    first_not_connected = false;
    first_dead = false;
}


В принципе не шибко сложно. Появление же нового статус делает все немного мрачнее. А то, что еще нужно учитывать что в него можно перейти не из любого состояния, делает такую последовательность if-else вообще хреного понимаемой. А еще и не нулевая вероятностью появления новых состояний.

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

PM MAIL   Вверх
Akina
Дата 16.5.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



суть, я думаю. уловишь:

Код

Статическая переменная СтароеСостояние

Процедура(НовоеСостояние)

ТипПерехода = Конкатенация(СтароеСостояние, НовоеСостояние)
СтароеСостояние = НовоеСостояние

Select Case ТипПерехода
 Case NormalNormal 
  Call Процедура1
 Case HoveringNormal
  Call Процедура2
...
 Case DeadDead
  Call НиХренаНеДелатьАкаЗаглушка
...
End Select

КончиласяПроцедура



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
_Y_
Дата 16.5.2012, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Я делал state machine на классах. 

Имеем набор классов с общим абстрактным предком. У у каждого класса есть метод "state" собственно это состояние и обрабатывающий. Метод возвращает ссылку на следующий класс. В результате этот огромный if аккуратно и лекгочитаемо размещен мелкими порциями в разных классах.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
cupper
Дата 17.5.2012, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(_Y_ @ 16.5.2012,  21:50)
Я делал state machine на классах. 

Имеем набор классов с общим абстрактным предком. У у каждого класса есть метод "state" собственно это состояние и обрабатывающий. Метод возвращает ссылку на следующий класс. В результате этот огромный if аккуратно и лекгочитаемо размещен мелкими порциями в разных классах.

Мой вопрос это сферический конь. Но понял я это уже когда создал топик. Поглядел как белы люби реализую граф переходов, увидел что в бусте даже есть компонента для этого. Но это когда реально граф, а не 4 состояния. В итоге решил вообще немного логику пересмотреть, чтобы избавится от этой запутанности.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.