ZX Review #1-2
31 декабря 1996

Читатель-читателю - Спектрум и Экспертная система.

<b>Читатель-читателю</b> - Спектрум и Экспертная система.
(С) Группа 'Light', г.Серпухов, 1996

                    СПЕКТРУМ И ЭКСПЕРТНАЯ СИСТЕМА

   Хотим сразу ответить на вопрос - а для чего и зачем это нужно и где
это применяется? А самое главное - неужели это можно реализовать на
Спектруме? Ответим сразу - МОЖНО, даже на 48K. Но сначала давайте 
сразу же определим что такое экспертная система. Под экспертной
системой понимается компьютерная система, способная предложить
разумный совет или осуществить разумное решение поставленной задачи при
имеющихся в наличии некоторых исходных данных. 
   Примером экспертных систем на Спектруме могут служить, в первую очередь, 
стратегические игры, а тем более шахматные программы. Это утверждение основано
на определении экспертной системы, которое одобрено комитетом группы
специалистов по экспертным системам Британского компьютерного общества.
   Конечно, данная статья никак не может претендовать на полноту
освещения этого раздела, но мы надеемся, что она, по крайней мере,
пробудит в Вас интерес к этой области, которая граничит с искуственным
интеллектом.
   В данной статье мы рассмотрим экспертную систему которая предполагает 
присутствие человека в начальном процессе выработки решения, т.е. в процессе 
обучения системы.
   Рассматриваемую здесь экспертную систему можно упрощенно представить в виде 
следующего алгоритма:

                        ┌─────────────┐
                        │Ввод         │
                   ┌─>  │переменных   │
                   │    └─────────────┘
                   │           
                   │    ┌─────────────┐
                   │    │Применение   │
                   │    │текущих      │
                   │    │решающих     │
                   │    │правил       │
                   │    └─────────────┘
                   │           
                   │    ┌─────────────┐
                   │    │Предположение│
                   └─── │о возможном  │
                        │исходе       │
                        └─────────────┘

   Все бы хорошо, однако на начальном этапе в такой экспертной системе
не содержится данных, по которым программа могла бы дать предположение
о возможном исходе. И вот тут на сцене появляется человек, который
выступает в роли учителя, Вводя в компьютер те переменные на которые
точно известен исход, человек обучает его. Т.о. на начальном этапе,
т.е. на этапе обучения, алгоритм экспертной системы может выглядеть
следующим образом:

                        ┌─────────────┐
                        │Ввод         │
                   ┌─>  │переменных   │ <─┐
                   │    └─────────────┘   │
                   │                     │
                   │    ┌─────────────┐   │
                   │    │Применение   │   │
                   │    │текущих      │   │
                   │    │решающих     │   │
                   │    │правил       │   │
                   │    └─────────────┘   │
                   │                     │
                   │    ┌─────────────┐   │
                   │    │Предположение│   │
                   │    │о возможном  │   │
                   │    │исходе       │   │
                   │    └─────────────┘   │
                   │                     │
                   │Да  ┌─────────────┐   │
                   └─── │Это верно    │   │
                        └─────────────┘   │
                                Нет      │
                        ┌─────────────┐   │
                        │Модификация  │   │
                        │решающих     │───┘
                        │правил       │
                        └─────────────┘

   Как видно из алгоритма, простейшую экспертную систему нетрудно
реализовать на Спектруме. В доказательство этого по данному алгоритму
составим программу на Бейсике, как на самом распространенном языке. При
желании эту программу легко перевести на любой другой язык, даже на
ассемблер. Для простоты предположим, что имеются всего два возможных
исхода: например, завтра будет дождь и завтра не будет дождя. Если ввести и 
запустить эту программу, то она задаст вопрос о количестве задействованных 
переменных.

   Номер переменной │   Имя переменной
   ─────────────────┼───────────────────────
        1           │  Давление повышается
        2           │  Давление понижается
        3           │  Ветер есть
        4           │  Ветра нет

   Ясно, что выбор переменных лежит целиком на ваших знаниях и способностях.
Затем в памяти машины создается три массива. Массив R - должен
содержать правила вывода суждений (которые разрабатывает ЭВМ), массив
V - значения переменных, представленных в данном конкретном случае,
массив V$ - служит для хранения имен переменных.
   Программа после запуска запрашивает имена этих переменных. Она
также запрашивает имена переменных O$ и B$ - двух возможных
исходов. Далее выясняются детали конкретного примера (для данной
программы требуются ответы типа Да/Нет).
   Собрав все необходимые сведения, программа делает предположение
