Реферат по предмету "Программирование и компьютеры"


Решение задач оптимизации симплекс-методом

Содержание 1. Цель работы 2. Постановка задачи 3. Описание метода решения 4. Программная реализация
4.1. Описание основных процедур и функций 4.2. Блок-схемы основных процедур 4.3. Листинг 5. Контрольный пример 1.Цель работы. Целью данной курсовой работы является решение конкретной задачи линейного программирования. Во всех таких задачах требуется найти максимум или минимум линейной функции при условии, что её переменные принимают неотрицательные значения и удовлетворяют некоторой системе линейных уравнений или линейных неравенств либо системе, содержащей как линейные уравнения, так и линейные неравенства. Каждая из этих задач является частным случаем общей задачи линейного программирования. Для решения задач линейного программирования созданы специальные методы. Изучению одного из них, а именно симплекс-методу, посвящена эта курсовая работа. 2.Постановка задачи. На основе изученного алгоритма симплекс-метода создать работающее программное приложение в виде компонента для решения задач по отысканию максимума или минимума функции. 3.Описание метода. Для решения производственных задач линейного программирования существует множество методов. Рассмотрим один из них. Симплексный метод Симплексный метод задач линейного программирования основан на переходе от одного опорного плана к другому, при котором значение целевой функции возрастает (при условии, что данная задача имеет оптимальный план, и каждый ее опорный план является невырожденным). Указанный переход возможен, если известен какой-нибудь исходный опорный план. Рассмотрим задачу, для которой этот план можно непосредственно записать. Пусть дана функция, для которой необходимо найти наибольшее или наименьшее значение, если значения всех неизвестных неотрицательные. ƒ = C0 + C1x1 + C2x2 + .+ Cnxn и система m линейных уравнений с n неизвестными. Это называется системой ограничений: a11x1 + a12x2 + .+ a1nxn = b1 a21x1 + a12x2 + .+ a2nxn = b2 . am1x1 +am2x12 + .+ amnxn = bm Целевую функцию представим в виде: ƒ - C1x1-C2x2 - .-Cnxn = C0 Составим симплекс-таблицу.В дальнейшем будем считать, что ранг матрицы системы ограничений равен r.В системе ограничений выбран базис(основные неизвестные)x1,x2, .xn и коэффициенты в правой части не отрицательны. В этом случае система ограничений будет иметь вид: x1 + .+ a1,r+1xr+1 + .+ a1nxn = b1 x2 + a2,r+1xr+1 + .+ a2nxn = b2 . xr+ ar,r+1xr+1 + .+ arnxn = br Тогда целевая функция имеет вид: ƒ + Cr+1xr+1 + Cr+2xr+2 - .- Cnxn = C0 Нахождение оптимального плана симплексным методом включает следующие этапы: 1. Находят опорный план. 2. Составляют симплекс-таблицу. В общем виде: Базисные неизвестные Свободные члены x1 x2 . xr xr+1 xj xn x1 x2 . xi . xr b1 b2 . bi . br 1 0 . 0 . 0 0 1 0 0 0 0 . 0 . 1 a1,r+1 a2,r+1 . ai,r+1 . ar,r+1 a1j a2j . aij . arj a1n a2n . ain . arn ƒ C0 0 0 . 0 Cr+2 Cj Cn 3. В нижней строчке симплекс-таблицы необходимо отыскать отрицательные числа (не считая коэффициент Со). Если таких чисел нет, то данное базисное решение является оптимальным. 4. Пусть элемент Сj5. Если положительный коэффициент в j-ом столбце один, то выбранную строку с номером i надо поделить все коэффициенты на число aij.Результат деления записываем в новую симплекс-таблицу. Если же положительных коэффициентов несколько, необходимо составить отношение bi/aij и из полученных значений выбрать наименьшее, соответствующее i-ой строке. 6. В новой симплекс-таблице в столбце базисных неизвестных вместо xi пишется xj. Продолжается заполняться таблица. В столбце с номером j необходимо получить нули(включая строку с целевой функцией). Для этого надо умножить i-ую записанную строку на нужное число и сложить с остальными строками. В результате осуществился переход к новому базису, при этом значение целевой функции увеличилось. 4.Программная реализация. 4.1.Описание основных процедур и функций -procedureMain – главная процедура, вызывающая все остальные. -functionRes – поиск отрицательных значений в строке F -procedureMinPlusDate – отыскание положительных коэффициентов в главном столбце и наименьшего частного при делении базисных неизвестных на коэффициенты в главном столбце -proceduredivizion – деление главной строки на соответствующий коэффициент -procedureAdding – получение нулей, путём сложения главной строки, умноженной на соответствующий коэффициент с другими строками 4.2.Блок-схемы основных процедур

