Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 Алгоритм интерпретации событый  [new]
Eolt
Member

Откуда:
Сообщений: 1306
Допустим есть устройство, которое зажигает цветные светодиоды сигнализируя о своем состоянии.
Нужно интерпретировать эти состояния, их может быть очень много и записывать в коллекцию событий

Например:

1. Горят только СКЗС и не горят другие - произошло событие А, если вместе с СКЗС горят и другие события А не было.
2. Горят КЗ, а состояние других пофиг - произошло событие Б.

Как описать и хранить в коде все эти сочетания случаев? Язык C#

К сообщению приложен файл. Размер - 122Kb
9 авг 18, 16:27    [21636427]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
hVostt
Member

Откуда:
Сообщений: 14575
Eolt,

[Flags]
public enum LightSignal
{
   None = 0,
   Blue = 0b00001,
   Red = 0b00010,
   White = 0b00100,
   Yellow = 0b01000,
   Green = 0b10000,

   TypeA = Blue | Red | Green | White,
   TypeB = Red | Green,
   TypeC = Yellow | Green,
   TypeLastToB = Red | Blue
}

public enum EventType
{
   Unknown,
   A,
   B,
   C,
   RenameLastToB
}

public EventType CalcEvent(LightSignal ls)
{
   if(LightSignal.TypeA == ls) return EventType.A;
   if(LightSignal.TypeB == ls) return EventType.B;
   if(LightSignal.TypeC == ls) return EventType.C;

   if((LightSignal.TypeLastToB & ls) == LightSignal.TypeLastToB) return EventType.RenameLastToB;

   return defauit;
}


Фих знает, короче. Можно матрицы написать или хитрую методу на третичной логике.
9 авг 18, 16:47    [21636462]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17906
Eolt
Как описать и хранить в коде все эти сочетания случаев?
Две маски. Маска "горит" и маска "не горит". Например:

Горят только СКЗ и не горят другие - произошло событие А. У события A маска Г 11001, маска Н 00110.
Горят КЗ, а состояние других пофиг - произошло событие Б. У события Б маска Г 01001, маска Н 00000.

Проверка. Есть состояние С. Если оно соответствует некоему состоянию, то должно быть:

С XOR Г = 00000
С AND H = 00000
9 авг 18, 16:54    [21636480]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Eolt
Member

Откуда:
Сообщений: 1306
hVostt
Eolt,

Фих знает, короче. Можно матрицы написать или хитрую методу на третичной логике.


Про матрицы решений что-то слышал. Но вот нагуглить никак не могу.
9 авг 18, 17:14    [21636506]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1637
Eolt
hVostt
Eolt,

Фих знает, короче. Можно матрицы написать или хитрую методу на третичной логике.


Про матрицы решений что-то слышал. Но вот нагуглить никак не могу.


Про двоичную систему наверняка слышал, в твоем случае состояние системы кодируется 5 битами.
Таким образом, у тебя 2^5=32 различных состояний системы в диапазоне 0..31.
Вот и опиши, что надо делать в каждом из этих состояний в массиве Action[0..31].
9 авг 18, 19:22    [21636635]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
hVostt
Member

Откуда:
Сообщений: 14575
Eolt
Про матрицы решений что-то слышал. Но вот нагуглить никак не могу.


Ну вон в коде привёл же битовые маски. Делаешь из этого матрицу, я написал в методе для экономии. Но можно матрицу перенести в конфиг файл и тогда это можно будет менять в конфиге.
10 авг 18, 10:06    [21637275]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Eolt,

обычный ДКА
14 авг 18, 09:59    [21641402]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Eolt
Member

Откуда:
Сообщений: 1306
kealon(Ruslan),

можно примерчик реализации в контексте моего случая?
14 авг 18, 11:27    [21641545]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Eolt
kealon(Ruslan),

можно примерчик реализации в контексте моего случая?

у тебя есть варианты состояний индикатора К, 2^5 вариантов

есть варианты состояний { S }

у тебя должна быть построена двумерная таблица M[S, K] (реальная или условная неважно)
и индикатор срабатывания F[S]

в реализации простой цикл

S = M[S, K];
if ( F[S] ) {действие... }

как будешь делать M и F это уже на твоё усмотрение, хоть вручную ...
14 авг 18, 12:12    [21641658]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Dima T
Member

Откуда:
Сообщений: 12496
Выше решение попроще описано 21636635
// Таблица соответствия событий и состояний
События[0b00000] = Событие1
События[0b00001] = Событие1
...
События[0b11111] = СобытиеN