относительно возможного исхода. Когда Вы согласны с мнением системы,
вводите Y, или N - если не согластны. Затем переходите к другому
примеру. Таким образом осуществляется процесс машинного обучения.
Следует отметить, что постепенно машина улучшает свои предсказания
относительно возможного исхода, хотя насколько лучше - зависит от
того, какую информацию Вы ввели вначале.
   (Прим.ред. - обучение системы пойдет куда лучше, если вводить в нее 
РЕАЛЬНО случившиеся факты - а был ли на самом деле дождь - а не свое согласие
или несогласие с ее решением).
   А теперь сам листинг программы.

     10  CLS
     20  INPUT "ВВЕДИТЕ ЧИСЛО ПЕРЕМЕННЫХ"; VAR
     30  DIM V(VAR): DIM R(VAR): DIM V$(VAR)
     40  FOR I=1 TO VAR
     50  V(I)=0
     60  R(I)=0
     70  NEXT I:PRINT
     80  PRINT "НАЗОВИТЕ ЭТИ ПЕРЕМЕННЫЕ "
     90  FOR I=1 TO VAR
    100  INPUT "ИМЯ ПЕРЕМЕННОЙ :";V$(I)
    110  NEXT I: PRINT
    120  PRINT "НАЗОВИТЕ ВОЗМОЖНЫЕ ИСХОДЫ:"
    130  INPUT "ПЕРВЫЙ ИСХОД: "; O$
    140  INPUT "ВТОРОЙ ИСХОД: "; B$
    150  PRINT
    160  FOR I=1 TO VAR
    170  V(I)=0
    180  PRINT "ПЕРЕМЕННАЯ: ";V$(I)
    190  INPUT "ЭТА ПЕРЕМЕННАЯ ЕСТЬ <Y/N>";A$
    200  IF A$="Y" OR A$="y" THEN LET V(I)=1
    210  NEXT I
    220  DC=0
    230  FOR I=1 TO VAR
    240  DC=DC+V(I)*R(I)
    250  NEXT I
    260  PRINT "ВОЗМОЖНЫЙ ИСХОД - ";
    261  IF DC > 0 THEN PRINT O$
    262  IF DC < 0 THEN PRINT B$
    270  INPUT "ЭТО ВЕРНО <Y/N>";A$
    280  IF A$="Y" OR A$="y" THEN GOTO 150
    290  IF DC > 0 THEN FOR I=1 TO VAR: R(I)=R(I)-V(I): NEXT I
    291  IF DC < 0 THEN FOR I=1 TO VAR: R(I)=R(I)+V(I): NEXT I
    300  GOTO 150

   После того как Вы решите, что обучили свою экспертную систему всему
на свете, можно спокойно исключить из программы обучающий блок (не
забудьте только сохранить массивы с данными) и включить данную
программу в состав какой либо еще программы, или использовать ее
независимо (например для предсказания дождя для дня грядущего).
   Представим однако, что мы включили данную экспертную систему в
стратегическую игру, и компьютер на основании этой системы управляет
неким боевым роботом, имеющим самую слабую защиту и самые
слабые средства нападения. Предположим также, что в нашу систему
вложено правило уничтожать все вражеские обьекты в пределах видимости.
И вот может наступить момент, когда этот слабенький робот очень
героически полезет на Вашу ракетную установку, и, как следствие, около
нее и останется. Здесь имеется два выхода: первый - это описать все
возможные ситуации (что не очень-то реально) и второй - ввести в
систему возможность ориентироваться с минимальными и максимальными
значениями переменных. Говоря простым языком - сделать так, чтобы наш
гипотетический робот с защитой скажем в 1 единицу не полез в драку с
роботом имеющим защиту в 20 единиц. Тогда блок-схема данной экспертной
системы будет выглядеть следующим образом:

                      ┌───────────────┐
                      │  Начало       │
                      │               │ <─┐
                      └───────────────┘   │
                                         │
                      ┌───────────────┐   │
                      │  Запрос       │   │
                      │               │   │
                      │переменных     │   │
                      │               │   │
                      └───────────────┘   │
                                         │
                      ┌───────────────┐   │
                      │Выбор наиболее │   │
                  ┌──>│  вероятного   │   │
                  │   │    исхода     │   │
                  │   └───────────────┘   │
                  │                      │
                  │Да ┌───────────────┐   │
                  │   │Могут ли задан-│   │
                  │   │ные минималь-  │   │
                  │   │ные и макси-   │   │
                  │   │мальные значе- │   │
                  └── │ния повлиять   │   │
                      │на выбор воз-  │   │
                      │можных         │   │
                      │исходов        │   │
                      └───────────────┘   │
                              Нет        │
                      ┌───────────────┐   │
                      │               │   │
                      │   РЕШЕНИЕ     │───┘
                      │               │
                      └───────────────┘

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

        ┌───────────┐      ┌─────────────────────┐
        │ Переменные│      │Запросить переменную │  <┐
        └───────────┘      └─────────────────────┘   │
                                                 │
        ┌───────────┐      ┌─────────────────────┐   │
        │           │      │Могу ли я предсказать│───┘
        │           │      │какой-то исход       │ НЕТ
        └───────────┘      └─────────────────────┘
                                      ДА
        ┌───────────┐      ┌─────────────────────┐
        │  Исход    │      │Возможный исход      │
        └───────────┘      └─────────────────────┘

        Параллельное           Последовательное
        решение                решение

   Несомненно, последовательное решение является более быстрым, так
