Решение задач целочисленного программирования методом Гомори
Курсовая работа, 23 Июня 2013, автор: пользователь скрыл имя
Краткое описание
Рассмотрим алгоритм решения задачи линейного целочисленного программирования этим методом.
Решаем задачу симплексным методом без учета условия целочисленности. Если все компоненты оптимального плана целые, то он является оптимальным и для задачи целочисленного программирования. Если обнаруживается неразрешимость задачи, то и неразрешима задача целочисленного программирования.
Если среди компонент оптимального решения есть нецелые, то к ограничениям задачи добавляем новое ограничение, обладающее следующими свойствами:
- оно должно быть линейным;
- должно отсекать найденный оптимальный нецелочисленный план;
- не должно отсекать ни одного целочисленного плана.
Прикрепленные файлы: 1 файл
Курсовая матем методы.doc
— 507.00 Кб (Скачать документ)StringGrid1.Cells[SpinEdit1.
StringGrid1.Cells[SpinEdit1.
str_um:=REshenie.RowCount;
stolb_um:=REshenie.ColCount;
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
with REshenie do
for i:=0 to colcount-1 do
for j:=0 to rowcount-1 do
Cells[i,j]:='';
REshenie.Cells[0,1]:='Ci';
REshenie.Cells[1,1]:='Áï';
StringGrid1.RowCount:=
REshenie.ColCount:=SpinEdit1.
REshenie.RowCount:=SpinEdit2.
str_um:=REshenie.RowCount;
stolb_um:=REshenie.ColCount;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
str_um:=REshenie.RowCount;
stolb_um:=REshenie.ColCount;
StringGrid1.Cells[0,0]:='X1';
StringGrid1.Cells [1,0]:='X2';
Chelevaya.Cells[0,0]:='X1';
Chelevaya.Cells[1,0]:='X2';
StringGrid1.Cells[2,0]:='Çíàê'
StringGrid1.Cells [3,0]:='#';
REshenie.Cells[0,1]:='Ci';
REshenie.Cells[1,1]:='Áï';
end;
procedure TForm1.Button2Click(Sender: TObject);
var stolb,strok:Integer;
s,d:real;
begin
Button1.Visible:=true;
REshenie.RowCount:=str_um;
REshenie.ColCount:=stolb_um;
with REshenie do
for i:=0 to colcount-1 do
for j:=0 to rowcount-1 do
Cells[i,j]:='';
for i:=2 to REshenie.ColCount-1 do
for j:=0 to REshenie.RowCount-1 do
REshenie.Cells[i,j]:='0';
REshenie.Cells[0,1]:='Ci';
REshenie.Cells[1,1]:='Áï';
for i:=2 to REshenie.RowCount-2 do
REshenie.Cells[0,i]:='0';
for strok:=1 to SpinEdit2.Value+2 do
for stolb:=2 to SpinEdit1.Value+1 do
begin
REshenie.Cells[stolb,strok]:=
end;
for stolb:=2 to SpinEdit1.Value+1 do
begin
REshenie.Cells[stolb,0]:=
end;
for strok:=1 to SpinEdit2.Value do
REshenie.Cells[REshenie.
for strok:=1 to SpinEdit2.Value do
begin
REshenie.Cells[1,strok+1]:='X'
REshenie.Cells[strok+
end;
for strok:=2 to SpinEdit2.Value+1 do
begin
if StringGrid1.Cells[SpinEdit1.
REshenie.Cells[strok+
if StringGrid1.Cells[SpinEdit1.
REshenie.Cells[strok+
end;
// Расчёт оценок
for stolb:=2 to REshenie.ColCount-1 do
begin
for j:=2 to REshenie.RowCount-2 do
begin
d:=StrTofloat( REshenie.cells[stolb,j])*
s:=s+d;
end;
REshenie.Cells[stolb,REshenie.
end
end;
procedure TForm1.Button1Click(Sender: TObject);
var itera,kluch_stolb,kluch_strok:
min1,min2,d,z,f1,f2,f3,f4,s:
chet: integer;
mas_of_min:array[1..10]of real;
mas_of_zna:array[1..10,1..10]
begin
chet:=0;
//Количество итераций
for itera:=1 to SpinEdit3.Value do
begin
if RadioGroup1.ItemIndex=1 then
begin
min1:=99;
//Нахождение ключ столбца
for i:=1 to REshenie.ColCount-3 do
begin
if StrToFloat(REshenie.Cells[i+1,
begin
min1:=StrToFloat(REshenie.
kluch_stolb:=i+1;
end;
end;
for i:=1 to REshenie.RowCount-3 do
begin
if REshenie.Cells[kluch_stolb,i+
mas_of_min[i]:=strtofloat(
else
mas_of_min[i]:=0;
end;
//Поиск минимальной строки
min2:=9999;
for i:=1 to REshenie.RowCount-3 do
if (mas_of_min[i]<min2) and (mas_of_min[i]>0) then
begin
min2:=mas_of_min[i];
kluch_strok:=i+1;
end;
f4:=StrToFloat(REshenie.Cells[
//Замена базиса
REshenie.Cells[0,kluch_strok]:
REshenie.Cells[1,kluch_strok]:
//Правило прямоугольника
for i:=2 to REshenie.RowCount-2 do
begin
for j:=2 to REshenie.ColCount-1 do
begin
if i<>kluch_strok then
if j<>kluch_stolb then
begin
f1:=StrToFloat(REshenie.Cells[
f2:=StrToFloat(REshenie.Cells[
f3:=StrToFloat(REshenie.Cells[
mas_of_zna[j,i]:=((f1*f4)-(f2*
end;
end;
end;
//Нули в столбце
for i:=2 to REshenie.RowCount-1 do
begin
REshenie.Cells[kluch_stolb,i]:
end;
REshenie.Cells[kluch_stolb,
//Строки делятся на ключевой элемент
for i:=2 to REshenie.ColCount-1 do
begin
REshenie.Cells[i,kluch_strok]:
end;
z:=StrToFloat(REshenie.Cells[
for i:=2 to REshenie.RowCount-2 do
begin
for j:=2 to REshenie.ColCount-1 do
begin
if i<>kluch_strok then
if j<>kluch_stolb then
begin
REshenie.Cells[j,i]:=
end;
end;
end;
// Подсчёт оценок
for i:=2 to REshenie.ColCount-1 do
begin
for j:=2 to REshenie.RowCount-2 do
begin
d:=StrTofloat( REshenie.cells[i,j])*
s:=s+d;
end;
REshenie.Cells[i,REshenie.
s:=0;
end;
for i:=2 to REshenie.ColCount-2 do
begin
if StrToFloat( REshenie.Cells[i,REshenie.
chet:=chet+1
else
end;
//Проверка на оптимальность
if chet=REshenie.ColCount-3 then
begin
MessageDlg('Решение Найдено’,mtWarning,[mbOK],1);
Button3.Visible:=true;
Button1.Visible:=false;
break;
end else
if itera=SpinEdit3.Value then
begin
MessageDlg(Решение не найдено, увеличьте
количество итераций или отсутствует
'+RadioGroup1.items[
Button1.Visible:=false;
Button3.Visible:=false;
end;
chet:=0;
end
else
begin
min1:=-99;
//Накождение ключ столбца
for i:=1 to REshenie.ColCount-3 do
begin
if StrToFloat(REshenie.Cells[i+1,
begin
min1:=StrToFloat(REshenie.
kluch_stolb:=i+1;
end;
end;
for i:=1 to REshenie.RowCount-3 do
begin
if REshenie.Cells[kluch_stolb,i+
mas_of_min[i]:=strtofloat(
else
mas_of_min[i]:=0;
end;
//Поиск Минимальной строки
min2:=9999;
for i:=1 to REshenie.RowCount-3 do
if (mas_of_min[i]<min2) and (mas_of_min[i]>0) then
begin
min2:=mas_of_min[i];
kluch_strok:=i+1;
end;
f4:=StrToFloat(REshenie.Cells[
//Замена базиса
REshenie.Cells[0,kluch_strok]:
REshenie.Cells[1,kluch_strok]:
//Правило прямоугольника
for i:=2 to REshenie.RowCount-2 do
begin
for j:=2 to REshenie.ColCount-1 do
begin
if i<>kluch_strok then
if j<>kluch_stolb then
begin
f1:=StrToFloat(REshenie.Cells[
f2:=StrToFloat(REshenie.Cells[
f3:=StrToFloat(REshenie.Cells[
mas_of_zna[j,i]:=((f1*f4)-(f2*
end;
end;
end;
//Нули в столбце
for i:=2 to REshenie.RowCount-1 do
begin
REshenie.Cells[kluch_stolb,i]:
end;
REshenie.Cells[kluch_stolb,
//Строка делится на ключевой элемент
for i:=2 to REshenie.ColCount-1 do
begin
REshenie.Cells[i,kluch_strok]:
end;
z:=StrToFloat(REshenie.Cells[
for i:=2 to REshenie.RowCount-2 do
begin
for j:=2 to REshenie.ColCount-1 do
begin
if i<>kluch_strok then
if j<>kluch_stolb then
begin
REshenie.Cells[j,i]:=
end;
end;
end;
// Подсчёт оценок
for i:=2 to REshenie.ColCount-1 do
begin
for j:=2 to REshenie.RowCount-2 do
begin
d:=StrTofloat( REshenie.cells[i,j])*
s:=s+d;
end;
REshenie.Cells[i,REshenie.
s:=0;
end;
for i:=2 to REshenie.ColCount-2 do
begin
if StrToFloat( REshenie.Cells[i,REshenie.
chet:=chet+1
else
end;
//Проверка на оптимальность
if chet=REshenie.ColCount-3 then
begin
MessageDlg('Решение найдено',mtWarning,[mbOK],1);
Button3.Visible:=true;
Button1.Visible:=false;
break;
end else
if itera=SpinEdit3.Value then
begin
MessageDlg(Решение не найдено, увеличьте
количество итераций или отсутствует
'+RadioGroup1.items[
Button1.Visible:=false;
Button3.Visible:=false;
end;
chet:=0;
end;
end;
Label5.Caption:=IntToStr(
Label6.Caption:=IntToStr(
end;
procedure TForm1.Button3Click(Sender: TObject);
label
fin,finals;
var
z,f1,f2,f3,f4,s,d:real;
mas_of_zna:array[1..10,1..10]
mas_of_min:array[1..10]of real;
max_drob_n,kluch_stolb,kluch_
mas_of_q:array[1..10]of real;
q,max,max_drob_z,x,min2,m,
begin
max:=-9999;
//
for i:=2 to REshenie.rowCount-2 do
If (frac(StrToFloat(REshenie.Cell
begin
max:=frac(StrToFloat(REshenie.
max_drob_n:=i;
max_drob_z:=StrToFloat(
end;
finals:
//Проверка на наличие дроби
if (max_drob_z<>0) or
(frac(StrToFloat(REshenie.
begin
Label9.Caption:=FloatToStr(
Label5.Caption:=IntToStr(
Label6.Caption:=IntToStr(max_
//Нахождение элементов дополнительного ограничения
mas_of_q[REshenie.ColCount]:=
mas_of_q[REshenie.ColCount-1]:
for i:=2 to REshenie.ColCount-2 do
begin
if (StrToFloat(REshenie.Cells[i,
mas_of_q[i]:=StrToFloat(
else
mas_of_q[i]:=StrToFloat(
end;
//Вывод ключевых
for i:=2 to REshenie.ColCount do
begin
Q_str.Cells[i-2,0]:=
end;
Label10.Caption:=FloatToStr(
//Добавление новой строки
REshenie.RowCount:=REshenie.
//перенос оценок на последнюю строку
for i:=2 to REshenie.ColCount do
begin
REshenie.Cells[i,REshenie.
REshenie.Cells[i,REshenie.
end;
REshenie.Cells[1,REshenie.
REshenie.Cells[0,REshenie.