- •Основы теории алгоритмов.
- •1.1. Подходы к определению понятия алгоритма
- •1.2. Формы представления алгоритмов
- •Правила применения символов:
- •Правила выполнения соединений:
- •Специальные условные обозначения:
- •1.3. Основные свойства алгоритма
- •1.4. Типы алгоритмов
- •1.5. Основные принципы и способы разработки алгоритмов
- •1.6. Методы построения алгоритмов
- •Эвм как исполнитель алгоритмов. Принципы программного управления
- •2.1. Основные понятия и принципы программного управления эвм и исполнением алгоритмов
- •2.2. Особенности программного и микропрограммного управления
1.6. Методы построения алгоритмов
С учетом рассмотренных подходов, принципов и способов разработки алгоритмов для решения различных классов задач, в том числе сортировки, поиска в списке, вычисления биноминальных коэффициентов и других, используется достаточное количество эффективных методов, обеспечивающих получение эффективных алгоритмов решения этих задач. Это методы:
-
«разделяй и властвуй»;
-
последовательных приближений;
-
наискорейшего спуска;
-
обратного прохода;
-
динамического программирования;
-
поиска с возвратом;
-
выделения подцелей;
-
моделирования;
-
«жадных» алгоритмов и др.
Эти и другие методы являются основой построения программных модулей, обеспечивают методологию проектирования и разработки программ.
Метод «разделяй и властвуй»
Решения задач аддитивного характера можно осуществлять путем их разделения на части и получить решение всей задачи путем решения ее частей. Для этого используется известный метод проектирования эффективных алгоритмов, который называется методом декомпозиции, или методом «разделяй и властвуй», методом разбиения. Метод предполагает декомпозицию (разбиение) задачи размера n на частные задачи, решение которых позволяет получить решение общей, исходной задачи. Такой метод может применяться в сортировке слиянием, в деревьях двоичного поиска и других и характеризуется легкостью разработки и достаточной эффективностью.
Такой подход позволяет использовать параллельную обработку массива данных. При этом задание начальных значений элементов массива осуществляется для всего массива и выполняется с помощью тех же начальных значений для частей массива. Матричные операции сложения и вычитания выполняются таким же способом, так как эти операции определены для отдельных элементов.
Примерами использования этого метода может быть решение задач:
-
численного интегрирования;
-
двойного бухгалтерского учета, когда итоги по столбцам вычисляются для различных категорий, включающих дебиты и кредиты, после чего результаты в нужных сочетаниях сравниваются;
-
вычисления площади неправильного многоугольника путем разбиения его на треугольники и вычисления их площадей по отдельности с последующим суммированием для определения исходной площади многоугольника;
-
сортировки слиянием, выполняющейся разделением n элементов списка на две группы, их отдельной сортировки и последующего слияния;
-
сортировки Шелла, основанной на разбиении списка на n/2 подсписков, содержащих по два элемента каждый, их сортировки и на последующих циклах сортировки n/4 четырехэлементных, затем n/8 восьмиэлементных списков;
-
поиск пути в лабиринте, при котором лабиринт разделяется на четыре части, через каждую из них отыскивается путь и конечные точки сравниваются между собой, а затем, объединяя в каждом из квадрантов сообщающиеся между собой входные и выходные точки, получают соответствующие пути для всего лабиринта;
-
составления графика проведения теннисного турнира и др.
Метод последовательных приближений
Для известного приближенного решения существует метод его уточнения. Так, начиная с исходного приближения f0 производится последовательное уточнение решения f1 затем уточнение решений f2, f3 и т.д. В результате получается последовательность приближенных решений, которые или сходятся к действительному решению, или приближаются к нему с допустимой для практики погрешностью. Здесь любой член последовательности может зависеть или только от предшествующего ему члена или от всех более ранних приближений.
На основе такого метода разработки алгоритма могут решаться различные задачи:
-
вычисления квадратного корня уравнения вида xk-n=0, по методу Ньютона- Рафсона (1.3);
-
вычисления математических функций типа (1.4);
-
численного интегрирования.
(1.3)
(1.4)
Рекомендуется метод последовательных приближений использовать при известных математических выражениях, которые обеспечивают сходимость алгоритма к желаемой величине. В последующем два приближенных ответа с близкими значениями принимаются одинаково близкими к действительному решению. Использование метода да численных расчетов ограничивается за счет роста погрешностей от времени вычислений на ЭВМ.
Метод наискорейшего спуска
Метод наискорейшего спуска отражает известный принцип: «для достижения дна требуется лишь идти вниз», при этом движение вниз не гарантирует достижения самой низкой точки, а отыскивается дно первого обнаруженного углубления. Этот метод предполагает точный выбор исходной точки в начале поиска и позволяет получить хороший результат при решении задачи, не имеющей оптимального решения в силу невозможности или дороговизны его получения
Отличительные особенности метол наискорейшего спуска (МНС) от метода последовательных приближений (МПП):
-
в МПП за исходное берется любое приближение, которое затем улучшается, а в МНС направление каждого шага планируется так, чтобы он был направлен в сторону нужного решения;
-
использование МПП при создании программ заключается в том, что, принимая какую-либо работающую программу за исходную, производится ее последовательное улучшение с помощью отладки и настройки, а МНС применяется в методах нисходящего проектирования и частично в методе пошагового уточнения.
Примерами алгоритмов, разработанных на основе МНС, являются алгоритмы решения задач:
нахождения кратчайшего маршрута коммивояжера, который должен посетить заданное множество городов не более одного раза каждый и вернуться в исходную точку, при этом во все города можно попасть из любого другого, или по прямому пути между ними, или через другие города;
нахождения кратчайшего пути в лабиринте — можно рассматривать как разновидность задачи о коммивояжере;
формирования последовательных приближений ряд чисел Фибоначчи 1, 1, 2, 3, 5, 8, 13, 21, 34,..., каждое из которых является суммой двух предыдущих, определяемых как
![]()
где k-е число последовательности отыскивается с помощью вычисления всех предшествующих чисел, ни одно из которых не является его приближением, а ряд, образуемый этими числами, не сходится, а расходится;
-
формирования последовательностей для получения биноминальных коэффициентов.
Метод обратного прохода
Метод обратного прохода применяется при заданном порядке (направлении) решения некоторой задачи. Замена этого направления на обратное может помочь упростить задачу без ее изменения. Метод может быть использован при решении задач:
-
выдачи последовательности чисел от 1 до 10. Эта задача направлена, но не обратима, так как перемена направления этой процедуры изменит результат;
-
нахождения всех простых чисел между 1 и 100. Задача направлена и обратима, но если начинать со старших чисел, то решение задачи существенно усложнится;
-
поиска пути в лабиринте. Задача направлена и обратима, если не осуществляется истинный поиск в «реальном» лабиринте. Но если за исходную точку взять выход и находить путь ко входу, такая задача аналогична первоначальной.
Метод динамического программирования
Понятие метода динамического программирования связано с методом планирования многоэтапных процессов принятия решения и может рассматриваться как:
-
метод математического программирования;
-
метод решения задач оптимизации, представленных через последовательность этапов принятия решений.
Метод математического программирования охватывает прикладные задачи и вычислительные методы для задач оптимизации, которые формулируются как задачи максимизации или минимизации функции (целевой функции) на ограниченном множестве пространства действительных n-компонентных векторов. Оптимизационные методы представляют процесс нахождения наилучшего решения задачи, которое определяется по некоторому заранее установленному критерию.
В программировании метод оптимизации используется при разработке алгоритма генерации программы, которая наилучшим способом использует ресурсы ЭВМ (объем памяти, время исполнения и др.). При этом различают три формы оптимизации:
-
глобальная оптимизация — оптимизация, используемая для переупорядочивания установленной последовательности выполнения команд программы с целью исключения избыточности вычисления;
-
регистровая оптимизация — оптимизация, связанная с привязкой машинных регистров памяти к переменным и промежуточным численным результатам с целью минимизации числа случаев «холостого» резервирования регистров для их загрузки в дальнейшем;
-
локальная оптимизация — оптимизация, обеспечивающая адаптацию программы к конкретным особенностям архитектуры машины и устранение избыточности локальных операций типа загрузки в регистр величины, которая уже хранится в нем.
Как метод разработки алгоритмов динамическое программирование заключается в одновременном использовании прямого и обратного проходов для решения задачи. Перемещение в одном направлении позволяет получить одно из возможных решений, а в другом — обеспечивает альтернативное решение. После сравнения этих решений выбирается лучшее. Примером использования этого метода является решение варианта задачи о коммивояжере, где требуется найти кратчайшее расстояние между двумя пунктами, которые могут обозначать один и тот же город. При этом найденный путь представляет кратчайший циклический маршрут, следуя которому коммивояжер не повторяет ни один из участков пути. В этом случае можно получить хороший, но не обязательно лучший маршрут. Кроме этого, рассматриваемый метод может быть использован для нахождения кратчайшего пути через лабиринт.
В рамках теории управления в наиболее общей форме динамическое программирование представляет процесс пошагового решения задач» при котором на каждом шаге выбирается одно решение из множества допустимых на этом шаге решений, притом такое, которое оптимизирует заданную целевую функцию или функцию критерия. В основе теории динамического программирования лежит принцип оптимальности Беллмана: оптимальное поведение обладает тем свойством, что каковы бы ни были первоначальное состояние и решение (то есть управление), последующие решения должны составлять оптимальное поведение относительно состояния, получающегося в результате первого решения. От противного: если не использовать наилучшим образом то, чем мы располагаем сейчас, то и в дальнейшем не удастся наилучшим образом распорядиться тем, что могли бы иметь.
Таким образом, если имеется оптимальная траектория, то и любой ее участок представляет собой оптимальную траекторию. На основе этого принципа формулируется эффективный метод решения широкого класса многошаговых задач. Общим для задач динамического программирования является то, что переменные в модели рассматриваются не вместе, а последовательно, одна за другой. Строится вычислительная система, в которой вместо одной задачи со многими переменными строится много задач с малым числом переменных в каждой, что сокращает объем вычислений. Такое преимущество достигается только при выполнении двух условий:
-
при использовании аддитивного критерия оптимальности, когда общее оптимальное решение является суммой оптимальных решений каждого шага;
-
будущие результаты не зависят от предыстории того состояния системы, при котором принимается решение.
Из этого принципа оптимальности Беллмана вытекает основной прием — нахождение правил доминирования, на основе которых на каждом шаге производится сравнение вариантов будущего развития и заблаговременное отсечение заведомо бесперспективных вариантов. Реализация этих правил формальными выражениями, однозначно определяющими элементы последовательности один за другим, носит название разрешающих правил. Процесс решения этих правил состоит из этапов:
-
на первом этапе процесс ведется «с конца», где для каждого из различных предположений о содержании окончания предпоследнего шага находится условное оптимальное управление на последнем шаге, то есть управление, которое надо применить, если предпоследний шаг закончился определенным образом. Такая процедура проводится до самого начала;
-
на втором шаге процедура выполняется от начала к концу, в результате находятся не условные, а действительно оптимальные шаговые управления на всех шагах операции.
Рассмотренный метод, несмотря на выигрыш в сокращении вычислений, по сравнению с методами имеет перебор возможных вариантов. В силу этого размерность решаемых практических задач должна быть незначительной, что ограничивает применение метода. С учетом этого выделяют следующие общие классы задач, для которых может быть применим метод динамического программирования:
-
задачи планирования деятельности экономических объектов;
-
задачи оптимального распределения ресурсов между различными направлениями во времени.
Кроме этого метод может быть использован для решения следующих задач:
-
определения вероятности победы в спортивных турнирах;
-
триангуляции многоугольника и др.
Триангуляция многоугольника — выбор совокупности хорд (линий между несмежными вершинами), таких, что никакие две хорды не будут пересекаться, а весь многоугольник будет разбит на треугольники.
Если общая длина хорд будет минимальной, то такая триангуляция будет называться минимальной.
Метод сортировки
Рассмотрение методов построения алгоритмов основывается на известных отечественных и зарубежных литературных источниках.
Сортировка (sorting) — распределение, отбор, деление на категории, сорта, разряды; в программировании традиционно используется в узком смысле, как сортировка предметов в возрастающем или убывающем порядке.
Этот метод применяется при решении задач:
-
группировки, сбора всех элементов с одинаковым значением некоторого признака;
-
поиска общих элементов за один последовательный просмотр всех файлов, без возвратов;
-
поиска и выдачи информации в форме более удобной для человеческого восприятия.
Задачей сортировки является упорядочение N элементов R1, R2, …, RN (записи), представленных файлом. Каждая запись R имеет ключ Kj), который и управляет процессом сортировки. Кроме ключа запись может содержать дополнительную сопутствующую информацию, которая не влияет на сортировку, но всегда остается в этой записи, Отношение порядка «<» на множестве ключей вводится так, чтобы для любых трех значений ключей а, b, с выполнялись условия:
-
справедливо одно и только одно из соотношений а<b, а=b, b<а (закон трихотомии);
-
если а<bи b<с, то а<с (закон транзитивности).
Эти два свойства определяют математическое понятие линейного упорядочения, называемого совершенным упорядочением. Любое множество с отношением «<», удовлетворяющим условиям, поддается сортировке большинством методов, хотя многие из них годятся только для числовых и буквенных ключей с обычным отношением порядка.
В ходе решения задачи сортировки требуется найти такую перестановку записей p(1) p(2)...p(N), после которой ключи расположились бы в неубывающем порядке:
![]()
При этом сортировка будет устойчивой, если она удовлетворяет дополнительному условию: записи с одинаковыми ключами остаются в прежнем порядке, то есть:
.
Процедура решения задачи сортировки включает этапы:
-
физическое перемещение записей в памяти так, чтобы их ключи были упорядочены;
-
создание вспомогательной таблицы, которая некоторым образом описывает перестановку и обеспечивает доступ к записям в соответствии с порядком их ключей и др.
В методах сортировки предполагается существование величин ∞ и -∞ или одной из них, которые, соответственно, больше или меньше любого ключа:
.
Рассмотренные величины используются в качестве искусственных ключей и как граничные признаки. Указанное неравенство исключено. Если же оно все же допускается, алгоритмы можно модифицировать так, чтобы они работали хотя бы с частично сниженной эффективностью.
Существуют следующие виды сортировки:
-
внутренняя — все записи хранятся в обычной оперативной памяти;
-
внешняя — для записей, не помещающихся в оперативной памяти.
При внутренней сортировке имеются более гибкие возможности для построения структур данных и доступа к ним. Внешняя сортировка показывает, как поступать в условиях сильно ограниченного доступа.
Для выполнения алгоритма сортировки N записей требуется времени порядка N log N и около log N «проходов» по данным. При удвоении числа записей — время, при прочих равных условиях, более чем вдвое.
Выделяют следующие методы сортировки:
-
сортировка вставками — элементы просматриваются по одному, и каждый новый элемент вставляется в подходящее место среди ранее упорядоченных элементов (сортировка карт при игре в бридж);
-
обменная сортировка — если два элемента расположены не по порядку, то они меняются местами. Этот процесс повторяется до тех пор, пока элементы не будут упорядочены;
-
сортировка посредством выбора — сначала выделяется наименьший (или, может быть, наибольший) элемент и каким-либо образом отделяется от остальных, затем выбирается наименьший (наибольший) из оставшихся и т.д.;
-
сортировка подсчетом — каждый элемент сравнивается со всеми остальными; окончательное положение элемента определяется подсчетом числа меньших ключей.
Выбор конкретного метода сортировки осуществляется на основе характеристик ЭВМ.
Внутренняя сортировка, при малом числе записей, подлежащих сортировке, может осуществляться в оперативной памяти ЭВМ. Для записи и/или ключей, занимающих несколько слов памяти, целесообразно составить новую таблицу адресов (ссылок), которые указывают на записи, и работать с этими адресами, не перемещая громоздкие записи. Этот метод сортировкой таблицы адресов (рис. 1.6).