как параллельное решение требует ввода всех известных переменных, а
последовательное может сделать вывод используя только часть из них.
Кстати, есть предположение, что именно так действует человеческий мозг
в процессе выработки решений.
   Несомненно, что в общем случае параллельная процедура позволяет
получить более точное решение по сравнению с последовательной.
Однако в данном случае договоримся, что нас интересует
больше скорость расчета, чем правильность решения. Алгоритм расчета в
данном случае будет выглядеть следующим образом:
                      ┌───────────────┐
                      │  Начало       │
                      │               │ <─┐
                      └───────────────┘   │
                                         │
                      ┌───────────────┐   │
                      │  Запрос       │   │
                      │               │   │
                      │ переменной    │   │
                      │               │   │
                      └───────────────┘   │
                                         │
                      ┌───────────────┐   │
                      │Выбор наиболее │   │
                  ┌──>│  вероятного   │   │
                  │   │    исхода     │   │
                  │   └───────────────┘   │
                  │                      │
                  │Да ┌───────────────┐   │
                  │   │Могут ли задан-│   │
                  │   │ные минималь-  │   │
                  │   │ные и макси-   │   │
                  │   │мальные значе- │   │
                  └── │ния для осталь-│   │
                      │ных переменных │   │
                      │повлиять на    │   │
                      │выбор воз-     │   │
                      │можных исходов │   │
                      └───────────────┘   │
                              Нет        │
                      ┌───────────────┐   │
                      │               │   │
                      │   РЕШЕНИЕ     │───┘
                      │               │
                      └───────────────┘

   Таким образом, мы получили быстродействующий алгоритм, описывающий
действие экспертной системы при выработке решения.
   Естественно, что материал этой статьи не описывает все возможные
решения и алгоритмы по этому вопросу, ведь проблема искуственного
интеллекта не решена до сих пор. Однако простейшие алгоритмы возможно
применять даже при программировании на СПЕКТРУМЕ. А реализация этих
алгоритмов за Вами. Ну что? беретесь создать на Speccy интеллектуальные
программы?
      Те, кому понравилась эта идея могут писать свои соображения по адресу:
142214 г. Серпухов, ул. Подольская, д. 107, кв. 57. 



Другие статьи номера:

Визитная карточка - обзор электронных журналов для ZX Spectrum.

Компьютерная новелла - По игре " The Saga"

Компьютеры, которые мы выбираем - Доработка компьютера "ATM-TURBO".

Спектрум в школе - статья о численных методах "Метод Зейделя решения СЛАУ".

Вступление - приветствие от редакции журнала.

Новые программы - копировщик ABCDcopy и утилита для форматирования гибких дисков Floppy Format.

Форум - вопросы и ответы по играм: Jungle Warrior, Buratino, Streaker, Paris Dakar, Bloodwych, Hero Quest, Apollo, Cliff Hanger, Cyber Hordes, Paradise Valley, Star Drive, Laser Platoon, Movie, Where Time Stood Still, The Sceptre, Carrier Command и т.д.

Советы экспертов - по стратегической игре Wellingsto at Waterloo.

Советы экспертов - по стратегической игре Napoleon.

Советы экспертов - по игре Star Fox.

Перекресток драконов - Dungeons & Dragons (первая глава книги об адвентюрных играх).

TR-DOS для начинающих - 5-я глава книги "Общие сведения по дисковой системе ТР ДОС".

Возвращаясь к напечатанному - последний файл диззасемблера TR-DOS.

Читатель-читателю - О железе, софте и прочем компьютера Profi...

Читатель-читателю - Востановление утерянной информации.

Читатель-читателю - Спектрум и Экспертная система.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Апoлoгия Пeccиmизma #3 - Бeзнaдeжнoe дeлo, кoнeчнo, этa eгo oдeржиmocть, cтрemлeниe дoкaзaть, чтo люди Зemли дoбры и рaзymны. Пoтomy чтo oни дoвoльнo чacтo бывaют и нe дoбры и нeрaзymны...
Игра - правила игры с обменом шашек в которую мы играли с John`ом.
Паралельные измерения - демосцена на БК0011м.
TOP TEN - Десяточка лучших игр.
IS-DOS - программистам No 2

В этот день...   25 апреля