КАК ПРОГРАММИРОВАТЬ РОБОТА-УБИЙЦУ

Иван Скляров

Xakep, номер #053, стр. 053-048-5


MIN(0,7;0,4) = 0,4

Следовательно, степень принадлежности терма РЕЗКО ВПРАВО лингвистической переменной РУЛЕВОЙ УГОЛ будет равна 0,4. Но это еще не все. Представим, например, что расстояние в 1,8 м для терма БЛИЗКО окажется равно степени принадлежности 0,7, а то же самое расстояние для терма ОЧЕНЬ БЛИЗКО – 0,3, как это показано на рис.2 красными пунктирными линиями. Аналогично для переменной НАПРАВЛЕНИЕ угол в 18 градусов для терма ЛЕВОЕ может иметь степень принадлежности 0,6, а для терма ПРЯМО — 0,4. Т.е. вполне могут иметь не нулевой выходной результат сразу несколько нечетких правил. Но нам необходимо получить только одно значение! Какое из них считать правильным? Для этого мы должны применить оператор MIN()/MAX() для каждого разработанного нами правила, а из всех полученных значений выбрать максимальное. В результате всех этих действий мы получим одно-единственное нечеткое значение управляющей переменной, которое необходимо привести к четкому значению, т.е. переходим к этапу дефаззификации.

Дефаззификация

Получить четкое значение не так-то просто, как кажется. Допустим, функция принадлежности для терма РЕЗКО ВПРАВО лингвистической переменной РУЛЕВОЙ УГОЛ имеет Л-вид (см. рис.5).

Мы в результате обработки получили, например, значение 0,7. На рисунке показано, что четкое значение может быть любым из диапазона 60-90 градусов (основание заштрихованной фигуры). Какое считать правильным? Но это еще простейший случай, т.к. я уже говорил, что вид функции принадлежности может быть совершенно любой. Существует несколько методов по устранению нечеткости. Например, метод центра максимума (берется центральное значение, как показано на рисунке), метод наибольшего значения (выбирается наибольшее из полученных значений), метод центроида (окончательное значение определяется как проекция центра тяжести заштрихованной фигуры) и т.д.

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

БЛОК ПОИСКА ЖЕРТВЫ & БЛОК ПРЕСЛЕДОВАНИЯ И УНИЧТОЖЕНИЯ ЖЕРТВЫ

За неимением места мы не будем разбирать эти блоки в деталях. Обсудим поверхностно второй блок — блок поиска жертвы. Нужно сразу исходить из предположения, что поиск жертвы происходит в небольшом, ограниченном пространстве. Действительно, киллер не ищет жертву где ни попадя, он четко знает, где та должна появиться, и уже выслеживает ее в определенном месте. Условно будем считать, что это музей с множеством комнат и перемещающихся объектов (людей). Также будем считать, что наш робот не снайпер, т.е. для выполнения задания ему необходимо достаточно близко (вплотную) подойти к жертве. Поиск жертвы можно реализовать по-разному. Простейший способ - это патрулирование роботом комнат с периодической сменой позиций и просмотром окружающей обстановки. Т.е. робот совершает полный оборот вокруг своей оси, при этом сравнивая любой объект (человека) с «эталоном» (жертвой), если цель не обнаружена, делает некоторое количество шагов вперед и снова совершает полный оборот, и так до тех пор, пока жертва не появится в его поле зрения. Для полного оборота (360 градусов) роботу достаточно совершить всего два поворота вокруг своей оси (напомню, обзор «глаз» равен 180 градусов!). Кстати, этот способ легко реализовать, не прибегая к нечеткой логике. Как только жертва появится в поле зрения, включается блок ПРЕСЛЕДОВАНИЯ И УНИЧТОЖЕНИЯ ЖЕРТВЫ. Т.е. робот начинает двигаться прямо на цель. Не исключено, что жертва начнет «убегать» от преследования, поэтому робот должен корректировать свое направление таким образом, чтобы цель всегда находилась прямо по курсу. Нельзя также исключать ситуации, когда объект совсем пропадет из поля зрения (например, зайдет за угол), тогда робот должен дойти до того места, где была потеряна цель, и включить блок поиска жертвы. Блок преследования и уничтожения жертвы, естественно, нужно программировать с помощью нечеткой логики.

Назад на стр. 053-048-4  Содержание  Вперед на стр. 053-048-6