Рис.1.6. Сортировка таблицы адресов
Для коротких ключей и при большой длине сопутствующей информации в записях может быть применен метод сортировки ключей.
При методе сортировки списка можно использовать вспомогательное поле связи, которое включается в каждую запись. Связи обрабатываются так, что в результате все записи оказываются связанными в линейный список, в котором каждая связь указывает на следующую по порядку запись (рис. 1.7).
После сортировки таблицы адресов или сортировки списка можно расположить записи в неубывающем порядке. Для этого имеется несколько способов, требующих дополнительной памяти для хранения всего одной записи. Можно также переместить записи в новую область памяти, если она позволяет вместить все эти записи. Последний способ примерно в два раза меньше требует затрат времени, чем первый, но памяти тоже почти в два раза. Во многих приложениях не обязательно перемещать записи, так как поля связи, как правило, вполне приемлемы для операций с последовательной адресацией.

Рис. 1.7. Сортировка списка
Сортировка вставками осуществляется на основе предположения, что перед рассмотрением записи Rj предыдущие записи R1,..., Rj-1, уже упорядочены, и Rj вставляется в соответствующее место. Возможны несколько частных задач вставки. При простой вставке задача сортировка вставками относится к наиболее очевидным. Пусть 1 <j < N и записи R1,..., Rj-1 уже размещены так, что К1, ≤ К21 ≤... ≤ Кj-1.
Сравнение по очереди Кj с Кj-1, Кj-2 осуществляется до обнаружения того, что запись Rj следует вставить между Ri, и Ri+1. Запись Ri+1,…,Rj-1 продвигается на одно место вверх, и помещается новая запись в позицию i+1. Удобно совмещать операции сравнения и перемещения. Поскольку запись Rj попадает на положенный ей уровень, этот способ часто называют просеиванием или погружением. Метод эффективен при малых N (N<25), а для больших N - медленный, если только исходные данные не окажутся сразу почти упорядоченными.
Метод обменной сортировки предполагает систематический обмен местами между элементами пар, в которых нарушается упорядоченность, до тех пор, пока таких пар не останется. Метод простых вставок можно рассматривать как обменную сортировку: новая запись Я меняется местами с соседями слева до тех пор, пока она не займет нужного места.
Метод пузырька (обменной сортировки, метод распространения) — способ обменной сортировки, при котором сравниваются К1 с К2 путем смены мест R1, и R2, если их ключи не упорядочены, затем выполнение той же операции с R2 и R3, R3 и R4 и т.д. При выполнении этой последовательности операций записи с большими ключами будут продвигаться вправо, и на самом деле запись с наибольшим ключом займет положение RN. При многократном выполнении этого процесса соответствующие записи попадут в позиции RN-1, RN-2 — и так до упорядочения всех записей. Сущность названия метода обусловлена тем, что большие элементы, подобно пузырькам, «всплывают» на соответствующую позицию, в отличие от «метода погружения», «метода простых вставок», где элементы погружаются на соответствующий уровень.
Сортировка посредством выбора представляет метод сортировки, основанный на идее многократного выбора по следующим шагам:
-
шаг 1 — нахождение наименьшего ключа;
-
шаг 2 — пересылка соответствующей записи в область ввода и замена ключа значением ∞ (которое по предположению больше любого реального ключа);
-
шаг 3 —- повторение шага 1 для выбора ключа, наименьшего из оставшихся, так как ранее наименьший ключ был заменен на ∞;
-
шаг 4 — повторение шага 1 до тех пор, пока не будут выбраны N записей.
Рассмотренный метод требует наличия всех исходных элементов до начала сортировки, а элементы вывода он порождает последовательно, один за другим. Метод по содержанию противоположен методу вставок, в котором исходные элементы должны поступать последовательно. Однако до завершения сортировки ничего не известно об окончательном выводе. Описанный метод требует N-1 сравнений каждый раз, когда выбирается очередная запись, а также требует отдельной области вывода в памяти. Известен очевидный способ, позволяющий исключить использование ∞: выбранное значение можно записывать в соответствующую позицию, а запись, которая ее занимала, переносить на место выбранной. Эту позицию не нужно рассматривать вновь при последующих выборах.
При сортировке посредством простого выбора записи R1,…,RN переразмещаются на том же месте. После завершения сортировки их ключи будут упорядочены: К1, ≤... ≤ КN.
Сортировка методом пузырька имеет недостаток за счет выполнения большого количества обменов. Для сортировки простым выбором производится очень мало пересылок данных.
Сортировка подсчетом — метод, основанный на том, что j-й ключ в окончательно упорядоченной последовательности превышает ровно j-1 из остальных ключей. Сущность метода заключается в том, чтобы сравнить попарно все ключи и подсчитать, сколько из них меньше каждого отдельного ключа.
Сортировка подсчетом позволяет сортировать записи R1,...RN по ключам K1,…, KN используя для подсчета числа ключей, меньших данного, вспомогательную таблицу COUNT[1],…,COUNT[N]. После завершения алгоритма величина COUNT[j] + 1 определяет окончательное положение записи Rj. В этом алгоритме записи не перемещаются. Он аналогичен сортировке таблицы адресов, поскольку таблица COUNT определяет конечное расположение записей. В то же время отличается тем, что COUNT[j] указывает то место, куда нужно переслать запись Rj , а не ту запись, которую надо переслать на место Rj Таким образом, таблица COUNT определяет перестановку, обратную р(1)... р(n).
При сортировке методом подсчета не учитывается случай равных ключей. Если бы равным ключам соответствовали равные счетчики, то заключительное перемещение записей было бы довольно сложным. Но алгоритм дает верный результат независимо от числа равных ключей.
Таким образом, алгоритм сортировки — это процедура, реорганизующая файл записей так, чтобы ключи оказались в возрастающем порядке. При таком упорядоченном расположении группируются записи с равными ключами, что повышает эффективность эффективной обработки файлов.
Методы поиска
Рассматривается решение поисковой задачи нахождения данных, хранящихся с определенной идентификацией, например поиска f(х), для заданных х и таблицы значений функции f. В методе поиска присутствует аргумент поиска K, и задача состоит в отыскании записи, имеющей К своим ключом. Поиск оканчивается в случаях удачного или неудачного поиска. После неудачного поиска желательна вставка в таблицу новой записи, содержащей К. В этом случае рассматривается метод поиска со вставкой.
Выделяют следующие методы поиска:
-
внутренний и внешний поиск;
-
статический и динамический, где для статического содержимое таблицы остается неизменным, а для динамического — таблица является объектом частых вставок.
Между
поиском и сортировкой существует
определенная взаимосвязь, которая может
быть проиллюстрирована примером
определения, является ли
А
подмножеством
В,
то есть
А
В,
где А =
{а1,
а2,
…,аm}и
В = {b1,b2,...,bn}.
Возможны три варианта решения поставленной задачи.
Задача 1. Сравнивать каждое а, последовательно со всеми bj до установления совпадения.
Задача 2. Свести все bj в таблицу, затем искать каждое я, по таблице.
Задача З.Упорядочить А и В, затем совершить один последовательный проход по обоим файлам, проверяя соответствующие условия.
Каждый вариант решения этих задач имеет свои достоинства для различных диапазонов значений m и n. Для решения первого варианта необходимо около с1∙m∙n единиц времени, где с1 — константа, а для третьего варианта — с2∙(m∙log2m + n∙log2n) единиц, где с2 — некоторая (большая) константа. При хешировании решение второго варианта потребует примерно с3∙m + с4∙n единиц времени, где с3 ис4 — некоторые (еще большие) константы. Таким образом, первый вариант предпочтительнее при очень малых m и n, а при возрастании m и n — третий. При достижении n размеров внутренней памяти становится предпочтительнее второй вариант, а третий становится предпочтительнее при дальнейшем возрастании n. Отсюда можно говорить, что имеет место ситуация, где сортировка иногда хорошо заменяет поиск, а поиск — сортировку.
Метод поиска в упорядоченной таблице со случайным доступом и упорядоченными ключами К1<К2<...< KN.При сравнении возможны следующие случаи: К< Кi [Ri, Ri+1,…, Ri исключаются из рассмотрения]; К= Кi [поиск закончен]; К> Кi[Ri, Ri+1,…, Ri исключаются из рассмотрения]. Применяя эти случаи, можно уменьшить время по сравнению с последовательным поиском, если только i не слишком близко к концам таблицы.
Бинарный поиск предполагает первоначальное сравнение К со средним ключом в таблице. По результату сравнения определяется, в какой половине файла необходимо продолжить поиск, применяя к ней ту же процедуру сравнения К, что и при первоначальном сравнении. Процедура такого сравнения продолжается до log2N раз. После не более чем примерно log2N сравнений либо ключ будет найден, либо будет установлено его отсутствие. Рассмотренная процедура называется логарифмическим поиском, или методом деления пополам, или бинарным поиском.
Метод бинарного поиска позволяет отыскать аргумент К в таблице записей R1, R2,…,RN, ключи которой расположены в возрастающем порядке: К1 < К2< ... < КN, где l и u — два указателя, соответствующие верхней и нижней границам поиска. При u<l алгоритм заканчивается неудачно (значение в таблице отсутствует), а при u>l — устанавливается на середину таблицы.
Метод поиска с возвратом. Существует значительное количество задач поиска оптимальных решений, для которых невозможно применить известные методы кроме метода проб и ошибок, или метода полного перебора, позволяющего отыскать вариант оптимального решения. Этот метод имеет известное название метода поиска с возвратом, или метод альфа-бета отсечения, и позволяет существенно сократить объем операций поиска.
Рассмотренное выше динамическое программирование является одним из способов решения подобных задач, а дерево решений представляет наиболее наглядный способ изображения множества возможных решений, даже если метод выбора не имеет явно выраженной древовидной структуры. Так, на примере одного из вариантов решении задачи о коммивояжере с использованием метода динамического программирования (ДП) показан выбор нужного маршрута, который осуществляется с использованием метода поиска в глубину по дереву возможных вариантов (рис. 1.8).
Рассматриваемый метод заключается в том, что, когда согласно дереву вариантов получено решение, осуществляется возврат к той точке, где был выбран один из альтернативных вариантов. После этого генерируется другой путь, и из полученных двух маршрутов выбирается кратчайший, а затем выполняется следующий возврат и т.д.
Для n уровней сбалансированного дерева сложность поиска по нему будет определяться экспонентой от n, а для дерева с n узлами сложность поиска определяется квадратичным законом. Для уменьшения числа уровней иерархии дерева или для исключения бесполезных его ветвей можно использовать эвристические методы. Комбинируя процессы генерации возможных ветвей дерева с процессом поиска пути, можно прекратить генерацию таких ветвей, которые не будут затем рассматриваться.

Рис. 1.8. Дерево возможных решений задачи о коммивояжере
Метод поиска с возвратом и попытки повторных решений можно представить деревом поиска. При рекурсивном поиске автоматически исполн яется метод поиска с возвратом, который можно использовать дня решении задач, аналогичных поиску пути прохода сквозь лабиринт, о восьми ферзях, построения кроссвордов из списка слов, анализа шахматных ходов, о раскраске карты четырьмя цветами, вычислении арифметических выражений (см.пример), пакетной обработки информации и др.
Пример. Вычислить выражение 2 + 3∙(4 + 5) - 6.
При сканировании выражения слева направо, после выполнения операции сложения 4 + 5, ЭВМ возвращается назад для выполнения умножения на 3 и еще раз — для сложения с 2 (рис. 1.9).

Рис. 1.9. Синтаксическое дерево вычисления
Метод ветвей и границ
На практике существует широкий спектр задач поиска минимальной или максимальной конфигурации, которые решают методом поиска с возвратом, применяемого к дереву возможностей, узлы которого рассматриваются как совокупности конфигураций. Каждый потомок узла n представляет некоторое подмножество конфигураций, а каждый лист представляет отдельную конфигурацию или решение соответствующей задачи. Каждую такую конфигурацию можно оценить и на предмет наилучшей среди уже найденных решений. При рациональной организации просмотра каждый из потомков некоторого узла будет представлять намного меньше конфигураций, чем соответствующий узел, что позволит достичь листьев, не забираясь слишком глубоко.
Метод выделения подцелей
Метод выделения подцелей заключается в разбиении задачи на отдельные подзадачи, с помощью которых исходная задача решается по частям или упрощается. Метод использования подцелей заимствован из математики при доказательстве некоторой теоремы А:
-
доказательство А следует из истинности В;
-
доказательство В следует из истинности С;
-
доказательство С следует из истинности D.
Теорема D может быть доказана. Доказательство проводится от D к С, затем к В и затем к А.
Использование метода «разделяй и властвуй» является примером применения метода выделения подцелей для следующего алгоритма:
-
подцели: разделить задачу на части; решить каждую часть;
-
цель: объединить все частичные решения вместе, чтобы получить решение всей задачи.
Для метода последовательных приближений могут использоваться две подцели;
-
подцели: найти приближенное решение; уточнить его;
-
вторая из этих подцелей повторяется до тех пор, пока не будет получено достаточно точное приближение.
В методе наискорейшего спуска используется единственная подцель — продвинуться на один шаг дальше, и эта подцель повторяется до достижения такой позиции, из которой дальнейшее продвижение невозможно.
Использование метода поиска с возвратом для эвристических способов упрощения дерева поиска решения также является примером использования метода определения подцелей не путем разбиения задачи на части, а с помощью ее модификации (см. пример).
Пример. Если для решения задачи поиска кратчайшего пути через лабиринт используется метод определения подцелей, то при установлении целей анализ задачи может выполняться следующим способом:
-
кратчайший путь может быть найден, если известны узлы, расположенные на нем, и пути, по которым можно попасть к каждому из них;
-
вычеркиваются недостижимые со стороны входа узлы;
-
вычеркиваются направления, ведущие в тупики или к рассматриваемым в настоящий момент узлам;
-
тупики исключаются путем последовательного удаления позиций, имеющих только одну соседнюю;
-
лишние направления исключаются, если удалить все направления между двумя соседними узлами, кроме кратчайших прямых.
Этот способ предварительного анализа лабиринта позволяет получить кратчайший путь по следующему алгоритму:
-
шаг 1 — вычеркнуть все позиции, имеющие только одну соседнюю;
-
шаг 2 — найти вход, выход и все узлы;
-
шаг 3 —- определить и измерить прямые пути между соседними узлами;
-
шаг 4 — вычеркнуть все пути между соседними узлами, кроме кратчайших;
-
шаг 5 — вычеркнуть узлы, из которых возможно движение только в двух направлениях;
-
шаг 6 — удалить прямые пути между каждыми двумя узлами, если между ними есть более короткие непрямые пути;
-
шаг 7 — выбрать кратчайший оставшийся путь.
Рис. 1.10 иллюстрирует известный вариант задачи отыскания кратчайшего пути в лабиринте рассмотренным методом. Узлы отмечены буквами.
На графе (рис. 1.10) указаны расстояния между узлами. Уменьшение число путей этого графа может быть осуществлено с помощью шага 6 и повторного применения всех шагов, начиная с шага 1.

Рис. 1.10. Вариант отыскания кратчайшего пути в лабиринте
Метод моделирования
Рассматриваемый здесь известный метод моделирования, используемый для разработки алгоритмов, отличается от известных методов моделирования физических систем тем, что он предназначен не столько для получения решения задачи, сколько для сбора и анализа статистических данных о некоторых коэффициентах. Эти данные могут быть использованы для выполнения дедуктивных выводов о системе или для улучшения процесса моделирования. Метод может быть применен для решения задач:
-
о поставщике и потребителе;
-
о читателях и писателях;
-
игровых задач;
-
обслуживания клиентов единственным мастером и др.
В этих задачах ЭВМ осуществляет процесс счета, который и представляет собой моделирование. Однако такое моделирование подразумевает сам процесс, а не его результат.
Моделирование дискретных событий и переходов состояний представляют близкие по типу задачи, для которых проблемная среда описывается совокупностью функциональных единиц и действий. Действия производятся не непрерывно, а лишь в дискретные моменты времени, приводя к изменениям в среде. В задаче типа моделирования переходов состояний определяются по крайней мере п состояний среды, которое сравнительно мало, и последовательность действий устанавливается в соответствии со средой. В задачах моделирования дискретных событий рассматривается большое число состояний или используется случайная величина. Метод моделирования дискретных событий осуществляется в основном с помощью обмена значениями между различными переменными.
Примерами моделирования переходов состояний является машина Тьюринга, задача инвертирования программы печати страниц для генерации отчетов.
