Схема головной подпрограммы
Общая схема головной подпрограммы сеточного алгоритма приведена на рис. 3. На шаге 1 выполняется подпрограмма , выполняющая инициализацию переменных. Затем в цикле с меткой 2 выполняется корректировка сеточной области в соответствии с описанием идеи алгоритма из раздела. Одна итерация соответствует одной корректировке. Головная подпрограмма сеточного алгоритма оформляется в виде независимого процесса, который выполняется до тех пор, пока переменная не примет значение (истина). Начальную установку переменной в значение (ложь) осуществляет головной процесс, соответствующий основной программе. Он же присваивает переменной значение , когда вычислительный процесс нужно остановить. В качестве текущего приближения решения задачи головная программа использует текущее значение нулевой вершины центральной ячейки , координаты которой вычисляются по формуле .
В теле цикла выполняются следующие действия. На шаге 3 организуется параллельных потоков управления (нитей), которые независимо друг от друга вычисляют псевдопроекции из целевой точки на пересечение i-той ячейки с многогранником M . Напомним, что равно количеству MPI-процессов, и в соответствии с формулой равно количеству ячеек в кубической сеточной области. Схема подпрограммы вычисления псевдопроекции детально описана в разделе.
Рис. 3. Головная подпрограмма сеточного алгоритма.
В цикле с меткой 5 для полученных на шаге 3 точек псевдопроекций вычисляется номер ячейки, на которой достигается максимум C целевой функции. Для корректной работы цикла 5 переменным и C на шаге 4 присваиваются начальные значения и соответственно. Значение соответствует минимальному машинному значению целого типа, – минимальному машинному значению вещественного типа. Подпрограмма, вычисляющая точку псевдопроекции точки на пересечение многогранника с ячейкой с номером , присваивает координате значение в том случае, когда точка псевдопроекции не принадлежит многограннику . Эта ситуация возникает в случае, когда пересечение многогранника с ячейкой с номером является пустым. Если же принадлежит многограннику, то в силу предположения о том, что все процессы находятся в положительной области координат, значение не может быть отрицательным. Указанное условие проверяется на шаге 6. Случаи из рассмотрения исключаются. Если при выполнении цикла 5 оказывается, что ни одна из ячеек сеточной области не имеет непустого пересечения с многогранником , то в переменной сохраняется значение . Этот факт проверяется на шаге 7. В этом случае шаг сетки , длина ребра сеточной области и координаты целевой точки увеличиваются в раз, где – положительная константа, являющаяся параметром алгоритма (шаг 13 на рис. 3).
Если на шаге 7 выясняется, что , значит найдена ячейка с номером , имеющая непустое пересечение с многогранником, на которой достигается максимум целевой функции. В этом случае на шаге 8 вычисляется вектор , представляющий нулевую вершину новой центральной ячейки сеточной области. Схема подпрограммы вычисления нулевой вершины ячейки с порядковым номером k𝛼 приведена на рис. 4. Вычисления осуществляются с использованием формул , и .
Рис.4. Схема подпрограммы zero вычисления нулевой
вершины ячейки с порядковым номером k𝛼.
На шаге 9 (рис. 3) анализируется, насколько новая центральная ячейка далеко отстоит от предыдущей. Если расстояние между новой и старой центральными ячейками превышает (где – длина ребра кубической сеточной области), то длина ребра кубической сеточной области , шаг сетки и координаты целевой точки на шаге 10 увеличиваются в 1.5 раза. Если расстояние между новой и старой центральными ячейками меньше , то длина ребра кубической сеточной области , шаг сетки и координаты целевой точки на шаге 11 уменьшаются в 2 раза. Величина , используемая в шагах 10 и 11, в общем случае является параметром алгоритма. Если же отклонение лежит в пределах от до , то корректировка значений , и не производится. Величины и также являются в общем случае параметрами алгоритма.
На шаге 12 сеточная область сдвигается по вектору , и в качестве текущей нулевой вершины центральной ячейки сеточной области берется точка .
2.2. Схема подпрограммы инициализации переменных init
Подпрограмма инициализации переменных выполняет ввод исходных данных и инициализацию переменных. Схема подпрограммы приведена на рис. 5. На шаге 1 вводятся значения переменных: n – размерность пространства решений; m – число неравенств в системе ограничений; R – начальное значение длины ребра сеточной области, обеспечивающее покрытие многогранника M; p – количество итераций при построении псевдопроекции, выполняемое между обновлениями входных данных (этот параметр используется в подпрограмме обновления исходных данных); K – количество ячеек в сеточной области по одному измерению; u – размерность подвектора; L – число независимых фейеровских итераций на подвекторах в подпрограмме вычисления псевдопроекции (см. рис. 6); T – масштабирующий коэффициент для вычисления координат целевой точки z. На шаге 2 проверяется условие (assert) , означающее, что размерность пространства решений кратно размерности подвектора . На шаге 3 осуществляется ввод исходных данных задачи линейного программирования: A – матрица коэффициентов неравенств; b – столбец свободных членов; c – вектор коэффициентов целевой функции. Также здесь вводится вектор G, содержащий начальные координаты нулевой вершины кубической сеточной области. Шаг 4 присваивает переменной P значение, равное количеству доступных MPI‑процессов и вычисляемое с помощью системной функции .
Рис. 5. Схема подпрограммы инициализации переменных init.
На шаге 5 проверяется условие (assert) , означающее, что общее количество ячеек сеточной области равно количеству процессов. На шаге 6 формируется инвариантная часть расширенного столбца свободных членов, определяемого по формуле . На шаге 7 происходит инициализация матрицы путем присваивания всем ее элементам нулевых значений. На шаге 8 определяются ненулевые элементы матрицы в соответствии с системой неравенств . На шагах 9 и 10 строится расширенная матрица , определяемая формулой . На шаге 11 в качестве начального значения длины r ребра сеточной области определяется значение R, обеспечивающее покрытие многогранника M, и вычисляется значение длины ребра ячейки. На шаге 12 в качестве начальной нулевой вершины g кубической сеточной области берется точка G, определяющая такое положение сеточной области, при котором она полностью покрывает многогранник M. На шаге 13 вычисляются координаты целевой точки z по формуле . На шаге 14 вычисляется нулевая вершина q центральной ячейки сеточной области по формуле . На последнем шаге вычисляется вектор начальных целочисленных координат центральной ячейки по формуле .