До перехода к вопросу определения скорости БА, имеет смысл разобрать следующие вопросы.
Прежде всего, надо учесть, что сейчас существует два принципиально разных подхода к реализации задачи: обычное программирование и нейросетевое. В чем заключается принципиальная разница, описано, например, здесь:
http://www.nauteh-journal.ru/files/6ff67b19-397e-4a7c-8e12-90dc156aecee В одном управляющем устройстве можно использовать оба подхода, но всегда будет ясно для какой функции какой из подходов используется. Проблемы у обоих подходов выглядят по разному (хоть и исходят из одного источника), поэтому проще рассматривать их по отдельности. Здесь и далее рассматриваем обычный или классический подход.
При классическом подходе программный код представляет собой реализацию правил управления (правила, по которым входные сигналы превращаются в управляющие). Эти правила можно разделить на 3 группы.
- Исходные. Это именно то, что требуется реализовать и заказчик может это как-то сформулировать. Они появляются либо перед началом разработки в виде ТЗ, либо добавляются по мере реализации. Грубо, они состоят из терминов (определяющих входную и выходную информацию) и функций, которыми эти термины связаны между собой.
- Разработанные. Изначальных формулировок обычно не хватает для реализации кода. Разработчикам ПО необходимы уточнения, но заказчик либо не в состоянии их сформулировать (требования заканчиваются на «сделайте хорошо»), либо справедливо считает, что создание таких правил это задача разработчиков. Следовательно, разработчикам приходится добавлять в систему собственные правила.
- Самосформировавшиеся. Когда разработчики реализуют большой код, они либо не в могут оценить все возможные комбинации внутренних переменных и какие действия будет выполнять ПО в определенных случаях, либо считают это излишней тратой времени. Тем не менее, код выполнит какое-то действие, что означает, что выбранное действие и будет правилом. Даже если не выполнит, то бездействие тоже будет правилом, такого вида: при определенной ситуации не менять состояние управляющих сигналов.
Классификацию можно описать на таком примере. Мы создаем программу для игры в шахматы, а именно управляющую систему, которая будет подсказывать нам верный ход в каждой ситуации. Сразу заметим, что сейчас «кибернетический» игрок в шахматы реализуется нейросетевым способом, но еще недавно это пытались сделать с помощью обычного программирования, что мы и рассмотрим здесь.
Итак, к правилам группы 1 (исходным) относится сами правила шахмат и задача - поставить мат противнику и не получить самому. Разработчики вынуждены сами разрабатывать тактику игры придумывать правила из группы 2. Например, если есть возможность съесть чужую фигуру, это надо делать. Когда-то (в 60-ые) казалось, что в шахматах легко сформировать нужный набор таких правил. Когда выяснилось, что правила не могут предложить верный ход, предполагалось найти его перебором ходов и ответов на них, но это было очень наивно. Даже на уровне среднего шахматиста приходилось перебирать много вариантов, но все равно не понятно какой именно выбрать, если ни один не дает заведомого выигрыша.
На помощь пришел способ оценочных функций. Например, в таком виде. Каждой фигуре выдается некий балл, типа, если пешка 1, то конь 3, ладья 5 и т.п. Компьютер не может перебрать все ходы, но если наборы ходов позволяют съесть фигуру, то из всех наборов будет выбран тот, где этот балл будет выше. На практике не все так примитивно и оценочных функций больше, но логика остается именно такой. Суть в том, что мы заменяем необходимость формулировать огромное количество правил типа: «слон ценнее двух пешек, но хуже четырех» и т.п., на одно универсальное правило. Далее из этой функции и условий её применения автоматически формируется огромное количество правил принятия решения, группа 3 - их не нужно формулировать и реализовывать, они получились сами.
При управлении БА тоже можно (даже нужно) использовать оценочные функции. Одну из таких функций сформулировать проще всего - она определяет скорость автомобиля. Представим, что мы получили такую функцию. Это выглядит очень обнадеживающе. Не надо перебирать огромное количество состояний внешней среды (окружающие объекты и пр.), мы вызываем функцию и сразу получаем ответ. Тем не менее, тут есть подводный камень, о котором в следующий раз.