Автор работы: Пользователь скрыл имя, 24 Апреля 2013 в 12:45, курсовая работа
Решение задач математического программирования при помощи симплекс-метода традиционными способами требует затрат большого количества времени. В связи с бурным развитием компьютерной техники в последние десятилетия естественно было ожидать, что вычислительная мощность современных ЭВМ будет применена для решения указанного круга задач.
Линейное программирование
Линейное программирование - математическая дисциплина, посвящённая теории и методам решения задач об экстремумах линейных функций на множествах n-мерного векторного пространства, задаваемых системами линейных уравнений и неравенств.
Линейное программирование является частным случаем выпуклого программирования, которое в свою очередь является частным случаем математического программирования. Одновременно оно - основа нескольких методов решения задач целочисленного и нелинейного программирования. Одним из обобщений линейного программирования является дробно -линейное программирование.
Введение
Линейное программирование
Симплекс метод
Постановка задачи
Разработка алгоритма
Решение задачи
Программная реализация на языке Delphi
Приложение
Заключение
Список используемой литературы
all_basis[i0]:=j0;
end;
end;
{/////////////////}
procedure okr;
{округляет мелкие погрешности}
var
i,j: integer;
begin
for i:=1 to n+1 do
for j:=1 to m+y+1 do
if abs(matrix[i,j]-round(matrix[
matrix[i,j]:=round(matrix[i,j]
end;
{/////////////////}
procedure preobr;
{преобразует массив
var
i,j,k,l,t: integer;
temp: double;
begin
if done=false then
begin
write(f, '<P>Пересчет:</P>');
temp:=matrix[i0,j0];
for j:=1 to m+y+1 do matrix[i0,j]:=matrix[i0,j]/
for i:=1 to n+1 do
begin
temp:=matrix[i,j0];
for j:=1 to m+y+1 do
if (i<>i0) then
matrix[i,j]:=matrix[i,j]-
end;
okr;
zapisat(n+1,m+y+1,-1,-1);
{/////////////////////////
if i_basis>0 then {если он есть }
begin
t:=0;
for j:=m+y-i_basis+1 to m+y do {от первого исскусственного элемеента до конца}
begin
need_i_basis:=false;{
for i:=1 to n do {просматриваем столбец}
if all_basis[i]=j then{и если элемент в базисе}
need_i_basis:=true;{тогда он все-таки нужен}
if need_i_basis=false then t:=j;
{если наши предположения (*) подтвердились, то запомним этот элемент}
end;
if t<>0 then
begin
for k:=1 to n+1 do {во всех строках}
begin
for l:=t to m+y do {от текущего столбца до последнего}
matrix[k,l]:=matrix[k,l+1];{
matrix[k,m+y+1]:=0;{а последний убираем}
end;
{столбец удален! надо это запомнить}
y:=y-1;
i_basis:=i_basis-1;
if i_basis>0 then {если остались еще искусственные переменные,}
for l:=m+y-i_basis+1 to m+y do{то от первой из них до последней}
for i:=1 to n do {просматриваем строки в столбце}
if matrix[i,l]=1 then all_basis[i]:=l; {туда, где 1, заносим в базис}
writeln(f,'<P>Искусственная переменная исключена из базиса<br>');
writeln(f,'и может быть удалена из таблицы.');
writeln(f,'</P>');
zapisat(n+1,m+y+1,-1,-1);
end;
end;
{///////////////закончили
end;
end;
{/////////////////}
procedure otvet;
{выводит ответ}
var
i,j: integer;
begin
writeln(f,'<P><b>ОТВЕТ:</b></
form1.Memo1.ReadOnly:=false;
form1.Memo1.Lines.Clear;
form1.Memo1.Lines.Add('ОТВЕТ:'
form1.Memo1.Lines.Add('');
if (solve=true) and (i_basis=0) then
write(f,'F(');
form1.Memo1.Lines.Text:=form1.
if form1.Extrem.ItemIndex=0 then
begin
write(f,'max) = ',0-matrix[n+1,m+y+1]:0:3);
form1.Memo1.Lines.Text:=form1.
form1.Memo1.Lines.Text:=form1.
end
else
begin
write(f,'min) = ',matrix[n+1,m+y+1]:0:3);
form1.Memo1.Lines.Text:=form1.
form1.Memo1.Lines.Text:=form1.
end;
writeln(f,'<br>при значениях:<br>');
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('при
form1.Memo1.Lines.Add('');
for j:=1 to m do
begin
writeln(f,'x<sub>',j,'</sub> = ');
form1.Memo1.Lines.Text:=form1.
form1.Memo1.Lines.Text:=form1.
form1.Memo1.Lines.Text:=form1.
written:=false;
for i:=1 to n do
if all_basis[i]=j then
begin
writeln(f,matrix[i,m+y+1]:0:3,
form1.Memo1.Lines.Text:=form1.
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('');
written:=true;
end;
if written=false then
begin
writeln(f,'0.000 <br>');
form1.Memo1.Lines.Text:=form1.
form1.Memo1.Lines.Add('');
form1.Memo1.Lines.Add('');
end;
end;
end else
begin
writeln(f,'<P>Решение не найдено.(</P>');
form1.Memo1.Lines.Text:=form1.
end;
form1.Memo1.ReadOnly:=true;
end;
{/////////////////}
procedure Step2;
{шаг второй: решение задачи и формирование отчета}
var
i,j: integer;
k: integer;
begin
for i:=1 to n+1 do
for j:=1 to m+1 do
begin
matrix[i,j]:=strtofloat(pole[
pole[i,j].Enabled:=false; {Блокируем поля}
if i<=n then znak[i].Enabled:=false;{
end;
form1.Extrem.Enabled:=false;
{/////////////////////////////
{ имеем матрицу [ n+1, m+1 ] }
rewrite(f);
writeln(f,'<HTML>');
writeln(f,'<HEAD>');
writeln(f,'<TITLE>Отчет</
writeln(f,'</HEAD>');
writeln(f,'<BODY>');
writeln(f,'<H1>Отчет</H1>');
write(f,'<P><b>Необходимо ');
if form1.Extrem.ItemIndex=0 then write(f,'макс') else write(f,'мин');
writeln(f,'имизировать целевую функцию:</b></P>');
kanon:=false;{еще не в канонической форме}
write_system(n+1,m+1);{Выведем ее в отчет}
{приведем ее к каноническому виду}
writeln(f,'<P><b>Приведем к каноническому виду:</b></P>');
y:=0;{количество
need_basis:=false;
for i:=1 to n do
if znak[i].ItemIndex<>2 then {если ограничение не является равенством}
begin
y:=y+1; {вводим дополнительную
for k:=1 to n+1 do begin {во всех ограничениях и в ЦФ}
{перед правой частью
matrix[k,m+y+1]:=matrix[k,m+y]
matrix[k,m+y]:=0;{состоящий из нулей}
end;
{а в текущем ограничении, если знак был > или >=}
if (znak[i].ItemIndex=0) or (znak[i].ItemIndex=1) then
begin
matrix[i,m+y]:=-1;{записываем -1}
need_basis:=true;
end
else {иначе, т.е. в случае < или <=}
matrix[i,m+y]:=1; {записываем 1}
end
else need_basis:=true;
{ЦФ приравнивается к нулю, а свободный член переносится в правую часть:}
matrix[n+1,m+y+1]:=0-matrix[n+
{правые части ограничений
for i:=1 to n do {для всех ограничений}
if matrix[i,m+y+1]<0 then {если правая часть отрицательна,}
{то отнимаем всю строку от нуля}
for j:=1 to m+y+1 do matrix[i,j]:=(0-matrix[i,j]);
kanon:=true;{система приведена к каноническому виду}
{выведем ее в отчет}
write_system(n+1,m+y+1);
{если ф-ция на минимум, то нужно поменять знаки в последней строке}
if form1.Extrem.ItemIndex=1 then
for j:=1 to m+y+1 do matrix[n+1,j]:=0-matrix[n+1,j]
{/////////////////////////////
{////////////////////////// Тут надо ввести
базис ////////////////////////
i_basis:=0;
for i:=1 to n do {то во всех ограничениях}
begin
is_basis:=false;
for j:=1 to m+y do
if (matrix[i,j]=1) then
if (is_basis=false) then
begin
all_basis[i]:=j;
is_basis:=true;
for k:=1 to n do
if k<>i then
if (matrix[k,j]<>0) then
if (is_basis=true) then
begin
is_basis:=false;
all_basis[i]:=0;
end;
end;
if is_basis=false then
begin
i_basis:=i_basis+1;
y:=y+1;
for k:=1 to n+1 do
begin {во всех ограничениях и в ЦФ}
{перед правой частью
matrix[k,m+y+1]:=matrix[k,m+y]
matrix[k,m+y]:=0;{состоящий из нулей}
end;
matrix[i,m+y]:=1;
all_basis[i]:=m+y;
end;
end;
{//////////////// Закончили ввод искусственного базиса //////////////////////}
{/////////////////////////////
{/////////////////////////////
{//////////////// теперь надо от него избавиться ////////////////////////////}
if i_basis>0 then
begin
write(f, '<H2>Необходимо ввести искусственный базис</H2>');
zapisat(n+1,m+y+1,-1,-1);
writeln(f, '<P>Искусственный базис введен.<br>');
writeln(f, 'Избавившись от него, получим первое допустимое решение</P>');
iter:=0;
repeat
inc(iter);
findved;
preobr;
until (i_basis=0) or (iter=20) or (done=true);
if i_basis=0 then
begin
writeln(f,'<P>Искусственный базис выведен полностью.<br>');
writeln(f,'Получено первое допустимое решение!</P>');
end
else
begin
writeln(f,'<P>Не удалось вывести искусственный базис.<br>');
writeln(f,'Решение не найдено.</P>');
end;
end;
{//////////////////////// попытки избавленя окончены ////////////////////////}
{/////////////////////////////
{/////////////////////////////
if i_basis=0 then
begin
iter:=0;
findved;
if done=false then
begin
writeln(f,'<H2>Применяем симплекс метод</H2>');
repeat
inc(iter);
findved;
preobr;
until (done=true) or (iter=20);
end;
end;
otvet;
{/////////////////////////////
writeln(f,'</BODY>');
writeln(f,'</HTML>');
CloseFile(f);
{/////////////////////////////
end;
{/////////////////////////////
{///////// все, что ниже, относится к переходам между шагами ////////////////}
{/////////////////////////////
procedure TForm1.ExitClick(Sender: TObject);
begin
Close();
end;
procedure TForm1.Button_NextClick(
begin
step:=step+1;
Form1.Button_Prev.Enabled:=
case step of
1:Step1;
2:begin
Step2;
Form1.Button_Next.Enabled:=
end;
else step:=step-1;
end;
form1.Caption:='Симплекс метод - шаг '+inttostr(step);
end;
procedure TForm1.Button_PrevClick(
begin
step:=step-1;
Form1.Button_Next.Enabled:=
case step of
0:begin
Init;
Form1.Button_Prev.Enabled:=
end;
1:Step1;
else step:=step+1;
end;
form1.Caption:='Симплекс метод - шаг '+inttostr(step);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Init;
end;
Заключение
В данной курсовой работе было рассмотрено
решение задач линейного
Таким образом, вычислительная техника в настоящее время находит широкое применение, как в общей математике, так и в одном из её разделов - математических методах.
Список используемой литературы
1. Зайченко Ю.П., Шумилова С.А. Исследование операций.
2. Лищенко «Линейное и нелинейное программирование», М. 2003
3. А.Н. Карасев, Н.Ш. Кремер, Т.Н.
Савельева «Математические
4. Орлов А.И. Теория принятия решений. Учебное пособие. - М.: Издательство "Март", 2004
5. Интернет
ВВЕДЕНИЕ
Проникновение математики в экономическую
науку связано с преодолением значительных
трудностей. В этом отчасти была «повинна»
математика, развивающаяся на протяжении
нескольких веков в основном в связи с
потребностями физики и техники. Но главные
причины лежат все же в природе экономических
процессов, в специфике экономической
науки.
Большинство объектов, изучаемых экономической
наукой, может быть охарактеризовано кибернетическим
понятием – сложная система.
Наиболее распространено понимание системы
как совокупности элементов, находящихся
во взаимодействии и образующих некоторую
целостность, единство. Важным качеством
любой системы является эмерджентность–
наличие таких свойств, которые не присущи
ни одному из элементов, входящих в систему.
Поэтому при изучении систем недостаточно
пользоваться методом их расчленения
на элементы с последующим изучением этих
элементов в отдельности. Одна из трудностей
экономических исследований – в том, что
почти не существует экономических объектов,
которые можно было бы рассматривать как
отдельные (внесистемные) элементы.
Сложность системы определяется количеством
входящих в нее элементов, связями между
этими элементами, а также взаимоотношениями
между системой и средой. Экономика страны
обладает всеми признаками очень сложной
системы. Она объединяет огромное число
элементов, отличается многообразием
внутренних связей и связей с другими
системами (природная среда, экономика
других стран и т.д.). В народном хозяйстве
взаимодействуют природные, технологические,
социальные процессы, объективные и субъективные
факторы.
Сложность экономики иногда рассматривалась
как обоснование невозможности ее моделирования,
изучения средствами математики. Но -
такая точка зрения в принципе неверна.
Моделировать можно объект любой природы
и любой сложности. И как раз сложные объекты
представляют наибольший интерес для
моделирования; именно здесь моделирование
может дать результаты, которые нельзя
получить другими способами исследования.
Потенциальная возможность математического
моделирования любых экономических объектов
и процессов не означает, разумеется, ее
успешной осуществимости при данном уровне
экономических и математических знаний,
имеющейся конкретной информации и вычислительной
технике. И хотя нельзя указать абсолютные
границы математической формализации
экономических проблем, всегда будут существовать
еще неформализованные проблемы, а также
ситуации, где математическое моделирование
недостаточно эффективно.
-
І Основные теоретические положения симплексного
метода решения ЗЛП
1.1 Теория линейного программирования
Как известно, в практике хозяйственной
деятельности выбор между различными
вариантами (планами, решениями) предполагает
поиск наилучшего. Когда хозяйка отправляется
на рынок для закупки мяса, а проектировщик
стремится найти оптимальный способ размещения
станков, они занимаются поисками вариантов,
требующих минимума затрат или максимума
результата с учетом определенных ограничений
(денег, ресурсов, времени).
Решить подобную задачу бывает непросто,
особенно при наличии большого числа вариантов.
Время и затраты при выборе оптимума не
всегда оправданны: издержки поиска и
перебора вариантов могут превысить достигнутый
выигрыш.Как показывает практика, опыт
и интуиция оказываются недостаточными
для обоснования оптимального решения.Более
надежный и эффективный способ — использование
математических (количественных) подходов
и расчетов. Однако математические подходы
и обоснования длительное время игнорировались
теоретиками, делавшими “погоду” в экономической
науке. Многие важные работы были заморожены,
публикации экономистов-математиков тормозились
и ограничивались. И все же в тот период
математические изыскания продолжались,
даже в условиях гонения на математиков
были достигнуты блестящие результаты.Одним
из наиболее значительных и ярких достижений
в области экономико-математических исследований
было открытие Леонидом Витальевичем
Канторовичем (1912—1986) Метода линейного
программирования.
Линейное программирование — решение
линейных уравнений (уравнений первой
степени) посредством составления программ
и -
применения различных методов их последовательного
решения, существенно облегчающих расчеты
и достижение искомых результатов.
Условия задачи на оптимум и цель, которая
должна быть достигнута, могут быть выражены
с помощью системы линейных уравнений.
Поскольку уравнений меньше, чем неизвестных,
задача обычно имеет не одно, а множество
решений. Найти же нужно одно, согласно
терминологии математиков, экстремальное
решение.В задаче по оптимизации выпуска
фанеры Канторович представил переменную,
которую следовало максимизировать в
виде суммы стоимостей продукции, производимой
всеми станками. Ограничители были представлены
в форме уравнений, устанавливающих соотношения
между всеми затрачиваемыми в производстве
факторами (древесиной, клеем, электроэнергией,
рабочим временем) и количеством выпускаемой
продукции (фанеры) на каждом из станков.
Для показателей факторов производства
были введены коэффициенты, названные
разрешающими множителями, или мультипликаторами.
С их помощью разрешается поставленная
задача. Если известны значения разрешающих
множителей, то искомые величины, в частности,
оптимальный объем выпускаемой продукции,
могут быть сравнительно легко найдены.
.Для любой задачи линейного программирования
существует сопряженная ей, или двойственная,
задача. Если прямая задача заключается
в минимизации целевой функции, то двойственная
— в максимизации.Двойственные оценки
дают принципиальную возможность соизмерять
не только ценовые, затратные показатели,
но и полезности. При этом двойственные,
взаимосвязанные оценки соответствуют
конкретным условиям. Если изменяются
условия, то изменяются и оценки. В известной
мере поиск оптимума — это определение
общественно необходимых затрат, учитывающих,
с одной стороны, трудовые, стоимостные
затраты, а с другой стороны, общественные
потребности, полезности продукта для
потребителей.
-
1.2 Общий вид задач линейного программирования
В общем случае задача линейного программирования
может быть записана в таком виде(формула
1.1)
Z(X)=c1x1+c2x2+…+cnxn→
max(min), (1.1)
a11x1+a12x2+…+a1nxn=b1,
…………………………
ai1x1+ai2x2+…+ainxn=bi,
a(i+1)1x1+a(i+1)2x2+…+a(i+1)nx
………………………..
am1x1+am2x2+…+amnxn≤bm
xj≥0, j=1,2,…,t; t≤n. (1.3)
Данная запись означает следующее: найти
экстремум целевой функции (1.1) и соответствующие
ему переменные X=(X1, X2,...,Xn)
при условии, что эти переменные удовлетворяют
системе ограничений (1.2) и условиям неотрицательности
(1.3).
Допустимым решением (планом)
задачи линейного программирования называется
любой n-мерный вектор X=(X1, X2,...,Xn),
удовлетворяющий системе ограничений
и условиям неотрицательности.
Множество допустимых решений (планов)
задачи образует область допустимых
решений(ОДР).
Оптимальным решением(планом)
задачи линейного программирования называется
такое допустимое решение (план) задачи,
при котором целевая функция достигает
экстремума.
Каноническая форма задачи линейного
программирования.
-
В общем случае задача линейного программирования
записывается так, что ограничениями являются
как уравнения, так и неравенства, а переменные
могут быть как неотрицательными, так
и произвольно изменяющимися.
В том случае, когда все ограничения являются
уравнениями и все переменные удовлетворяют
условию неотрицательности, задачу линейного
программирования называют канонической.
Она может быть представлена в координатной,
векторной и матричной записи.
Каноническая задача линейного программирования
в координатной записи имеет вид (формула
1.4):
Z(X)=c1x1+c2x2+…+cnxn→
max (1.4)
a11x1+a12x2+…+a1nxn≤b1,
a21x1+a22x2+…+a2nxn≤b2
… … … … … … … …
am1x1+am2x2+…+amnxn≤bm
xj≥0, j=1,2,…,n.
Каноническая задача линейного программирования
в матричной записи имеет вид (формулы
1.5, 1.6):
Z(X)=CX → max(min), (1.5)
AX=A0, Y≥θ,
A=, X=, A0= (1.6)
Здесь:
-
Приведение общей задачи линейного
программирования к канонической форме.
В большинстве методов решения задач линейного
программирования предполагается, что
система ограничений состоит из уравнений
и естественных условий неотрицательности
переменных. Однако при составлении моделей
экономических задач ограничения в основном
формируются в виде системы неравенств,
поэтому необходимо уметь переходить
от системы неравенств к системе уравнений.
Возьмем линейное неравенство a1x1+a2x2+...+anxn≤b
и прибавим.
Это может быть сделано следующим образом:
к его левой части некоторую величину
xn+1 , такую, что неравенство превратилось
в равенство a1x1+a2x2+...+anxn+xn+1=b.
При этом данная величина xn+1 является
неотрицательной.
1.3 Методы решения задач линейного программирования
Методы решения задач линейного программирования
относятся к вычислительной математике,
а не к экономике. Однако экономисту полезно
знать о свойствах интеллектуального
инструмента, которым он пользуется.
С ростом мощности компьютеров необходимость
применения изощренных методов снижается,
поскольку во многих случаях время счета
перестает быть лимитирующим фактором,
поскольку весьма мало (доли секунд). Поэтому
мы разберем лишь три метода.
Простой перебор. Возьмем некоторый многомерный
параллелепипед, в котором лежит многогранник,
задаваемый ограничениями. Как его построить?
Например, если имеется ограничение типа
2Х1 + 5Х2 ≤ 10, то, очевидно, 0 ≤
Х1 ≤ 10/2 = 5 и 0 ≤ Х2 ≤ 10/2 = 5. Аналогичным
образом от линейных ограничений общего
вида можно перейти к ограничениям на
отдельные переменные. Остается взять
максимальные границы по каждой переменной.
Если многогранник, задаваемый ограничениями,
неограничен, -
как было в задаче о диете, можно похожим,
но несколько более сложным образом выделить
его "обращенную" к началу координат
часть, содержащую решение, и заключить
ее в многомерный параллелепипед.
Проведем перебор точек параллелепипеда
с шагом 1/10n последовательно при
n=2,3,…, вычисляя значения целевой функции
и проверяя наличие ограничений. Из всех
точек, удовлетворяющих ограничениям,
возьмем ту, в которой целевая функция
максимальна. Решение найдено! (Более строго
выражаясь, найдено с точностью до 1/10n).
Направленный перебор.Начнем с точки,
удовлетворяющей ограничениям (ее можно
найти простым перебором). Будем последовательно
(или случайно - т.н. метод случайного поиска)
менять ее координаты на определенную
величину ∆, каждый раз в точку с более
высоким значением целевой функции. Если
выйдем на плоскость ограничения, будем
двигаться по ней (находя одну из координат
по уравнению ограничения). Затем движение
по ребру (когда два ограничения-неравенства
переходят в равенства)… Остановка - в
вершине линейного многогранника. Решение
найдено! (Более строго выражаясь, найдено
с точностью до ∆ ; если необходимо, в окрестности
найденного решения проводим направленный
перебор с шагом ∆/2 , ∆/4 и т.д.)
Симплекс-метод. Этот один из первых специализированных
методов оптимизации, нацеленный на решение
задач линейного программирования, в то
время как методы простого и направленного
перебора могут быть применены для решения
практически любой задачи оптимизации.
Он был предложен американцем Г. Данцигом
в 1951 г. Симплекс-метод состоит в продвижении
по выпуклому многограннику ограничений
от вершины к вершине, при котором на каждом
шаге значение целевой функции улучшается
до тех пор, пока не будет достигнут оптимум.
-
1.4 Общая характеристика симплекс-метода
Симплекс метод - это характерный пример
итерационных вычислений, используемых
при решении большинства оптимизационных
задач. В вычислительной схеме симплекс-метода
реализуется упорядоченный процесс, при
котором, начиная с некоторой исходной
допустимой угловой точки (обычно начало
координат), осуществляются последовательные
переходы от одной допустимой экстремальной
точки к другой до тех пор, пока не будет
найдена точка, соответствующая оптимальному
решению (рис.1.1).
Информация о работе Решение задач линейного программирования симплекс методом