Технологии программирования | страница 118
Внутри главного цикла программы выполняется ряд из трех последовательных действий. "Алгоритм отображение" отображает на экране 23 строки текста из буферного массива, начиная с заданной строки. Далее устанавливается курсор дисплея на заданную позицию экрана. Осуществляется ввод кода нажатой клавиши. Если код нажатой клавиши соответствует управляющей клавише, то выполняется одно из альтернативных действий по выполнению команды, которая соответствует данной клавише. В противном случае осуществляется вставка символа в текст.
5.7. РЕФАКТОРИНГ АЛГОРИТМОВ И ЭВРОРИТМОВ
Алгоритм Нелдера — Мида является широко известным и применяется в качестве алгоритма прямого поиска локального экстремума вещественных функций от 2 до 6 вещественных переменных.
Следующий абзац содержит фрагмент текста из книги Д. Химмельблау [26], в котором содержится часть описания алгоритма Нелдера — Мида (метода деформируемого многогранника).
В методе Нелдера и Мида минимизируется функция n независимых переменных с использованием n + 1 вершин деформируемого многогранника в E>n. Каждая вершина может быть идентифицирована вектором x. Вершина (точка) в E>n, в которой значение f(x) максимально, проектируется через центр тяжести (центроид) оставшихся вершин. Улучшенные (более низкие) значения целевой функции находятся последовательной заменой точки с максимальным значением f(x) на более "хорошие" точки, пока не будет найден минимум f(x).
Начальный многогранник обычно выбирается в виде регулярного симплекса (но это не обязательно) с точкой в начале координат. Процедура отыскания вершины в E>n, в которой f(x) имеет лучшее значение, состоит из следующих операций:
Отражение — проектирование x>(k)>h через центр тяжести в соответствии с соотношением x>(k)>n+3 = x>(k)>n+2 + α(x>(k)>n+2 — x>(k)>h), где α > 0 является коэффициентом отражения; x>(k)>n+2 — центр тяжести, x>(k)>h — вершина, в которой функция f(x) принимает наибольшее из n + 1 ее значений на k-м этапе.
Растяжение выполняется, если f(x>(k)>n+3) ≤ f(x>(k)>i), то вектор (x>(k)>n+3 — x>(k)>n+2) растягивается в соответствии с соотношением x>(k)>n+4 = x>(k)>n+2 + γ(x>(k)>n+3 — x>(k)>n+2), где γ — коэффициент растяжения. Если f(x>(k)>n+4) < f(x>(k)>i), то x>(k)>h заменяется на x>(k)>n+4 и процедура продолжается с шага 1 (k = k + 1), иначе x>(k)>n заменяется на x>(k)>n+3, процедура продолжается с шага 1 (k = k + 1).
Сжатие — если f(x>(k)>n+3) > f(x>(k)>i) для всех i ≠ h, то вектор (x>(k)>h — x>(k)>n+2) сжимается в соответствии с формулой x