Превращаем баг в фичу
Меня очень повеселил этот пост о том, что арифметическая ошибка превратилась в особенность работы искусственного интеллекта (который я нашел последнем списке ссылок Реймонда). Это напомнило мне одну историю, которую мне рассказал мой друг Ларс (Lars) о работе над одним очень известным шутером от первого лица, над которым он когда-то работал.
Разработчики этой игры столкнулись с проблемой: вражеский персонаж, управляемый компьютером мог увидеть смертельную опасность (например, брошенную гранату) и начать убегать от нее. Проблема в том, что полдесятка других врагов в этом районе увидят эту же угрозу и попытаются сбежать по одному и тому же лучшему пути отхода. Они будут сталкиваться друг с другом, метаться из стороны в сторону … и в результате будет далеко не реалистичная неразбериха, которая покажет неестественность игрового мира. В целом, это было связано с ошибкой в искусственном интеллекте; он был недостаточно умным, чтобы найти эффективный путь для каждого персонажа, делая, таким образом, игру менее интересной.
Вы можете попытаться решить эту проблему путем реализации более сложного и тонкого алгоритма поиска пути отхода для случая, когда несколько разных персонажей встречают опасность. Однако такты процессора являются важным ресурсов в шутерах от первого лица, и это решение возможно не будет соответствовать требованиям по производительности и потребует массу усилий со стороны разработчиков. Они, в конце концов, решили эту проблему путем написания дешевого «детектора резкого изменения направления движения», который определял, когда персонаж менял направление движения на противоположное более одного раза за короткий период времени. Когда детектор определял, что персонаж быстро меняет направление движения, стандартное поведение персонажа менялось на некоторый вариант «упасть на землю и прикрыть свою голову»[1].
В таком случае, враг будет уносить ноги от вашей гранаты, сталкиваться с другим убегающим врагом, разворачиваться, в поисках иного маршрута, и это является сигналом к изменению поведения на «пригнись и укройся[2]». Общий результат заключался не только в том, что это поведение являлось реалистичным поведением человека, но и очень радовало игрока, бросающего гранату.
Хочу отметить, что в сообщении Шона арифметическая ошибка была превращена в полезную функцию, в то время как изменения в искусственном интеллекте компьютерной игры не были предназначены для того, чтобы компьютер выиграл, а скорее были предназначены для того, чтобы обеспечить поведение, более приятное игроку. Ларс написал небольшой документ на тему «искусственной глупости», т.е. о преднамеренном проектировании ошибок в системе искусственного интеллекта, чтобы поведение казалось «интеллектуальным», создавая при этом интересные, а не глупые ситуации. Очень интересный документ. (Посмотрите эту книгу для большего представления о проектировании искусственного интеллекта в компьютерных играх.)
К несчастью, ошибки в компиляторе редко превращаются в желаемые возможности, хотя изредка такое все же происходит.
[1] Это стандартная рекомендация жителям Соединенных Штатов в случае возникновение таких критических ситуаций, как стихийные бедствия или военные действия. - Примеч. перев.
[2] В США в 50-е-60-е годы двадцатого века на уроках гражданской обороны детей учили методу защиты от внезапного ядерного нападения со стороны Советского Союза, получивший название "пригнись и укройся" (duck-and-cover). - Примеч. перев.