4.3.Листинг unit SimplexM; interface uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,StdCtrls,Grids, Buttons,Chart, Dialogs; type TSimplexM = class(TCustomPanel) private FStrGr: TStringGrid; FLabel1, FLabel2: TLabel; FBitBtn1, FBitBtn2, FBitBtn3, FBitBtn4, FBitBtn5: TBitBtn; FColX: Integer; FGroupBox: TGroupBox; FBottomPanel, FRightPanel, FCenterPanel: TPanel; FRadioButton1, FRadioButton2: TRadioButton; maxRow, maxCol, NumMinCol: integer; Data: array of TStrings; procedure SetColX (Value: integer); procedure SGColRow; { Private declarations } procedure Main(var flag: boolean; MaxRow: integer); function Res(var NumMinCol:integer): boolean; procedure Resultat(flag: boolean); procedure MinPlusDate(var Answ: boolean; xov, NumMinCol: integer; var ColSet, RowSet: integer; var date:real); procedure InputData(var xov, MaxRow: integer); procedure Name0Str(xov: integer); procedure Name0Col(xov: integer); procedure divizion(NumMinCol: integer); procedure Adding (RowSet, ColSet, Maxcol, MaxRow, NumMinCol:integer); procedure SaveData; procedure LoadData; protected { Protected declarations } FOnBitBtn1Click, FOnBitBtn2Click, FOnBitBtn3Click: TNotifyEvent; procedure SetBitBtnClick(Sender: TObject); procedure SetBitBtn4Click(Sender: TObject); procedure SetBitBtn5Click(Sender: TObject); public constructor Create(AOwner: TComponent); override; { Public declarations } published { Published declarations } property Color; property Caption; property Align; property Height; property ColX: Integer read FColX write SetColX; property StrGr: TStringGrid read FStrGr write FStrGr; property Label1: TLabel read FLabel1 write FLabel1; property Label2: TLabel read FLabel2 write FLabel2; property BitBtn1: TBitBtn read FBitBtn1 write FBitBtn1; property BitBtn2: TBitBtn read FBitBtn2 write FBitBtn2; property BitBtn3: TBitBtn read FBitBtn3 write FBitBtn3; property RadioButton1: TRadioButton read FRadioButton1 write FRadioButton1; property RadioButton2: TRadioButton read FRadioButton2 write FRadioButton2; property OnBitBtn1Click: TNotifyEvent read FOnBitBtn1Click write FOnBitBtn1Click; property OnBitBtn2Click: TNotifyEvent read FOnBitBtn2Click write FOnBitBtn2Click; property OnBitBtn3Click: TNotifyEvent read FOnBitBtn3Click write FOnBitBtn3Click; end; procedure Register; implementation procedure Register; begin RegisterComponents('Probnic', [TSimplexM]); end; { TSimplexTab } constructor TSimplexM.Create(AOwner: TComponent); begin inherited Create(AOwner); FCenterPanel := TPanel.Create(Self); FCenterPanel.Align := alClient; FCenterPanel.Parent := Self; FStrGr := TSTringGrid.Create(Self); with FStrGr do begin Parent := FCenterPanel; Align := alClient; Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, GoEditing]; Left := 8; Top := 8; Width := 473; Height := 105; ColCount := 6; RowCount := 4; Cells[0,0] := 'Базис'; Cells[1,0] := 'Св.чл.'; Font.Name := 'Comic Sans MS'; end; FRightPanel := TPanel.Create(Self); with FRightPanel do begin Parent := Self; Left := 511; Top := 1; Width := 89; Height := 463; Align := alRight; end; FBottomPanel := TPanel.Create(Self); with FBottomPanel do begin Parent := Self; Left := 1; Top := 464; Width := 599; Height := 40; Align := alBottom; end; FLabel1 := TLabel.Create(Self); with FLabel1 do begin Parent := FBottomPanel; Caption := ‘Оптимальное значение функции:'; Left := 8; Top := 5; Height := 13; Anchors := [akLeft, akBottom]; end; FLabel2 := TLabel.Create(Self); with FLabel2 do begin Parent := FBottomPanel; Left := 300; Top := 5; Height := 13; Anchors := [akBottom]; Caption:= ''; end; FBitBtn1 := TBitBtn.Create(Self); with FBitBtn1 do begin Parent := FRightPanel; Left := 5; Top := 16; Width := 81; Height := 25; Anchors := [akTop, akRight]; Kind := bkOk; Caption := '&Вычислить'; OnClick := SetBitBtnClick; end; FBitBtn2 := TBitBtn.Create(Self); with FBitBtn2 do begin Parent := FBottomPanel; Left := 512; Top := 5; Width := 81; Height := 25; Anchors := [akRight, akBottom]; Kind := bkClose; Caption := '&Выход'; TabOrder := 2; end; FBitBtn3 := TBitBtn.Create(Self); with FBitBtn3 do begin Parent := FRightPanel; Left := 5; Top := 123; Width := 81; Height := 25; Anchors := [akRight, akTop]; Kind := bkRetry; Caption := '&Очистить'; TabOrder := 2; OnClick := SetBitBtnClick; end; FBitBtn4 := TBitBtn.Create(Self); with FBitBtn4 do begin Parent := FRightPanel; Left := 5; Top := 155; Width := 81; Height := 25; Anchors := [akRight, akTop]; Caption := '&Сохранить'; OnClick := SetBitBtn4Click; end; FBitBtn5 := TBitBtn.Create(Self); with FBitBtn5 do begin Parent := FRightPanel; Left := 5; Top := 182; Width := 81; Height := 25; Anchors := [akRight, akTop]; Caption := '&Читать'; OnClick := SetBitBtn5Click; end; FGroupBox := TGroupBox.Create(Self); with FGroupBox do begin Parent := FRightPanel; Left := 5; Top := 48; Width := 81; Height := 65; Anchors := [akTop, akRight]; Caption := ' Найти '; end; FRadioButton1 := TRadioButton.Create(Self); with FRadioButton1 do begin Parent := FGroupBox; Caption := 'Min'; Left := 3; Top := 15; Width := 60; Checked := True; end; FRadioButton2 := TRadioButton.Create(Self); with FRadioButton2 do begin Parent := FGroupBox; Caption := 'Max'; Left := 3; Top := 35; Width := 60; end; Height := 255; Width := 490; Constraints.MinHeight := 235; Constraints.MinWidth := 490; FColX := 2; end; procedure TSimplexM.SetBitBtnClick(Sender: TObject); var flag: boolean; i, j: integer; begin if Sender = FBitBtn1 then begin if Assigned(FOnBitBtn1Click) then FOnBitBtn1Click(Sender)
else begin flag := FRadioButton2.Checked; end; main(flag, MaxRow); end;
Exit; end; if Sender = FBitBtn3 then begin if Assigned(FOnBitBtn3Click) then FOnBitBtn3Click(Sender) else begin for i:= 1 to FStrGr.ColCount-1 do for j := 1 to FStrGr.RowCount-1 do FStrGr.Cells[i, j] := ''; end; Label2.Caption:=''; Exit; end; end; procedure TSimplexM.SetColX(Value: integer); begin FColX := Value; FStrGr.ColCount := Value; SGColRow; Name0str(FColX); Name0col(FColX); end; procedure TSimplexM.SGColRow; //построение таблицы begin maxrow:=2+FColX; maxcol:=2+2*FColX; FStrGr.ColCount := 2*FColX+2; FStrGr.RowCount := 2+FColX; end; function TSimplexM.Res(var NumMinCol:integer): boolean; // ищем отрицательные числа в строке F ,если есть - выходим из цикла var i: integer; begin res:=true; for i:=2 to MaxCol-1 do begin if strtofloat(FStrGr.Cells[i,maxRow-1]) begin NumMinCol:=i; res:=false; break; end end; end; procedure TSimplexM.divizion(NumMinCol: integer); // деление гл.строки на нужный коэффициент var i: integer; d: real; begin d:=strtofloat(FStrGr.Cells[NumMinCol,1]); for i:=1 to MaxCol-1 do FStrGr.Cells[i,1]:=floattostr ( (strtofloat(FStrGr.Cells[i,1]))/d ); end; procedure TSimplexM.Adding(RowSet, ColSet, MaxCol, MaxRow, NumMinCol :integer); //сложение главной строки с другими для получения нуля var i, j: integer; tmp: string; t: real; begin if RowSet>1 then begin for i:=0 to MaxCol-1 do begin tmp:=FStrGr.Cells[i,1]; // поднимаем главную строку в первую строку FStrGr.Cells[i,1]:=FStrGr.Cells[i,RowSet]; FStrGr.Cells[i,RowSet]:=tmp; end; end; divizion(NumMinCol); for i:=2 to MaxRow-1 do begin t:=strtofloat(FStrGr.Cells[NumMinCol,i]); // коффициенты в др.строках for j:=1 to MaxCol-1 do begin if t// умножаем на нужный коэффициент другой строки и складываем else FStrGr.Cells[j,i]:=floattostr (strtofloat(FStrGr.Cells[j,1])*(-t)+strtofloat(FStrGr.Cells[j,i])); end; end; end; // главная процедура procedure TSimplexM.Main ( var flag: boolean; MaxRow: integer); var i, NumMinCol, ColSet, RowSet: integer; date: real; Answ, nn: boolean; begin Answ:=true; nn:=false; if flag then for i:=2 to FColX+1 do try FStrGr.Cells[i,MaxRow-1]:=floattostr (0-strtofloat(FStrGr.Cells[i,MaxRow-1])) except raise Exception.Create('Неверный формат данных'); end else begin for i:=2 to FColX+1 do try if strtofloat(FStrGr.Cells[i,MaxRow-1]) except raise Exception.Create(' Неверный формат данных'); end; if not nn then begin resultat(flag); exit; end; end; while not Res(NumMinCol) do begin MinPlusDate(Answ, FColX, NumMinCol, ColSet, RowSet, date); if Answ=false then raise Exception.Create('Нет решений') else begin FStrGr.Cells[0,RowSet]:='X'+inttostr(ColSet-1); Adding(RowSet, ColSet, MaxCol, MaxRow, NumMinCol); end; end; resultat(flag); end; procedure TSimplexM.MinPlusDate( var Answ: boolean; xov, NumMinCol: integer; var ColSet, RowSet:integer; var date:real); //ищем наименьшее пложительное от деления св.чл. на гл.неизвестые var t: real; i, j, count : integer; begin count:=0; // кол-во отрицательных значений в столбце for i:=1 to MaxRow-2 do if strtofloat(FStrGr.Cells[NumMinCol,i]) count:=count+1; if count=xov then // если кол-во отрицательных значений в столбце равно кол-ву неизвестных, то решения не существует begin Answ:=false; exit; end; ColSet:=NumMinCol; // присвоение координат минимального из положительных (нужного) в столбце NumMinCol RowSet:=1; j:=1; repeat date:=(strtofloat(FStrGr.cells[1,j]))/(strtofloat(FStrGr.cells[NumMinCol,j])); // делим св.член на нужное j:=j+1; until date>0; RowSet:=j-1; // опережает for i:=j to MaxRow-2 do begin t:=(strtofloat(FStrGr.cells[1,i]))/(strtofloat(FStrGr.cells[NumMinCol,i])); if t > 0 then if t begin date:=t; RowSet:=i; end; end; end; procedure TSimplexM.Resultat; // вывод результата на экран begin if flag=false then Flabel2.caption:= floattostr (-strtofloat(FStrGr.Cells[1,MaxRow-1])) else Flabel2.caption:= FStrGr.Cells[1,MaxRow-1] end; procedure TSimplexM.Name0str(xov: integer); //именование нулевой строки var i, j: integer; begin j:=0; for i:=2 to 2*(xov+1) do begin j:=j+1; FStrGr.Cells[i,0]:='X'+inttostr(j); end; end; procedure TSimplexM.Name0Col(xov: integer); //именование нулевого столбца var i, j: integer; begin j:=xov; for i:=1 to xov do begin j:=j+1; FStrGr.Cells[0,i]:='X'+inttostr(j); end; FStrGr.Cells[0,xov+1]:='F'; end; procedure TSimplexM.InputData(var xov,MaxRow: integer); // введение количества неизвестных begin xov:=FColX; maxrow:=2+xov; maxcol:=2+2*xov; FStrGr.RowCount:=maxrow; FStrGr.ColCount:=maxcol ; end; procedure TSimplexM.SaveData; //сохранение вводимых в таблицу данных var i: Integer; begin SetLength(Data, FStrGr.Rowcount); for i := 0 to FStrGr.RowCount do begin Data[i] := TStringList.Create; Data[i].Assign(FStrGr.Rows[i]); end; end; procedure TSimplexM.LoadData; //чтение в таблицу сохранённых данных var i: Integer; begin for i := 0 to Length(Data) do begin FStrGr.Rows[i].Assign(Data[i]); end; SetLength(Data, 0); end; procedure TSimplexM.SetBitBtn4Click(Sender: TObject); begin SaveData; end; procedure TSimplexM.SetBitBtn5Click(Sender: TObject); begin Label2.Caption:=''; LoadData; end; end. 5.Контрольный пример. Завод выпускает продукцию 1-го и 2-го типа. Прибыль от реализации единицы продукции соответственно составляет 30 и 40 у.е. На выпуск единицы продукции 1-го типа расходуется 4 единиц сырья категории А, 4 ед. – категории В. Для выпуска единицы продукции 2-го типа расходуется сырья категории А - 3 ед., категории С – 12 единицы. Имеющиеся в наличие запасы сырья категории А – 120 единиц, В – 252 единицы. Тип выпускаемой продукции Расход сырья (ед.) Прибыль от реализации единицы продукции (у.е.) А В 1 4 4 30 2 3 12 40 Запасы сырья (ед.) 120 252 Необходимо определить количество продукции, при выпуске которой прибыль является максимальной. Предположим, что будет изготовлено x1 единиц продукции 1-го типа, х2 – 2-го типа. Тогда для производства такого количества изделий потребуется затратить 4x1 +4х2 сырья вида А.
Так как запас сырья данного вида не может превышать 7, то должно выполняться неравенство 4x1 +4х2 ≤ 120. Аналогичные рассуждения относительно возможного использования сырья вида B приведут к следующим неравенствам: 3x1 + 12х2 ≤ 252, При этом так как количество выпускаемой продукции не может быть отрицательной, то x1>0, x2>0. (1) Далее, если будет выпущено х1 единиц продукции 1-го типа, х2 единиц продукции 2-го типа, то прибыль от их реализации составит F= 30x1 + 40х2 . Таким образом, приходим к следующей математической задаче: дана система 4x1 +4х2 ≤ 120, 3x1 + 12х3 ≤ 252, (2) трёх линейных неравенств с двумя неизвестными хj (j=1 3) и линейная функция относительно этих же переменных F= 30x1 + 40х2 ; (3) требуется среди всех неотрицательных решений системы неравенств (2) найти такое, при котором функция (3) принимает максимальное значение. Линейная функция (3), максимум которой требуется определить, вместе с системой неравенств (2) и условием неотрицательности переменных (1) образуют математическую модель исходной задачи. Так как функция (3) линейная, а система (2) содержит только линейные неравенства, то задача (1)-(3) является задачей линейного программирования. Данные расчётов для всех итераций приведены в таблице: Базисные неизвестные Свободные члены x1 x2 x3 x4 x3 x4 120 252 4 3 4 12 1 0 0 1 ƒ 0 -30 -40 0 0 x1 x3 30 162 1 0 1 9 1/4 3/4 0 1 ƒ 900 0 -10 7,5 0 x1 x2 18 12 0 1 1 0 -1/12 1/3 1/9 -1/9 ƒ 1080 0 0 45/6 10/9 Таким образом, если предприятие изготовит 12 единиц изделий вида А и 18 единиц изделий В, то оно получит максимальную прибыль, равную: F=30*12 + 40*18 = 1080.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :

Реферат Измерение параметров воздуха. Борьба с заморозками для защиты ценных сельскохозяйственных культур
Реферат Теплопроводность в сплошных средах и двухфазных, продуваемых и непродуваемых телах (слоях).
Реферат Детский туризм
Реферат Методика развития экспериментально-исследовательских умений школьников на уроках учебного предмета
Реферат Поняття та форми власності
Реферат Комплексометрическое титрование, комплексоны, комплексонометрия, комплексонометрические ТКТ и индикаторы
Реферат Энергетика в устойчивом развитии мирового сообщества
Реферат Контроль налоговых служб за исчислением и уплатой налогов с физических лиц
Реферат Чернобыль
Реферат Становление и развитие социологии как науки
Реферат Аппаратные средства вывода графической информации. Средства визуального отображения графической информации
Реферат Хронический обструктивньй бронхит и его диагностика
Реферат Н. Я. Данилевский. Россия и Европа
Реферат Апеннинский полуостров описание и характеристика почв
Реферат Источники и виды финансирования бизнеса