Вход | Регистрация


Информационные технологии :: Математика и алгоритмы

Написание клеточного автомата.

Написание клеточного автомата.
Я
   Torquader
 
19.09.16 - 12:41
Столкнулся с необходимостью реализации алгоритма в виде клеточного автомата (это такая система, которая находится в одном из нескольких состояний).
Обычно, клеточный автомат описывается через серию меток (одна на каждое состояние) и операторов Goto.
Второй общеупотребимый вариант - использование таблицы функций из которой выбирается функция, соответствующая состоянию, так как в 1С указателей на функции нет, а использование "Выполнить" вызывает компиляцию заключённого в него выражения, то этот метод отпадает.
Конечно, часто используется Switch, то опять же, в 1С его нет и он не сильно отличается по смыслу от goto.
Просто, хотелось бы понять, есть ли способ описания, который по пониманию не сильно отличается от goto (последние в коде 1С смотрятся не очень).
Заранее благодарен за ответы.
 
 
   Fragster
 
1 - 19.09.16 - 12:42
Если ... ИначеЕсли и есть switch и при этом СИЛЬНО отличается от goto...
   Fragster
 
2 - 19.09.16 - 12:43
вернее по классике switch как раз и был с goto в конец, если-инаечеесли этого лишен, и правильно.
   Torquader
 
3 - 19.09.16 - 12:44
(1) По производительности тоже отличается, так как если состояний больше десяти, то при каждом переходе будет выполняться сравнение всех от начала.
   Fragster
 
4 - 19.09.16 - 12:47
(3) у тебя сравнение состояния выполняется по времени сопоставимо с "действием"? тогда проведи частотный анализ и наиболее массовые "позитивные" условия вынеси вверх. В switch сравнение также происходит последовательно.
   Torquader
 
5 - 19.09.16 - 12:47
(2) Как бы, аналог switch:

Пока Истина Цикл
Если СостояниеАвтомата=Состояние1 Тогда
  // что-то выполняем
  Продолжить;
КонецЕсли;
Если СостояниеАвтомата=Состояние2 Тогда
  // что-то выполняем
  Продолжить;
КонецЕсли;
Сообщить("Неизвестное состояние:"+СостяниеАвтомата);
Прервать;
КонецЦикла;
   Torquader
 
6 - 19.09.16 - 12:49
(4) Естественно - автомат проверяет некоторые данные, которые изменяются из-вне и переходит в состояния - данных - там несколько ячеек памяти через COM-объект.
На некоторые состояния система начинает выполнять действие, но периодически должна проверять, что "ничего не случилось".
   Fragster
 
7 - 19.09.16 - 12:50
(5) не совсем верно.
полный аналог очень кривой, так как без продолжить и без проверки "последующих условий", т.е.

Если Условие 1 гоуту метка 1
Если Условие 2 гоуту метка 2
...
метка 1
действие 1
метка 2
действие 2
...

и если действие 1 не включает в себя переход в конец, то действие2 при условии 1 также будет выполнено

(6) тогда в чем проблема-то? чего не хватает? разницы же нет.
   Torquader
 
8 - 19.09.16 - 12:51
Видимо, часть "быстрых" проверок придётся вынести в COM-объект, где на Си прекрасно пишется с goto, а то, что останется в 1С, можно и через Если ИначеЕсли сделать.
   Torquader
 
9 - 19.09.16 - 12:54
с goto получается так:

goto НачальноеСостояние;

Метка Состояние1:
// какой-то код
Если Условие1()=ИСТИНА Тогда
   goto Состояние2;
КонецЕсли;
// ещё какой-то код
Если Условие2()=ИСТИНА Тогда
  goto Состояние3;
КонецЕсли;

Метка Состояние2:
// какой-то код

Метка Состояние3:
// какой-то код

Просто, над каждой меткой можно написать комментарий о состоянии, и попадать в это состояние можно из любого места кода.
   Garykom
 
10 - 19.09.16 - 12:55
Клеточный автомат прекрасно через объекты, списки, таблицы и переменные описывается в виде графа направленного.
 
 Рекламное место пустует
   Torquader
 
11 - 19.09.16 - 12:55
Просто, хотелось бы, чтобы если кто-то в этом коде начал копаться, он хоть как-то мог понять, что этот код делает.
   Fragster
 
12 - 19.09.16 - 12:55
(9) так в 1с все также реализовывается на ИначеЕсли
   Torquader
 
13 - 19.09.16 - 12:56
(10) Ну, и где это в 1С ?
   DailyLookingOnASunse
 
