Автор работы: Лена Шугалеева, 25 Сентября 2010 в 19:08, курсовая работа
Математическое программирование занимается изучение экстремальных задач и поиском методов их решения. Задачи математического программирования формулируются следующим образом : найти экстремум некоторой функции многих переменных f ( x1, x2, ... , xn ) при ограничениях gi ( x1, x2, ... , xn ) bi , где gi - функция, описывающая ограничения, - один из следующих знаков , , , а bi - действительное число, i = 1, ... , m. f называется функцией цели ( целевая функция ).
Линейное программирование - это раздел математического программирования, в котором рассматриваются методы решения экстремальных задач с линейным функционалом и линейными ограничениями, которым должны удовлетворять искомые переменные.
Задачу линейного программирования можно сформулировать так . Найти max
при условии : a11 x1 + a12 x2 + . . . + a1n xn b1 ;
a21 x1 + a22 x2 + . . . + a2n xn b2 ;
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
am1 x1 + am2 x2 + . . . + amn xn bm ;
x1 0, x2 0, . . . , xn 0 .
Эти ограничения называются условиями неотрицательности. Если все ограни-чения заданы в виде строгих равенств, то данная форма называется канонической.
- 7 -
В матричной форме задачу линейного программирования записывают следующим образом. Найти
max cT x
при условии
A x b ;
x 0 ,
где А - матрица ограничений размером ( mn), b(m1) - вектор-столбец свобод-ных членов, x(n 1) - вектор переменных, сТ = [c1, c2, ... , cn ] - вектор-строка коэффициентов целевой функции.
Решение х0 называется оптимальным, если для него выполняется условие сТ х0 сТ х , для всех х R(x).
Поскольку min f(x) эквивалентен max [ - f(x) ] , то задачу линейного программирования всегда можно свести к эквивалентной задаче максимизации.
Для решения задач данного типа применяются методы:
1) графический;
2) табличный ( прямой, простой ) симплекс - метод;
3) метод искусственного базиса;
4) модифицированный симплекс - метод;
5) двойственный симплекс - метод.
1.2 Табличный симплекс - метод
Для его применения необходимо, чтобы знаки в ограничениях были вида “ меньше либо равно ”, а компоненты вектора b - положительны.
Алгоритм решения сводится к следующему :
Приведение системы ограничений к каноническому виду путём введения дополнительных переменных для приведения неравенств к равенствам.
Если в исходной системе ограничений присутствовали знаки “ равно ”
- 8 -
или “ больше либо равно ”, то в указанные ограничения добавляются
искусственные переменные, которые так же вводятся и в целевую функцию со знаками, определяемыми типом оптимума.
Формируется симплекс-таблица.
Рассчитываются симплекс-разности.
Принемается решение об окончании либо продолжении счёта.
При необходимости выполняются итерации.
На каждой итерации определяется вектор, вводимый в базис, и вектор, выводимый из базиса. Таблица пересчитывается по методу Жордана-Гаусса или каким-нибудь другим способом.
end;
procedure ReCountBasisVector;
begin
BasisVector[
end;
begin
ReCountDigitOfBasisVector;
ReCountBasisVector;
Buffer:=VectorA[
for i:=0 to m+n do
begin
VectorA[IndexOfOutputString, i]:=VectorA[
end;
end;
-
33 -
procedure ReCountVectorA;
var i,j : integer;
begin
for j:=0 to m+n do
begin
for i:=1 to m do
begin
if i <> IndexOfOutputString then
if j <> IndexOfEnterVector
then VectorA[i, j]:=VectorA[i, j] - VectorA[i, IndexOfEnterVector]*VectorA[
end;
end;
for i:=1 to m do
if i <> IndexOfOutputString then VectorA[i, IndexOfEnterVector]:=0;
end;
function AllIsPositiv : boolean;
var i : integer;
begin
AllIsPositiv:=True;
for i:=1 to m+n do
if SimplexVector[i] < 0 then AllIsPositiv:=False;
end;
function ToStr(const D : real) : string;
var S : string;
begin
str(D:6:2, S);
ToStr:=' ' + S + ' ';
end;
procedure
WriteMatrixs;
procedure WriteTargetMatrix;
var i : integer;
begin
writeln('
+-----------------------------
write (' ¦ Target ¦');
for i:=1 to n+m do write(ToStr(TargetVector[i]),'
end;
procedure WriteMatrixA;
var i,j : integer;
begin
writeln(' +-----------------+--------+--
writeln(' ¦ Basis ¦ D.Basis¦ A 0 ¦ A 1 ¦ A 2 ¦ A 3 ¦ A 4 ¦ A 5 ¦');
writeln(' +--------+--------+--------+--
for i:=1 to m do
-
34 -
begin
write(' ¦ A ',BasisVector[i],' ¦',ToStr(DigitOfBasisVector[i]
for j:=0 to m+n do write(ToStr(VectorA[i, j]),'¦'); writeln;
if i = m then writeln(' +--------+--------+--------+--
else writeln(' +--------+--------+--------+--
end;
end;
procedure WriteMatrixSimplex;
var i : integer;
begin
write(' ¦ Simplex¦');
for i:=0 to m+n do write(ToStr(SimplexVector[i]),
writeln(' +-----------------------------
end;
begin
clrscr;
WriteTargetMatrix;
WriteMatrixA;
WriteMatrixSimplex;
end;
procedure
WriteMatrixsInFile;
procedure WriteTargetMatrix;
var i : integer;
begin
writeln(FileOfOutput, '
+-----------------------------
write (FileOfOutput, ' ¦ Target ¦');
for i:=1 to n+m do write(FileOfOutput, ToStr(TargetVector[i]),'¦'); writeln(FileOfOutput);
end;
procedure WriteMatrixA;
var i,j : integer;
begin
writeln(FileOfOutput, ' +-----------------+--------+--
writeln(FileOfOutput, ' ¦ Basis ¦ D.Basis¦ A 0 ¦ A 1 ¦ A 2 ¦ A 3 ¦ A 4 ¦ A 5 ¦');
writeln(FileOfOutput, ' +--------+--------+--------+--
for i:=1 to m do
begin
write(FileOfOutput, ' ¦ A ',BasisVector[i],' ¦',ToStr(DigitOfBasisVector[i]
for j:=0 to m+n do write(FileOfOutput, ToStr(VectorA[i, j]),'¦'); writeln(FileOfOutput);
if i = m then writeln(FileOfOutput, ' +--------+--------+--------+--
else writeln(FileOfOutput, ' +--------+--------+--------+--
end;
end;
-
35 -
procedure WriteMatrixSimplex;
var i : integer;
begin
write(FileOfOutput, ' ¦ Simplex¦');
for i:=0 to m+n do write(FileOfOutput, ToStr(SimplexVector[i]),'¦'); writeln(FileOfOutput);
writeln(FileOfOutput, '
+-----------------------------
end;
begin
clrscr;
WriteTargetMatrix;
WriteMatrixA;
WriteMatrixSimplex;
end;
{ Головная программа }
BEGIN
ClrScr;
ReadDates;
Assign(FileOfOutput, 'kurs97.res');
Rewrite(FileOfOutput);
CountSimplexVector;
WriteMatrixs;
while not AllIsPositiv do
begin
IndexOfEnterVector:=
IndexOfOutputString:=
ReCountOutputString;
ReCountVectorA;
CountSimplexVector;
WriteMatrixsInFile;
WriteMatrixs;
if key=#0 then key:=readkey; key:=#0;
end;
Close(FileOfOutput);
END.
- 36 -
6.
ОПИСАНИЕ ЛОГИКИ
СТРУКТУРНОЙ СХЕМЫ
В
программе реализованы
1. Процедура ReadDates - считывает данные из файла.
2.
Процедура
3. Процедура ReadDatesVector - считывание их входного файла матрицы А и заполнение диагональной матрицы.
4. Процедура CountSimplexVector - рассчёт симплекс-разностей.
5. Процедура GetEnterVector - поиск вводимого в базис столбца.
6. Процедура GetOutputString - поиск выводимой из базиса строки.
7. Процедура ReCountOutputString- пересчёт выводимой строки.
8. Процедура ReCountVectorA - пересчёт остальной матрицы ограничений.
9.
Процедуры WriteMatrixA, WriteTargetMatrix, WriteMatrixSimplex
- печать результирующих таблиц на экран
и в файл.
- 37 –
7.
ТЕСТОВЫЙ ПРИМЕР
Тестовый
пример программы KURS 97.EXE представлен
на рисунке 2 в виде исходной и результирующих
симплекс-таблиц данного задания.
- 39
-
ЛИТЕРАТУРА
1. ЕСПД ГОСТ 19.105-78, 19.104-78.
2. ЕСПД ГОСТ 19.502-78.
3. Венцель
Е.С. Исследование операций.-М.:
4. Дектярев
Ю.И. Исследование операций.-М.:
5. Зайченко
Ю.П. Исследование операций.-К.:
6. Зайченко Ю.П., Шумиллова С.А. Исследование операций ( сборник задач ).-К.:Вища школа. 1990 г.