AI-2009 Day 09 (1156469), страница 3
Текст из файла (страница 3)
Чтобы избежать такого дублирования вершин, и предотвратить тем самым возможное зацикливание алгоритма в случае перебора на графах общего вида, необходимо внести некоторые очевидные изменения в описанные базовые алгоритмы поиска вширь и вглубь..
В алгоритме перебора вширь следует дополнительно проверять, не находится ли каждая вновь построенная дочерняя вершина (точнее, соответствующее описание состояния) в списках Open и Closed по той причине, что она уже строилась раньше в результате раскрытия какой-то другой вершины. Если это так, то такую вершину не надо снова помещать в список Open (таким образом разрывается цикл графа-пространства, и обрывается соответствующая ветвь дерева перебора). В алгоритме же ограниченного поиска вглубь кроме рассмотренного изменения может оказаться необходимым пересчет глубины порожденной дочерней вершины, уже имеющейся либо в списке Open, либо в списке Closed.
Внесенные изменения дают гарантию, что алгоритм поиска вширь всегда завершит работу в случае существования решения, а алгоритм поиска вглубь закончится в любом случае, независимо от существования решения.
Немаловажно, что алгоритмы слепого перебора описаны нами в форме, пригодной для их программирования с использованием любого языка, не только языка программирования задач искусственного интеллекта. Алгоритм поиска вглубь демонстрирует также способ решения поисковых задач, называемый бэктрекингом (backtracking), или режимом возвратов. Этот способ предлагает определенную организацию перебора всех возможных вариантов решения задачи, число которых может быть велико.
Суть бэктрекинга состоит в том, чтобы в каждой точке процесса решения, где существует несколько равноправных (априори) альтернативных путей дальнейшего продолжения, выбрать один из них и следовать ему, предварительно запомнив другие альтернативные пути – для того, чтобы в случае неуспешности выбранного пути решения вернуться в указанную точку и выбрать для продолжения поиска следующий альтернативный вариант-путь. В общем случае в процессе решения возможно возникновение многих подобных точек выбора (называемых развилками) со своими вариантами продолжения решения, и к каждой из точек необходимо совершать возвраты и пробовать другие варианты.
В базовом алгоритме поиска вглубь по существу проводится бэктрекинг: действительно, запоминание всех альтернатив продолжения поиска (нераскрытых вершин) осуществляется в списке Open, на шаге 3 производится выбор варианта-альтернативы, а возврат к этому шагу для выбора следующей альтернативы осуществляется на шагах 4 и 5.
Некоторые языки для задач искусственного интеллекта, как, например, Пролог и Плэнер имеют специальный встроенный механизм для реализации бэктрекинга. Это означает, что запоминание развилок – самих альтернатив и связанной с ними информации, а также реализация возвратов к нужным точкам (с восстановлением всей операционной обстановки этой точки) возложены на интерпретатор языка, т.е. делается автоматически. От программиста требуется лишь определение развилок с нужными альтернативами и инициация в необходимый момент процесса возврата (заметим попутно, что язык Плэнер, в отличие от Пролога предлагает более гибкие средства управления бэктрекингом).
В целом алгоритмы слепого перебора являются неэффективными методами поиска решения, и в случае нетривиальных задач их невозможно использовать из-за большого числа порождаемых вершин. Действительно, если L – длина решающего пути, а B – средне количество ветвей (дочерних вершин) у каждой вершины, то для нахождения решения надо исследовать BL путей, ведущих из начальной вершины. Величина эта растет экспоненциально с ростом длины решающего пути, что приводит к ситуации, называемой комбинаторным взрывом.
Таким образом, для повышения эффективности поиска необходимо использовать информацию, отражающую специфику решаемой задачи и позволяющую более целенаправленно двигаться к цели. Такая информация обычно называется эвристической, а соответствующие алгоритмы и методы – эвристическими.
7
Решение задач и искусственный интеллект