Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИЯ 16.doc
Скачиваний:
7
Добавлен:
04.06.2015
Размер:
96.77 Кб
Скачать

16.4.1. Метод частных целей

Этот метод имеет весьма общую формулировку: "Необходимо свести трудную задачу к последовательности более простых задач".

Приведенная рекомендация выглядит столь естественной и разумной, что вряд ли вызовет у кого-нибудь возражения. Более того, любой человек очень часто использует этот метод решения стоящих перед ним задач, при этом даже не догадываясь (или не отдавая себе отчета) об имеющемся для него (метода) названия. С другой стороны, в конкретной сложной задаче часто очень трудно указать способ ее разбиения на набор более простых задач. Здесь большое значение имеет опыт и искусство программиста. Тем не менее, не смотря на общность метода и отсутствие "точного рецепта" его применения очень важно освоить этот метод, так как он лежит в основе решения многих задач и по своей сути составляет основу алгоритмизации и программирования. Именно с вопроса "Можно ли данную задачу разбить на последовательность (набор) более простых?" и нужно начинать разработку простого алгоритма.

Неплохой иллюстрацией к применению этого метода является задача вычисления числа сочетаний из n элементов по m: . Для решения этой задачи можно разбить ее на несколько более простых, а именно, вычисление факториала и вычисление дроби. Сама по себе задача нахождения числа сочетаний может являться подзадачей для другой, более сложной, задачи, например, для вычисления коэффициентов бинома Ньютона.

16.4.2. Метод подъема

Этот метод, как и предыдущий, можно отнести к одному из общих "рецептов" разработки алгоритмов. Его суть заключается в следующей процедуре. Алгоритм начинается с принятия начального предположения или построения начального решения задачи. Затем начинается (насколько возможно) быстрое движение "вверх" от начального уровня по направлению к лучшим решениям. Когда алгоритм достигает точки, из которой больше невозможно двигаться "наверх", он останавливается. Попробуем наполнить конкретным содержанием эту общую формулировку. Разберем сам алгоритм подъема и его работу на примере задачи приближенного вычисления корня нелинейного уравнения f(x)=0 методом Ньютона с заданной точностью ε>0.

Первым шагом алгоритма подъема является построение начального решения. В нашей задаче начальным решением будет какое-либо число x0, удовлетворяющее условию f(x0)f"(x0)>0.

На втором шаге вычисляем x1 =x0-f(x0)/f'(x0). Следующим этапом вычисляем x2 = x1-f(x1)/f'(x1). И так далее. Процесс заканчивается, когда на некотором шаге с номером k будет выполняться неравенство │f(xk)│< ε.

16.4.3. Программирование с отходом назад

Основой программ искусственного интеллекта, независимо от того, к чему он прилагается – программированию игр, выбору решений, распознаванию образов и т. п., - является программирование перебора вариантов. Программирование перебора вариантов – это сложная задача, так как алгоритмы перебора ищут решения не по заданным правилам вычислений, а путем проб и ошибок, и схема ее не укладывается в схемы циклов, имеющихся в языках программирования. Ситуация зачастую осложняется тем, что прямыми методами перебор всех возможных вариантов невозможно осуществить из-за их огромного количества.

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

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

Алгоритм заключается в том, что сначала находится первое случайное число a1. Далее находим следующее случайное число a2. Если a2a1, то продолжаем процесс (идем вперед), так как найденное число удовлетворяет требованию задачи. В противном случае поиск случайного числа повторяем снова. И так далее. На некотором k-м шаге выбираем ak с таким расчетом, чтобы выполнялись одновременно неравенства aka1, aka2, …, akak-1. Если это так, то переходим к следующему, k+1-му шагу (движемся вперед), в противном случае (то есть если хотя бы одно из этих неравенств не выполнено) снова переходим к поиску числа ak (идем назад). При этом в последнем случае все варианты мы перебирать не будем, так как возврат назад происходит сразу после того, как не выполнилось ближайшее неравенство akai, то есть с наименьшим номером i.

Блок-схема алгоритма представлена на рис.

Да

Да

Да

Блок-схема алгоритма выбора Mслучайных номеров изN

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]