Автор работы: Лена Шугалеева, 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 -
или “ больше либо равно ”, то в указанные ограничения добавляются
искусственные переменные, которые так же вводятся и в целевую функцию со знаками, определяемыми типом оптимума.
Формируется симплекс-таблица.
Рассчитываются симплекс-разности.
Принемается решение об окончании либо продолжении счёта.
При необходимости выполняются итерации.
На каждой итерации определяется вектор, вводимый в базис, и вектор, выводимый из базиса. Таблица пересчитывается по методу Жордана-Гаусса или каким-нибудь другим способом.
Пример 3. Ремонтная мастерская занимается обслуживанием машин; её рентабельность определяется количеством машин, обслуженных в течение дня. Показатель эффективности - среднее число машин, обслуженных за день.
Пример 4. Группа радиолокационных станций в определённом районе ведёт наблюдение за воздушным пространством. Задача группы - обнаружить любой самолёт, если он появится в районе. Показатель эффективности - вероятность обнаружения любого самолёта, появившегося в районе.
Пример 5. Предпринимается ряд мер по повышения надёжности электронной цифровой вычислительной техники ( ЭЦВТ ). Цель операции - уменьшить частоту появления неисправностей ( “сбоев” ) ЭЦВТ, или, что равносильно, увеличить средний промежуток времени между сдоями ( “наработку на отказ” ). Показатель эффективности - среднее время безотказной работы ЭЦВТ.
Пример 6. Проводится борьба за экономию средств при производстве определённого вида товара. Показатель эффективности - количество сэкономленных средств.
С
помощью анализа модели на чувствительность
определить параметр, от которого результат
зависит больше и решить, каким способом
возможно увеличение эффективности и
на сколько, а так же многое другое.
- 23 -
ПРИЛОЖЕНИЕ
- 24 -
СОДЕРЖАНИЕ
ВВЕДЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1. НАЗНАЧЕНИЕ ПРОГРАММЫ. . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2. УСЛОВИЯ ПРИМЕНЕНИЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.1 Ограничения и область применения . . . . . . . . . . . . . . . . . . . . . 6
1.2 Требования к техническим
3. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ . . . . . . . . . . . . . . . . . . . . . . 5
4. ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЮ . . . . . . . . . . . . . . . . . . . . . . . . . 11
5. ТЕКСТ ИСХОДНОГО МОДУЛЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
6. ОПИСАНИЕ ЛОГИКИ СТРУКТУРНОЙ СХЕМЫ . . . . . . . . . . . . 11
7. ТЕСТОВЫЙ
ПРИМЕР. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . 25
- 25 -
ВВЕДЕНИЕ
В
данной части пояснительной записки
к курсовой работе представлена и
описана программа, реализующая решение
систем линейных неравенств табличным
методом.
-
26 -
1.
НАЗНАЧЕНИЕ ПРОГРАММЫ
Программа
предусмотрена для решения
Метод,
описанный в программе, может применяться
на государственных и частных предприятиях
для улучшения эффективности производства.
-
27 -
2.
УСЛОВИЯ ПРИМЕНЕНИЯ
1.1 Ограничения и область
Из программных средств требуется операционная система MS DOS версии 5.0, программная Среда NORTON COMMANDER, язык программирования Borland Pascal 7.0 . Кроме того НГМД должен содержать файлы в директории KURSOVIK:
1. Файл входных данных - KURS97.DAT
2.
Программный файл - KURS97.EXE
1.2 Требования к техническим средствам
IBM
PC или IBM PC - совместимый компьютер
с дисководом 3.25” ёмкостью 1.2
Мб.
-
28 -
3. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ
Входные
и выходные данные заносятся в
файлы KURS97.DAT и KURS97.RES соответственно.
Входные данные записываются в определённом
порядке. Выходные данные записываются
в виде симплекс-таблиц.
- 29 -
4.
ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЮ
Входные данные вносятся в файл KURS 97.DAT в следующей очерёдности :
сначала вводятся коэффициенты при неизвестных в целевой функции, затем вводятся элементы вектора ограничений, а потом - элементы матрицы ограничений по столбцам.
Результаты
вычислений вы найдёте в файле KURS
97.REZ.
- 30 -
5.
ТЕКСТ ИСХОДНОГО
МОДУЛЯ
Полный текст программы KURS97.PAS выглядит следующим образом :
.
program Kurs97;
uses
crt;
const
n = 2;
m = 3;
Epsilon = 0.000001;
var
VectorA : array [1..m, 0..m+n] of real;
TargetVector : array [1..m+n] of real;
SimplexVector : array [0..m+n] of real;
DigitOfBasisVector : array [1..m] of real;
BasisVector :
array [1..m] of integer;
IndexOfEnterVector : integer;
IndexOfOutputString : integer;
MinimumBuffer : real;
key : char;
FileOfOutput : text;
{
Описание процедур }
procedure ReadDates; { считывание данных из файла }
var
DateFile : text;
procedure ReadDatesTargetVector; { считывание данных целевого вектора }
var i : integer;
begin
for i:=1 to n do Readln(DateFile, TargetVector[i]);
end;
procedure ReadDatesVectorA; { считывание вектора А и заполнение единицами диагонали}
var i,j : integer;
begin
for j:=0 to n do
for i:=1 to m do
Readln(DateFile, VectorA[i, j]);
i:=1;
for j:=n+1 to n+m do
-
31 -
begin
VectorA[i, j]:=1;
inc(i)
end;
end;
procedure ReadDatesBasisVector;
var i : integer;
begin
for i:=1 to m do BasisVector[i]:=n+i;
end;
begin
Assign(DateFile, 'kurs97.dat');
Reset(DateFile);
ReadDatesTargetVector;
ReadDatesVectorA;
ReadDatesBasisVector;
Close(DateFile);
end;
procedure CountSimplexVector; { расчет симплек-вектора }
var
i,j : integer;
Summa : real;
Simplex : real;
begin
SimplexVector[0]:=0;
for i:=1 to m do
SimplexVector[0]:=
for j:=1 to m+n do
begin
Summa:=0;
for i:=1 to m do Summa:=Summa + DigitOfBasisVector[i]*VectorA[
SimplexVector[j]:=Summa - TargetVector[j];
if abs(SimplexVector[j]) <= Epsilon then SimplexVector[j]:=0;
end;
end;
function GetEnterVector : integer; { поиск вводимого вектора }
var
i : integer;
Min : real;
begin
GetEnterVector:=1;
Min:=SimplexVector[1];
for i:=2 to m+n do
if Min > SimplexVector[i]
then
-
32 -
begin
GetEnterVector:=i;
Min:=SimplexVector[i];
end;
end;
function GetOutputString : integer; { поиск выводимой строки }
var
i : integer;
Temp : real;
begin
GetOutputString:=1;
if VectorA[1, IndexOfEnterVector] > 0 then MinimumBuffer:=VectorA[1, 0] / VectorA[1, IndexOfEnterVector];
for i:=2 to m do
begin
Temp:=VectorA[i, 0] / VectorA[i, IndexOfEnterVector];
if Temp > 0 then
if MinimumBuffer >= Temp then
begin
MinimumBuffer:=Temp;
GetOutputString:=i;
end;
end;
end;
procedure ReCountOutputString; { пересчет коэффициентов выводимой строки }
var
i,j : integer;
Buffer : real;
procedure ReCountDigitOfBasisVector;
begin
DigitOfBasisVector[