// Обработка cостояния S
switch(События[S]) {
case Событие1:
...
case Событие2:
...
}
14 авг 18, 12:42    [21641731]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Eolt
Member

Откуда:
Сообщений: 1306
У меня скорее не таблица событий получается, а дерево.
Потому что некоторые события могут наступить, только если перед ними было другое нужное событие.

Например:

Если светится красный светодиод, и перед этим горел только синий светодиод, то  наступило событие XXX
Если светится красный светодиод, и перед этим горел синий и любые другие или
                                                    горел не синий, то событие XXX не наступило.
14 авг 18, 15:18    [21641996]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
MBo
Member

Откуда:
Сообщений: 40
Eolt
Потому что некоторые события могут наступить, только если перед ними было другое нужное событие.


Так это и есть состояния, с которыми работает машина состояний (она же конечный автомат)
14 авг 18, 15:23    [21642008]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Dima T
Member

Откуда:
Сообщений: 12496
Eolt
У меня скорее не таблица событий получается, а дерево.
Потому что некоторые события могут наступить, только если перед ними было другое нужное событие.

Это ничего не меняет. Дбавляем каждому элементу второй параметр - предыдущее состояние:
// Таблица соответствия событий и состояний
События[0b00000][0b00000] = Событие1
События[0b00000][0b00001] = Событие1
...
События[0b11111][0b11111] = СобытиеN

// Обработка cостояния S при предыдущем S_prev
switch(События[S][S_prev]) {
case Событие1:
...
case Событие2:
...
}

Таблица станет 1024 элемента.
14 авг 18, 15:31    [21642024]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
hVostt
Member

Откуда:
Сообщений: 14575
Dima T,

Крайне не оптимальное решение. Сомнительное удовольствие заполнять такую карту. Уж лучше дерево тогда. Или простой алгоритм вычисления, в котором можно определить символы и вынести скрипт наружу.
14 авг 18, 15:52    [21642064]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
exp98
Member

Откуда:
Сообщений: 1398
Eolt, так бы сразу и сказал))
Можно и методами конечных автоматов, а вообще напрашивается "контекстно-зависимая грамматика", пути по вершинам графа с повторениями, не марковские модели.

Да и хр3, что здесь ещё надо, автор выдавливает по каплям. Можно по типу экспертных систем: описать конечный набор базовых продукций "если -- то", тот же конечный автомат будет.
14 авг 18, 16:30    [21642134]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Dima T
Member

Откуда:
Сообщений: 12496
hVostt
Крайне не оптимальное решение.

O(1) вообще-то. Самое быстрое решение по сравнению с другими вариантами.

Инициализировать массив на 1024 элемента думаю не сложно, а в некоторых ЯП это сделает компилятор, т.е. во время выполнения не потратится ни одного такта проца.
14 авг 18, 20:16    [21642370]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
Dima T
Member

Откуда:
Сообщений: 12496
hVostt
Сомнительное удовольствие заполнять такую карту. Уж лучше дерево тогда.

Можно написать скрипт который сгенерит код инициализации массива и скопирует в буфер обмена.
14 авг 18, 20:22    [21642374]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
hVostt
Member

Откуда:
Сообщений: 14575
Dima T
O(1) вообще-то. Самое быстрое решение по сравнению с другими вариантами.


Крайне не оптимальное с точки зрения конфигурирования. И гибкость алгоритмов распознавания страдает. А если одно единственное событие, допустим, состоит из 3-х последовательных сигналов? Если было бы задано, что один сигнал = событие, ещё куда ни шло, но уже есть отклонения, полной задачи мы не знаем. Следовательно, нужен более гибкий и эффективный подход. Ещё важно, чтобы он был сопровождаемый, об этом очень и очень часто забывают, что крайне лично меня огорчает.
14 авг 18, 21:45    [21642399]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм интерпретации событый  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
hVostt,

Нормально всё с сопровождением и асимптотикой, по возможностями КА равноценен любым регулярным описаниям (собственно они к нему и приводятся обычно). Незаменимая вещь при реализации протоколов и прочих нудных вещей.
Для сжатия используют таблицу классов или кодогенерацию. С отладкой вот оч плохо, но это с любыми регулярками так.

вот только автор пока не может написать сколько ему нужно правил и какого они рода
15 авг 18, 00:18    [21642472]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить