Автор работы: Пользователь скрыл имя, 23 Июня 2013 в 23:07, курсовая работа
Рассмотрим алгоритм решения задачи линейного целочисленного программирования этим методом.
Решаем задачу симплексным методом без учета условия целочисленности. Если все компоненты оптимального плана целые, то он является оптимальным и для задачи целочисленного программирования. Если обнаруживается неразрешимость задачи, то и неразрешима задача целочисленного программирования.
Если среди компонент оптимального решения есть нецелые, то к ограничениям задачи добавляем новое ограничение, обладающее следующими свойствами:
- оно должно быть линейным;
- должно отсекать найденный оптимальный нецелочисленный план;
- не должно отсекать ни одного целочисленного плана.
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.
Информация о работе Решение задач целочисленного программирования методом Гомори