Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл: Источник:
Скачиваний:
289
Добавлен:
04.03.2014
Размер:
136.19 Кб
Скачать

3.2.4. Эвристические алгоритмы.

Если известно, что задача трудно разрешима, можно довольствоваться

эвристическими способами нахождения приближенных решений. Эвристические

алгоритмы решения задач обычно противопоставляются формальным методам

решения, опирающимся на точные математические модели. Использование эв-

ристических алгоритмов сокращает время решения задачи по сравнению с ме-

тодом полного ненаправленного перебора возможных вариантов, тем более

что в ряде задач полный перебор вообще невозможен (например, при созда-

нии алгоритма игры в шахматы). Решения, получаемые при использовании эв-

ристических методов, не являются, как правило, наилучшими, а относятся

лишь к множествам допустимых решений.

Эвристический метод состоит в том, что по заданному правилу шаг за

шагом генерируются возможные решения (кандидаты), каждое из которых за-

тем подвергается проверке на соответствие критериям, характеризующим ре-

шение. Если предролагаемое решение оказывается неприемлемым, то генери-

руется другой кандидат; причем в этом случае возможно несколько предыду-

щих шагов придется анулировать.

Пример задачи, для которой требуется сконструировать эвристический

алгоритм ее решения:

Построить последовательность из N литер в алфавите, состоящем из

трех элементов (например, 1, 2, 3), такую, что никакие две соседние под-

последовательности не совпадают друг с другом.

Например, последовательность длины N=5 с литерами "12321" приемле-

ма, но последовательности "12323" и "12123" неприемлемы.

Алгоритм. Упражнение. -

3.2.5. Итеративные и рекурсивные алгоритмы.

Решение подавляющего числа задач, представляющих практический инте-

рес, сводится к организации многошагового вычислительного процесса. Для

организации такого процесса используются два фундаментальных метода: ме-

тод итераций и метод рекурсий.

Метод итераций широко применяется в вычислительной математике. Суть

этого метода будет рассмотрена на примере.

Пусть имеется некоторая функция F(x). Необходимо найти такие значе-

ния аргумента x, для которых F(x)=0. Функция F(x) может быть алгебраи-

ческой или трансцендентной; обычно предполагается, что она дифференциру-

ема.

В общем случае функция F(x) не имеет аналитических формул для своих

корней, в противоположность, например, квадратному уравнению. Поэтому

приходится пользоваться приближенными методами нахождения корней, кото-

рые в основном состоят из двух этапов:

- отыскание приближенного значения корня;

- уточнение приближенного значения до некоторой заданной степени

точности.

Очень часто приближенное значение корня бывает известно из физи-

ческих соображений, а в других случаях можно использовать графические

методы.

Численный метод, в котором производится, шаг за шагом, уточнение

первоначального грубого приближения, называется методом итераций. Каждый

шаг в таком методе называется итерацией. Если при последовательных ите-

рациях получаются значения, которые все ближе и ближе приближаются к

истинному значению корня, то говорят, что метод итераций сходится.

Одним из методов уточнение приближенного значения корня уравнения

F(x) является "знаменитый" метод Ньютона-Рафсона, который записывается в

форме

F'(x )

n

x = x - --------- ,

n+1 n F''(x )

n

где условия сходимости принимают вид:

- x - выбрано достаточно близко к корню уравнения F(x)=0;

0

- производная F''(x) не становится слишком большой;

- производная F'(x) не слишком близка к нулю. -

Рекурсия - это метод определения или выражения функции, процедуры,

языковой конструкции или решения задачи посредством той же функции, про-

цедуры и т. д. Функция (или процедура), которая прямо или косвенно обра-

щается к себе, называется рекурсивной. Применение рекурсии часто позво-

ляет давать более прозрачными и сжатыми описания алгоритмов, чем это бы-

ло бы возможно без рекурсии.

При реализации рекурсивных алгоритмов каждый шаг рекурсии не дает

непосредственного решения задачи, но сводит ее к такой же задаче меньше-

го размера. Этот процесс должен приводить к задаче такого размера, когда

решение получается достаточно легко. Далее "обратный ход" дает последо-

вательные решения для задачи все большего размера, вплоть до первона-

чального. В основе реализации процедуры с рекурсией лежит стек (память

"магазинного" типа), где хранятся данные, участвующие во всех вызовах

процедуры, при которых она еще не завершила свою работу.

Несколько примеров придадут этой идее более конкретный характер.

Пример рекурсивного определения факториальной функции:

0! = 1, N! = N*(N-1)!, если N>0. -

Пример дважды рекурсивного определения функции, известной как функ-

ции Аккермана:

A(M, N) = if M=0 then N+1 else if N=0 then A(M-1, N) else

A[M-1, A(M, N-1)]. -

Пример рекурсивного определения идентификатора языка Turbo Pascal в

БНФ:

<идентификатор> ::=

<буква> |

<символ подчеркивания> |

<идентификатор><буква> |

<идентификатор><цифра> |

<идентификатор><символ подчеркивания> -

Полное рассмотрение преимуществ и недостатков рекурсивных и итера-

ционных алгоритмов лежит за пределами данного курса. Также обстоит дело

и с рассмотрением связей между рекурсией и итерацией, представляющих

глубокий теоретический интерес. Необходимо только знать, что любой ре-

курсивный алгоритм можно преобразовать в эквивалентный итеративный алго-

ритм.

Соседние файлы в папке 13_3xN