14 - 19.09.16 - 12:56
(13)
Структуры и соответствия.
   Garykom
 
15 - 19.09.16 - 12:57
(10)+ https://habrahabr.ru/post/65367/

(11) Нафуя? К примеру regexp все по сути конечные (а не "клеточные") автоматы но ни одно ни другое мало кто осилил ))
   DailyLookingOnASunse
 
16 - 19.09.16 - 12:57
Ну и до кучи: конечный автомат.
Клеточный автомат - это про другое.
   Garykom
 
17 - 19.09.16 - 12:57
(13) ТЗ и переменные есть в 1С ))
   Torquader
 
18 - 19.09.16 - 12:58
Просто вариант вида:

Пока лбРаботает=ИСТИНА Цикл
Если(СостояниеАвтомата>=МинимальноеСостояние)И(СостояниеАвтомата<=МаксимальноеСостояние)Тогда
  Выполнить("ОбработкаСостояния"+Формат(СостояниеАвтомата,"ЧГ=0;ЧН=0;"));
КонецЕсли;
КонецЦикла;

// как-то не очень понятным кажется.
   Torquader
 
19 - 19.09.16 - 13:01
(17) Ну, понятно, что можно взять таблицу или список, где записан код состояния и вызываемая функция и просто менять текущую строку этого списка, но это примерно тоже самое, что и (18).
Опять же, можно даже исхитриться и запихать в таблицу условия, чтобы сам код был интерпретатором того, что написано в таблице - но - добавит ли это понимания.
С таблицей, просто, не меняя код, можно новое состояние добавить - но, вопрос, в скорости работы.

Это же, всё-таки, не JavaScript - где и вопросов не возникает, как реализовывать.
   Fragster
 
20 - 19.09.16 - 13:01
Если Состояние = Состояние 1 Тогда
  ДействияСостояния1();
ИначеЕсли Состояние = Состояние 2 Тогда
  ДействияСостояния2();
ИначеЕсли Состояние = Состояние 3 Тогда
  ДействияСостояния1(); // ну хз, зачем, но автор, видимо, хочет
  ДействияСостояния3();
...
   Torquader
 
21 - 19.09.16 - 13:03
(20) У меня такая "фигня" была, когда я в DOS-приложении Wizzard писал - он как раз конечным автоматом и являлся и, по сравнению с нажатием кнопок пользователем, всё остальное было не существенно.
   Garykom
 
22 - 19.09.16 - 13:04
(19) В 1С есть ООП в виде объектов (справочники, документы, обработки) кто мешает заюзать?

И будет КА в виде справочников к примеру с ТЧ где другие следующие справочники ))
   Torquader
 
23 - 19.09.16 - 13:07
(22) Ты предлагаешь сразу писать КА, который будет пользователем настраиваться.
Понятно, что справочник - это состояния, а в табличных частях можно написать условия перехода и ссылки на новые состояния.
Всё будет красиво и просто и даже таблицу потом по состояниям можно распечатать, чтобы пользователю удобно было.

Но, мы-то пишем код для программистов, пользователю вообще не нужно знать, что там что-то работает - ему нужен результат.
   1dvd
 
24 - 19.09.16 - 13:07
(20) +1
(21) не пойму чего тебе не нравится
   Torquader
 
25 - 19.09.16 - 13:11
(24) Просто, (20) нужно заворачивать в цикл.
Просто, к сожалению, состояние не одной переменной определяется - If-ы будут вложенные.
В общем, я понял, всем нравится (20) - значит, в коде будет (20) - по крайней мере, если кто-то встретит, все будут понимать, что тут происходит.

А вот над (22) и (23) подумаем на будущее - программируемый исполнитель - это тоже очень хорошо.
   Garykom
 
26 - 19.09.16 - 13:15
(25) Ну вот изобрел бизнес процессы и диаграммы
   Garykom
 
27 - 19.09.16 - 13:16
(26)+ Если 8-ка то кстати бизнес-процессы пойдут на ура, это в 77 повозиться пришлось бы
   Torquader
 
28 - 19.09.16 - 13:19
(26) Карта маршрута бизнет-процесса доступна только в конфигураторе - пользователи ей только пользуются.
   Fragster
 
29 - 19.09.16 - 14:02
(28) а мужики-то не знают...
   Torquader
 
30 - 19.09.16 - 15:29
(29) Бизнес-процесс - это МНОЖЕСТВО процессов, каждый из которых может находиться в каком-то состоянии, согласно маршруту.
Понятно, что через неё можно описать автомат или её саму рассматривать как автомат, но изменение состояния процесса - запись в базу данных - точно не быстрая операция.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует