Методы перебора в задачах поиска

Основанные на методе полного перебора, являются самыми универсальными, но и самыми долгими.

Энциклопедичный YouTube

    1 / 5

    ✪ Перебор. Жадные алгоритмы: Полный перебор с использованием циклов. Центр онлайн-обучения «Фоксфорд»

    ✪ #82. Арифметическая прогрессия, делимость и полный перебор вариантов! Теория чисел на ЕГЭ

    ✪ Алгоритмы C++ Перебор (часть 1)

    ✪ #84. Задача про два взвода солдат! Строгое и понятное решение. ЕГЭ по математике (профиль)

    ✪ Перебор. Жадные алгоритмы: Задача о размене монет. Центр онлайн-обучения «Фоксфорд»

    Субтитры

Метод исчерпывания

Терминология

В английском языке рассматриваемый в данной статье термин «brute-force » обычно относится к классу хакерских атак . При этом более общее понятие, математический метод исчерпывания всевозможных вариантов для нахождения решения задачи, соответствует термину «Proof by exhaustion ».

Описание

«Метод исчерпывания» включает в себя целый класс различных методов. Обычно постановка задачи подразумевает рассмотрение конечного числа состояний данной логической системы с целью выявления истинности логического утверждения посредством независимого анализа каждого состояния . Методика доказательства утверждения состоит из двух частей:

  1. Доказательство возможности исчерпания всех состояний системы. Требуется показать, что любое конкретное состояние системы (например, значение доказываемого логического выражения) соответствует хотя бы одному из рассматриваемых кандидатов в решения.
  2. Проверка каждого варианта и доказательство того, что рассматриваемый вариант является или не является решением поставленной задачи.

Характерные задачи, решаемые методом полного перебора

Хотя полный перебор в большинстве прикладных задач (особенно не связанных со взломом шифров) на практике не применяется, есть ряд исключений. В частности, когда полный перебор всё же оказывается оптимальным, либо представляет собой начальный этап в разработке алгоритма, его использование оправдано. Примером оптимальности полного перебора является алгоритм оценки времени вычисления цепочечных произведений матриц, который не удаётся ускорить по сравнению с алгоритмом, основанным на методе «грубой силы» . Этот алгоритм используется для решения классической задачи динамического программирования - определения приоритетов вычислений матричных произведений следующего вида: A 1 A 2 A 3 ⋯ A n {\displaystyle A_{1}A_{2}A_{3}\cdots A_{n}} .

Пример использования полного перебора

Исходная задача заключается в вычислении данной цепочки (матричного произведения) за наименьшее время. Можно реализовать тривиальный последовательный алгоритм, вычисляющий искомое произведение. Поскольку матричное произведение является ассоциативной операцией , можно вычислить цепочечное произведение, произвольно выбирая пару элементов цепочки (A i A i + 1) , i = 1.. n − 1 {\displaystyle (A_{i}A_{i+1}),i=1..n-1} и заменяя её результирующей матрицей A i 1: A i 1 = (A i A i + 1) {\displaystyle A_{i}^{1}\colon A_{i}^{1}=(A_{i}A_{i+1})} . Если повторять описанную процедуру n − 1 {\displaystyle n-1} раз, то оставшаяся результирующая матрица A k n − 1 {\displaystyle A_{k}^{n-1}} и будет ответом: A k n − 1 = (A k n − 2 A k + 1 n − 2) = … = A 1 A 2 A 3 ⋯ A n , k = 1.. n − 1 {\displaystyle A_{k}^{n-1}=(A_{k}^{n-2}A_{k+1}^{n-2})=\ldots =A_{1}A_{2}A_{3}\cdots A_{n},k=1..n-1} . Эта формула может быть проиллюстрирована следующим образом. Рассмотрим матричную цепочку: ⟨ A 1 , A 2 , A 3 , A 4 ⟩ {\displaystyle \left\langle A_{1},A_{2},A_{3},A_{4}\right\rangle } . Существуют следующие 5 способов вычислить соответствующее этой цепочке произведение A 1 A 2 A 3 A 4 {\displaystyle A_{1}A_{2}A_{3}A_{4}} :

(A 1 (A 2 (A 3 A 4))) , {\displaystyle {\color {Violet}(}A_{1}{\color {BurntOrange}(}A_{2}{\color {BrickRed}(}A_{3}A_{4}{\color {BrickRed})}{\color {BurntOrange})}{\color {Violet})},} (A 1 ((A 2 A 3) A 4)) , {\displaystyle {\color {Violet}(}A_{1}{\color {BurntOrange}(}{\color {BrickRed}(}A_{2}A_{3}{\color {BrickRed})}A_{4}{\color {BurntOrange})}{\color {Violet})},} ((A 1 A 2) (A 3 A 4)) , {\displaystyle {\color {Violet}(}{\color {BrickRed}(}A_{1}A_{2}{\color {BrickRed})}{\color {BurntOrange}(}A_{3}A_{4}{\color {BurntOrange})}{\color {Violet})},} ((A 1 (A 2 A 3)) A 4) , {\displaystyle {\color {Violet}(}{\color {BurntOrange}(}A_{1}{\color {BrickRed}(}A_{2}A_{3}{\color {BrickRed})}{\color {BurntOrange})}A_{4}{\color {Violet})},} (((A 1 A 2) A 3) A 4) . {\displaystyle {\color {Violet}(}{\color {BurntOrange}(}{\color {BrickRed}(}A_{1}A_{2}{\color {BrickRed})}A_{3}{\color {BurntOrange})}A_{4}{\color {Violet})}.}

Выбрав правильный порядок вычислений, можно добиться значительного ускорения вычислений. Чтобы убедиться в этом, рассмотрим простой пример цепочки из 3-х матриц. Положим, что их размеры равны соответственно 10 × 100 , 100 × 5 , 5 × 50 {\displaystyle 10\times 100,100\times 5,5\times 50} . Стандартный алгоритм перемножения двух матриц размерами p × q , q × r {\displaystyle p\times q,q\times r} требует время вычисления, пропорциональное числу p q r {\displaystyle pqr} (число вычисляемых скалярных произведений) . Следовательно, вычисляя цепочку в порядке ((A 1 A 2) A 3) {\displaystyle ((A_{1}A_{2})A_{3})} , получаем 10 ⋅ 100 ⋅ 5 = 5000 {\displaystyle 10\cdot 100\cdot 5=5000} скалярных произведений для вычисления (A 1 A 2) {\displaystyle (A_{1}A_{2})} , плюс дополнительно 10 ⋅ 5 ⋅ 50 = 2500 {\displaystyle 10\cdot 5\cdot 50=2500} скалярных произведений, чтобы вычислить второе матричное произведение. Общее число скалярных произведений: 7500. При ином выборе порядка вычислений получаем 100 ⋅ 5 ⋅ 50 = 25000 {\displaystyle 100\cdot 5\cdot 50=25000} плюс 10 ⋅ 100 ⋅ 50 = 50000 {\displaystyle 10\cdot 100\cdot 50=50000} скалярных произведений, то есть 75000 скалярных произведений .

Таким образом, решение данной задачи может существенно сократить временные затраты на вычисление матричной цепочки. Это решение может быть получено полным перебором: необходимо рассмотреть все возможные последовательности вычислений и выбрать из них ту, которая при вычислении цепочки занимает наименьшее число скалярных произведений. Однако надо учитывать, что этот алгоритм сам по себе требует экспоненциальное время вычисления , так что для длинных матричных цепочек выигрыш от вычисления цепочки самым эффективным образом (оптимальная стратегия) может быть полностью потерян временем нахождения этой стратегии .

Связь с концепцией «разделяй и властвуй»

Другим ярким примером фундаментальной концепции теории алгоритмов является принцип «разделяй и властвуй ». Эта концепция применима, когда система поддается разделению на множество подсистем, структура которых аналогична структуре исходной системы . В таких случаях подсистемы также поддаются разделению, либо являются тривиальными . Для таких систем тривиальной является исходно поставленная задача. Таким образом, реализация концепции «разделяй и властвуй» имеет рекурсивный характер.

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

По сравнению с другими примерами полного перебора, особенностью метода рекурсии является то, что конечное решение опирается не на одну-единственную тривиальную подсистему. В общем случае решение формируется на основании целого множества подсистем.

Для следующих примеров классических задач, решаемых методом «разделяй и властвуй», полный перебор является либо единственным известным методом решения, либо изначальной реализацией, которая в дальнейшем была оптимизирована:

Атака методом «грубой силы»

Кол-во знаков Кол-во вариантов Стойкость Время перебора
1 36 5 бит менее секунды
2 1296 10 бит менее секунды
3 46 656 15 бит менее секунды
4 1 679 616 21 бит 17 секунд
5 60 466 176 26 бит 10 минут
6 2 176 782 336 31 бит 6 часов
7 78 364 164 096 36 бит 9 дней
8 2,821 109 9x10 12 41 бит 11 месяцев
9 1,015 599 5x10 14 46 бит 32 года
10 3,656 158 4x10 15 52 бита 1 162 года
11 1,316 217 0x10 17 58 бит 41 823 года
12 4,738 381 3x10 18 62 бита 1 505 615 лет

Таким образом, пароли длиной до 8 символов включительно в общем случае не являются надежными. Для современных компьютеров этот показатель гораздо выше. Так, 64 битный ключ(пароль) перебирается на современном компьютере примерно за 2 года и перебор легко может быть распределен между множеством компьютеров.

Средства проведения атаки

Современные персональные компьютеры позволяют взламывать пароли полным перебором вариантов с эффективностью, проиллюстрированной в таблице выше. Однако, при оптимизации brute force, основанной на параллельных вычислениях , эффективность атаки можно существенно повысить . При этом может потребоваться использование компьютера, адаптированного к многопоточным вычислениям . В последние годы широкое распространение получили вычислительные решения, использующие GPU , такие как Nvidia Tesla . С момента создания компанией Nvidia архитектуры CUDA в 2007 году, появилось множество решений (см., например, Cryptohaze Multiforcer , Pyrit), позволяющих проводить ускоренный подбор ключей благодаря использованию таких технологий, как CUDA, FireStream , OpenCL .

Устойчивость к атаке полного перебора

В процессе улучшения системы информационной безопасности по отношению к атаке полным перебором можно выделить два основных направления:

  1. повышение требований к ключам доступа от защищаемой информации;
  2. повышение надежности всех узлов системы безопасности.

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

Методы оптимизации полного перебора

Метод ветвей и границ

Распараллеливание вычислений

Одним из методов увеличения скорости подбора ключа является распараллеливание вычислений . Существует два подхода к распараллеливанию :

  • Первый подход - построение конвейера . Пусть алгоритм соотношения E k (x) = y {\displaystyle E_{k}\ (x)=y} можно представить в виде цепочки простейших действий (операций): O 1 , O 2 , . . . , O N {\displaystyle {O_{1}\ ,O_{2},...,O_{N}}} . Возьмём N {\displaystyle N\ } процессоров A 1 , A 2 , . . . , A N {\displaystyle {A_{1}\ ,A_{2},...,A_{N}}} , зададим их порядок и положим, что i {\displaystyle i\ } - ый процессор выполняет три одинаковые по времени операции: Тогда конвейер из N {\displaystyle N\ } последовательно соединённых, параллельно и синхронно работающих процессоров работает со скоростью v / 3 {\displaystyle v/3\ } , где v {\displaystyle v\ } - скорость выполнения одной операции одним процессором.
  • Второй подход состоит в том, что множество K {\displaystyle K\ } всех возможных ключей разбивается на непересекающиеся подмножества K 1 K 2 , . . . , K N {\displaystyle {K_{1}\,K_{2},...,K_{N}}} . Система из Q {\displaystyle Q\ } машин перебирает ключи так, что i {\displaystyle i\ } - ая машина осуществляет перебор ключей из множества K i , i = 1.. Q {\displaystyle K_{i}\ ,i=1..Q} . Система прекращает работу, если одна из машин нашла ключ. Самое трудное - это разделение ключевого множества. Но если каждый процессор начнёт вычисление с какого-то произвольного ключа, то время нахождения увеличится, а схема значительно упростится. Среднее число шагов в этом случае составляет | K | / N {\displaystyle |K|/N\ } , где | K | {\displaystyle |K|\ } - число элементов во множестве ключей, а N {\displaystyle N\ } - число процессоров.

Радужные таблицы

Предпосылки к появлению

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

Использование

Радужная таблица создается построением цепочек возможных паролей. Каждая цепочка начинается со случайного возможного пароля, затем подвергается действию хеш-функции и функции редукции. Данная функция преобразует результат хеш-функции в некоторый возможный пароль (например, если мы предполагаем, что пароль имеет длину 64 бита, то функцией редукции может быть взятие первых 64 бит хеша, побитовое сложение всех 64-битных блоков хеша и т. п.). Промежуточные пароли в цепочке отбрасываются и в таблицу записываются только первый и последний элементы цепочек. Создание таких таблиц требует больше времени, чем нужно для создания обычных таблиц поиска, но значительно меньше памяти (вплоть до сотен гигабайт, при объеме для обычных таблиц в N слов для радужных нужно всего порядка N 2/3) . При этом они требуют хоть и больше времени (по сравнению с обычными методами) на восстановление исходного пароля, но на практике более реализуемы (для построения обычной таблицы для 6-символьного пароля с байтовыми символами потребуется 256 6 = 281 474 976 710 656 блоков памяти, в то время как для радужной - всего 256 6·⅔ = 4 294 967 296 блоков).

Для восстановления пароля данное значение хеш-функции подвергается функции редукции и ищется в таблице. Если не было найдено совпадения, то снова применяется хеш-функция и функция редукции. Данная операция продолжается, пока не будет найдено совпадение. После нахождения совпадения цепочка, содержащая его, восстанавливается для нахождения отброшенного значения, которое и будет искомым паролем.

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

Инциденты

Хотя любая защита информационной системы должна, в первую очередь, быть надежной по отношению к атаке методом «грубой силы», случаи успешного применения данной атаки злоумышленниками достаточно распространены.

Атака «Энигмы»

Изобретенная в 1918 году шифровальная машина, названная «Энигма», широко использовалось немецким военно-морским флотом начиная с 1929 года. В течение дальнейших нескольких лет система модифицировалась, а с 1930 года активно использовалась немецкой армией и правительством в процессе Второй мировой войны .

Первые перехваты сообщений, зашифрованных с кодом Энигмы относятся к 1926 году. Однако прочитать сообщения долгое время не могли. На протяжении всей Второй мировой шло противостояние между польскими и германскими криптографами. Поляки, получая очередной результат по взлому немецкой криптосистемы, сталкивались с новыми трудностями, которые привносили германские инженеры, постоянно модернизирующие систему «Энигма». Летом 1939 года , когда неизбежность вторжения в Польшу стала очевидна, бюро передало результаты своей работы английской и французской разведкам .

Дальнейшая работа по взлому была организована в Блетчли-парке . Основным инструментом криптоаналитиков стала дешифровальная машина «Бомба» . Её прототип был создан польскими математиками накануне Второй мировой войны для министерства обороны Польши. На основе этой разработки и при непосредственной поддержке её создателей в Англии был сконструирован более «продвинутый» агрегат.

Теоретическую часть работы выполнил Алан Матисон Тьюринг . Его работы по криптографическому анализу алгоритма, реализованного в шифровальной машине «Энигма », основывался на более раннем криптоанализе предыдущих версий этой машины, которые были выполнены в 1938 году польским криптоаналитиком Марианом Реевским . Принцип работы разработанного Тьюрингом дешифратора состоял в переборе возможных вариантов ключа шифра и попыток расшифровки текста, если была известна структура дешифруемого сообщения или часть открытого текста .

С современной точки зрения шифр «Энигмы» был не очень надёжным, но только сочетание этого фактора с наличием множества перехваченных сообщений, кодовых книг, донесений разведки, результатов усилий военных и даже террористических атак позволило «вскрыть» шифр .

Массовый взлом домашних сетей посредством WASP

См. также

Примечания

Литература

  • Reid, D. A. et al.,. Proof in Mathematics Education: Research, Learning, and Teaching . - John Wiley & SSense Publishersons, 2010. - P. 266. - ISBN 978-9460912443 .
  • Paar, Christof et al.,.

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


Рис. 10.8.

Как мы уже говорили выше, данный метод используется для решения одномерных задач. Иногда он применяется также для решения двумерных, реже трехмерных задач. Однако для задач большей размерности он практически непригоден из-за слишком большого времени, необходимого для проведения расчетов. Действительно, предположим, что целевая функция зависит от пяти переменных, а область определения G является пятимерным кубом, каждую сторону которого при построении сетки мы делим на 40 частей. Тогда общее число узлов сетки будет равно . Пусть вычисление значения функции в одной точке требует 1000 арифметических операций (это немного для функции пяти переменных). В таком случае общее число операций составит 10 11 . Если в нашем распоряжении имеется ЭВМ с быстродействием 1 млн. операций в секунду, то для решения задачи с помощью данного метода потребуется 10 5 секунд, что превышает сутки непрерывной работы. Добавление еще одной независимой переменной увеличит это время в 40 раз. Проведенная оценка показывает, что для больших задач оптимизации метод сплошного перебора непригоден. Иногда сплошной перебор заменяют случайным поиском. В этом случае точки сетки просматриваются не подряд, а в случайном порядке. В результате поиск наименьшего значения целевой функции существенно ускоряется, но теряет свою надежность.

4. Метод покоординатного спуска

Рассмотрим функцию двух переменных. Ее линии постоянного уровня представлены на рис. 10.9 , а минимум лежит в точке . (Напомним, что линией постоянного уровня называется кривая в двумерном сечении пространства параметров (в данном случае в плоскости (х1, х2) , значение функции на которой - константа). Простейшим методом поиска является метод покоординатного спуска . Из точки А мы производим поиск минимума вдоль направления оси х 1 и, таким образом, находим точку B , в которой касательная к линии постоянного уровня параллельна оси x 1 . Затем, производя поиск из точки B в направлении оси x 2 , получаем точку C , производя поиск параллельно оси x 1 , получаем точку D , и т.д. Таким образом, мы приходим к оптимальной точке. Любой из одномерных методов, описанных в предыдущей главе, может быть использован здесь для поиска вдоль оси. Очевидным образом эту идею можно применить для функций n переменных.


Рис. 10.9.

Рассмотрим данный метод более детально на примере некоторой целевой функции.

Пусть нужно найти наименьшее значение целевой функции u=f(M)=f(x 1 ,x 2 ,...,x n) . Здесь через M обозначена точка n -мерного пространства с координатами x 1 ,x 2 ,...,x n:M=(x 1 ,x 2 ,...,x n) . Выберем какую-нибудь начальную точку и рассмотрим функцию f при фиксированных значениях всех переменных, кроме первой: . Тогда она превратится в функцию одной переменной x 1 . Изменяя эту переменную, будем двигаться от начальной точки в сторону убывания функции, пока не дойдем до ее минимума при , после которого она начинает возрастать. Точку с координатами обозначим через M 1 , при этом .

Фиксируем теперь переменные: и рассмотрим функцию f как функцию одной переменной . Изменяя x 2 , будем опять двигаться от начального значения в сторону убывания функции, пока не дойдем до минимума при . Точку с координатами обозначим через M 2 , при этом . Проведем такую же минимизацию целевой функции по переменным x 3 ,x 4 ,...,x n . Дойдя до переменной x n , снова вернемся к x 1 и продолжим процесс.

Эта процедура вполне оправдывает название метода. С ее помощью мы построим последовательность точек M 0 ,M 1 ,M 2 ,.. . которой соответствует монотонная последовательность значений функции Обрывая ее на некотором шаге k , можно приближенно принять значение функции f(M k) за ее наименьшее значение в рассматриваемой области (рис. 10.10).

Отметим, что данный метод сводит задачу поиска наименьшего значения функции нескольких переменных к многократному решению одномерных задач оптимизации. Если целевая функция f(x 1 ,x 2 ,\ldots,x n задана явной формулой и является дифференцируемой, то мы можем вычислить ее частные производные и использовать их для определения направления убывания функции по каждой переменной и поиска соответствующих одномерных минимумов.

На рис. 10.10. изображены линии уровня некоторой функции двух переменных u=f(x,y) . Вдоль этих линий функция сохраняет постоянные значения, равные 1, 3, 5, 7, 9. Показана траектория поиска ее наименьшего значения, которое достигается в точке O , с помощью

В данном разделе мы рассмотрим некоторые задачи, связанные с проблемой поиска информации. Это огромный класс задач, достаточно подробно описанный в классической литературе по программированию (см., например, книги Н.Вирта, Д. Кнута и другие).

Общий смысл задач поиска сводится к следующему: из данной информации, хранящейся в памяти ЭВМ, выбрать нужные сведения, удовлетворяющие определенным условиям (критериям).

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

Полный перебор является «лобовым» способом поиска и, очевидно, не всегда самым лучшим.

Рассмотрим пример. В одномерном массиве X заданы координаты п точек, лежащих на вещественной числовой оси. Точки пронумерованы. Их номера соответствуют последовательности в массиве X. Определить номер первой точки, наиболее удаленной от начала координат.

Легко понять, что это знакомая нам задача определения номера наибольшего по модулю элемента массива X. Она решается путем полного перебора следующим образом:

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

А теперь такая задача: исходные данные - те же, что и в предыдущей; требуется определить пару точек, расстояние между которыми наибольшее.

Применяя метод перебора, эту задачу можно решать так: перебрать все пары точек из Ладанных и определить номера тех, расстояние между которыми наибольшее (наибольший модуль разности координат). Такой полный перебор реализуется через два вложенных цикла:

Очевидно, что такое решение задачи нерационально. Здесь каждая пара точек будет просматриваться дважды, например при i = 1, j = 2 и i = 2, j= 1. Для случая п = 100 циклы повторят выполнение 100 х 100 = 10000 раз.

Выполнение программы ускорится, если исключить повторения. Исключить также следует и случай совпадения значений i и j. Тогда число повторений цикла будет равно

При n = 100 получается 4950.

Для исключения повторений нужно в предыдущей программе изменить начало внутреннего цикла с 1 на i +1. Программа примет вид:

Рассмотренный вариант алгоритма назовем перебором без повторений.

Замечание. Конечно, эту задачу можно было решить и другим способом, но в данном случае нас интересовал именно алгоритм, связанный с перебором. В случае точек, расположенных не на прямой, а на плоскости или в пространстве, поиск альтернативы такому алгоритму становится весьма проблематичным.

В следующей задаче требуется выбрать все тройки чисел без повторений, сумма которых равна десяти, из массива X.

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

For I:=l To N Do

For J:=I+1 To N Do

For K:=J+1 To N Do

If X[I]+X[J]+X[K]=10

Then WriteLn(X[I],X[J],X[K]);

А теперь представьте, что из массива Х требуется выбрать все группы чисел, сумма которых равна десяти. В группах может быть от 1 до п чисел. В этом случае количество вариантов перебора резко возрастает, а сам алгоритм становится нетривиальным.

Казалось бы, ну и что? Машина работает быстро! И все же посчитаем. Число различных групп из п объектов (включая пустую) составляет 2n. При п = 100 это будет 2100 ≈ 1030. Компьютер, работающий со скоростью миллиард операций в секунду, будет осуществлять такой перебор приблизительно 10 лет. Даже исключение перестановочных повторений не сделает такой переборный алгоритм практически осуществимым.

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

Перебор с возвратом. Рассмотрим алгоритм перебора с возвратом на примере задачи о прохождении лабиринта (рис. 52).

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

Для получения программы решения этой задачи нужно решить две проблемы:

Как организовать данные;

Как построить алгоритм.

Информацию о форме лабиринта будем хранить в квадратной матрице LAB символьного типа размером N x N, где N - нечетное число (чтобы была центральная точка). На профиль лабиринта накладывается сетка так, что в каждой ее ячейке находится либо стена, либо проход.

Матрица отражает заполнение сетки: элементы, соответствующие проходу, равны пробелу, а стене - какому-нибудь символу (например, букве М)

Путь движения по лабиринту будет отмечаться символами +.

Например, приведенный выше рисунок (в середине) соответствует следующему заполнению матрицы LAB:

Исходные данные - профиль лабиринта (исходная матрица LAB без крестиков); результат - все возможные траектории выхода из центральной точки лабиринта (для каждого пути выводится матрица LAB с траекторией, отмеченной крестиками).

Алгоритм перебора с возвратом еще называют методом проб.

Суть его в следующем:

1. Из каждой очередной точки траектории просматриваются возможные направления движения в одной и той же последовательности; договоримся, что просмотр будет происходить каждый раз против часовой стрелки - справа-сверху-слева-снизу; шаг производится в первую же обнаруженную свободную соседнюю клетку; клетка, в которую сделан шаг, отмечается крестиком.

3. Если очередная клетка, в которую сделан шаг, оказалась на краю лабиринта (на выходе), то на печать выводится найденный путь.

Программу будем строить методом последовательной детализации. Первый этап детализации:

Процедура GO пытается сделать шаг в клетку с координатами х, у. Если эта клетка оказывается на выходе из лабиринта, то пройденный путь выводится на печать. Если нет, то в соответствии с установленной выше последовательностью делается шаг в соседнюю клетку. Если клетка тупиковая, то выполняется шаг назад. Из сказанного выше следует, что процедура носит рекурсивный характер.

Запишем сначала общую схему процедуры без детализации:

Для вывода найденных траекторий составляется процедура PRINTLAB.

В окончательном виде программа будет выглядеть так:

Еще один пример красивой программы с использованием рекурсивного определения процедуры (вспомните ханойскую башню!).

Схема алгоритма данной программы типична для метода перебора с возвратом. По аналогичным алгоритмам решаются, например, популярные задачи об обходе шахматной доски фигурами или о расстановке фигур на доске так, чтобы они «не били» друг друга; множество задач оптимального выбора (задачи о коммивояжере, об оптимальном строительстве дорог и т.п.).

Замечание. Из-за использования массива LAB в качестве параметра-значения в процедуре GO могут возникнуть проблемы с памятью при реализации программы на ЭВМ. В таком случае можно перейти к глобальной передаче массива.

3) Выбор математического аппарата. Математический аппарат, применяемый при построении модели, зависит от типа модели. Так для алгоритмизации расчетных моделей используются аналитические формулы любой сложности, системы линейных или дифференциальных уравнений (законы Кирхгофа, метод узловых токов и контурных напряжений).

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

Для математического описания оптимизационных моделей применяются специальные математические методы - методы оптимизации.

3. Третий этап - реализация построенного алгоритма модели на ЭВМ.

4. Исследование результатов численного моделирования, оценка их адекватности, и общей пригодности модели для использования.

5. Интерпретация результатов моделирования и принятие решения об использовании математической модели или необходимости ее развития. Здесь определяется жизненный цикл модели и необходимость актуализаций модели, то есть изменения ее параметров в связи c изменением условия функционирования.

Методы оптимизации

Люди, приступая к осуществлению своих мероприятий, оценивают над их последствия и принимают решения, выбирая тем или другим образом зависящие от них параметры - способы организации мероприятий и процессов. В теории принятия решений используются оптимизационные модели и решаются задачи оптимизации.

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

За критерий оптимальности принимается некоторая функция F(x) , называемая целевой функцией. Целевая функция аналитически выражает зависимость оптимизируемого показателя от некоторых параметров x, значения которых можно изменять, называемых управляемыми параметрами

хi , i = 1,2,...,n.

Управляемые параметры xi являются независимыми друг от друга и в процессе оптимизации могут изменяться в известных пределах (допустимой области) Dx . Аналитически область допустимых значений может задаваться аналитически в виде набора функций

Ψ k (x 1 ,...,x n )= 0

В общем виде математическую задачу оптимизации можно сформулировать следующим образом:

Минимизировать (максимизировать) целевую функцию с учетом ограничений на управляемые переменные.

Под минимизацией (максимизацией) функции n переменных F(x)=F(x1 , ... ,xn ) на заданном множестве Dx понимается определение глобальног минимума (максимума) этой функции на заданном множестве Dx .

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

Максимизация целевой функции (F(x) -> max) эквивалента минимизации противоположной величины (−F(x) -> min), поэтому можно рассматривать только задачи минимизации.

Не существует универсальных, методов решения задач нелинейной оптимизации, но развито большое количество методов, применяемых для решения задач оптимизации одномерных унимодальных, многомерных унимодальных, одномерных полимодальных или многомерных полимодальных целевых функций.

Численные методы решения задач одномерной оптимизации

Задачи одномерной минимизации представляют собой простейшую математическую модель оптимизации, в которой целевая функция зависит от одной переменной, а допустимым множеством является отрезок вещественной оси:

F(x) -> min , x принадлежит .

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

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

Большим достоинством прямых методов является то, что от целевой функции не требуется дифференцируемости и, более того, она может быть не задана в аналитическом виде. Единственное, на чем основаны алгоритмы прямых методов минимизации, это возможность определения значений F(x) в заданных точках.

Самым слабым требованием на функцию F(x), позволяющим использовать эти методы, является ее унимодальность (наличие одного минимума в области допустимых значений). Поэтому далее будем считать функцию F(x) унимодальной на отрезке .

Метод перебора

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

Разобьем отрезок на n равных частей точками деления:

xi =A+i·(B − A)/n, i=0,...n

Вычислив значения F(x) в точках xi , путем сравнения найдем точку xm , где m - это число от 0 до n, такую, что

F(xm ) = min F(xi ) для всех i от 0 до n.

Погрешность определения точки минимума xm функции F(x) методом перебора не превосходит величины ε = (B − A)/n.

Метод дихотомии

Метод применяется для нахождения экстремума-максимума или экстре- мума-минимума нелинейных одномерных унимодальных целевых функций.

Суть метода в следующем. Пусть целевая функция F(х) задана на интервале A≤ x ≤ B. Отрезок на каждом этапе делится пополам. За первые две поиско-

чения целевой функции F(x) в точках x1 , x2 уточняется направление поиска. Если отыскивается экстремум-минимум и F(х1 ) < F(х2 ), то смещается правая граница первоначального интервала неопределенности , т.е. полагается В = x2 , если F(х1 ) > F(x2 ) , то смещается левая граница А = x1 . Если новый интервал неопределенности [В−А] больше заданной погрешности решения ε, то де-

ление пополам продолжается. Если B−A ≤ ε, то решение получено x* =A + 2 B , F(x) = F(x*).

Метод Фибоначчи

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

Nn =Nn-1 +Nn-2 , при N1 =N2 =1.

Первоначальный интервал неопределенности [В−А] принимается пропорциональным некоторому числу Фибоначчи Fn , определенному в зависимости




Top