Скачал, но половину из этого кода не понимаю.
Код:
procedure TMainForm.N6Click(Sender: TObject);
var
SimplexTable,SimplexTableNew:array of array of extended;
GoalFun:array of extended;
ArtFun:array of extended;
ExtrEstimation:extended;
k,i,j,MoreCount,LessCount,EquallyCount,extrItem,WLine,IterCount: integer;
Art,bil:boolean;
label fin,up; //Название ссылок
begin
Art:=true;
bil:=false;
IterCount:=0;
SimplexTable:=nil;
MoreCount:=0; LessCount:=0; EquallyCount:=0;
//Сортировка ограничений: 1) >=; 2) =; 3) <=.
//Порождение начального базиса.
//итерационное построение симплекс-таблиц
{1}//---------------------------------------------------------------------------
//сортировка «больше»
with MainForm.ActiveMDIChild as TChildForm do
begin
//строки в таблицах дочернего окна нумеруются с 1
//нулевая строка резервная
for i:=1 to SignsChild.RowCount-1 do
begin
if (SignsChild.Cells[0,i]='>') or (SignsChild.Cells[0,i]='>=') then
begin
inc(MoreCount);
SetLength(SimplexTable,LimChild.ColCount+2,MoreCount);
//коэффиценты
for j:=0 to LimChild.ColCount-1 do
SimplexTable[j+2,MoreCount-1]:=StrToFloat(LimChild.cells[j,i]);
// пока 0 (потом базис…)
SimplexTable[0,MoreCount-1]:=0;
//Значение (в i-ый)
SimplexTable[1,MoreCount-1]:=StrToFloat(BChild.cells[0,i]);
end;
end;
{2}//---------------------------------------------------------------------------
//Порождение начального базиса
//Добавить коэффицент -1 (>=)
for j:=0 to MoreCount-1 do
begin Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);
for i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do
SimplexTable[i,j]:=0;
SimplexTable[length(SimplexTable)-1,j]:=-1;
end;
//Добавить коэффицент 1 (<=)
for j:=MoreCount+EquallyCount to MoreCount+EquallyCount+LessCount-1 do
begin Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);
for i:=length(SimplexTable)-LessCount+2 to length(SimplexTable)-1 do
SimplexTable[i,j]:=0;
SimplexTable[length(SimplexTable)-1,j]:=1;
end;
//Добавить искуственный коэффицент (>= и =)
for j:=0 to MoreCount+EquallyCount-1 do
begin Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);
for i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do
SimplexTable[i,j]:=0;
SimplexTable[length(SimplexTable)-1,j]:=1;
end;
//целевая функция GoalFun
GoalFun:=nil;
with MainForm.ActiveMDIChild as TChildForm do
begin
SetLength(GoalFun,GoalChild.ColCount+1);
for i:=1 to GoalChild.ColCount do
begin
if parametersForm.Min.Checked then GoalFun[i]:=StrToFloat(goalChild.Cells[i-1,1])
else GoalFun[i]:=-1*StrToFloat(goalChild.Cells[i-1,1]);
end;
end;
//Искуственная функция ArtFun
ArtFun:=nil;
SetLength(ArtFun,length(SimplexTable)-1-MoreCount);
//i=1 – Значение исключаемой функции
for i:=1 to length(SimplexTable)-3 do
for j:=0 to MoreCount-1 do ArtFun[i-1]:=ArtFun[i-1]-SimplexTable[i,j];
//------------------------------------------------------------------------------
//Минимизация искусственной функции
//Базис
if MoreCount>0 then
begin
for j:=0 to MoreCount-1 do
SimplexTable[0,j]:=length(simplexTable)-MoreCount+j-1;
for i:=MoreCount to length(simplexTable[0])-1 do
SimplexTable[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+(i-MoreCount)-1;
end
else
for i:=0 to LessCount+EquallyCount-1 do
SimplexTable[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+i-1;
//2 нижние строки оценок
SetLength(SimplexTable,length(SimplexTable),length(SimplexTable[0])+2);
for i:=0 to length(GoalFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-2]:=goalFun[i];
for i:=0 to length(ArtFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-1]:=ArtFun[i];
SimplexTableNew:=nil;
SetLength(SimplexTableNew,length(SimplexTable),length(SimplexTable[0]));
//итерации…
k:=0;
if art then
for i:=2 to length(simplexTable)-1 do
begin
if simplexTable[i,length(SimplexTable[0])-1]<0 then
begin
for j:=0 to length(SimplexTable[0])-3 do
if simplexTable[i,j]<=0 then inc(k);
if k=length(SimplexTable[0])-2 then
begin
with MainForm.ActiveMDIChild as TChildForm do
begin
task.Items.Add('');
task.Items.Add(‘Невозможно найти начальный базис’);
exit;
end;
k:=0;
end;
end;
end;
k:=0;
if not art then
for i:=2 to length(simplexTable)-1 do
begin
if simplexTable[i,length(SimplexTable[0])-1]<0 then
begin
for j:=0 to length(SimplexTable[0])-2 do
if simplexTable[i,j]<=0 then inc(k);
if k=length(SimplexTable[0])-1 then
begin
with MainForm.ActiveMDIChild as TChildForm do
begin
task.Items.Add('');
task.Items.Add(‘Целевая функция не ограничена’);
exit;
end;
end;
end;
end;
//Поиск первой минимальных из отрицательных оценки искуственной функции
ExtrEstimation:=100000;
extrItem:=0;
for i:=2 to length(simplexTable)-1 do
if (SimplexTable[i,length(SimplexTable[0])-1]<ExtrEstimation) and (SimplexTable[i,length(SimplexTable[0])-1]<0) then
begin
extrItem:=i-1;{Новый базис}
ExtrEstimation:=SimplexTable[i,length(SimplexTable[0])-1];
end;
if ExtrEstimation=100000 then goto fin;
//Новый базис
for i:=0 to length(SimplexTable[0])-1 do SimplexTableNew[0,i]:=SimplexTable[0,i];
SimplexTableNew[0,WLine]:=extrItem;
//Перерасчет рабочей строки
for i:=1 to length(SimplexTable)-1 do SimplexTableNew[i,WLine]:=SimplexTable[I,wlINE]/SimplexTable[extrItem+1,wlINE];
Листинг 8-Поиск первой минимального из положительных
//Перерасчет коэффицентов
for i:=1 to length(SimplexTable)-1 do
for j:=0 to length(SimplexTable[0])-1 do
if j<>WLine then
SimplexTableNew[i,j]:=SimplexTable[i,j]-SimplexTable[i,Wline]*SimplexTable[extrItem+1,j]/SimplexTable[extrItem+1,WLine];
//Копирование таблиц
for i:=0 to length(SimplexTable)-1 do for j:=0 to length(SimplexTable[0])-1 do SimplexTable[i,j]:=SimplexTableNew[i,j];
//Вывод решения
if ParametersForm.CheckBox1.Checked then begin
bil:=false;
if not art then
with MainForm.ActiveMDIChild as TChildForm do
begin
task.Items.Add('');
task.Items.Add('Итерация '+InttoStr(IterCount));
for i:=0 to GoalChild.ColCount-1 do
begin
for j:=0 to length(SimplexTable[0])-1 do
if i+1=SimplexTable[0,j] then
begin
task.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));
bil:=true;
end;
if not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');
bil:=false;
end;
end;
end;
until false;
fin:
if art then
begin
art:=false;
SetLength(SimplexTable,Length(SimplexTable)-MoreCount,Length(SimplexTable[0])-1);
goto up;
end;
//результат
with MainForm.ActiveMDIChild as TChildForm do
begin
task.Items.Add('');
task.Items.Add('Результат');
for i:=0 to GoalChild.ColCount-1 do
begin
for j:=0 to length(SimplexTable[0])-1 do
if i+1=SimplexTable[0,j] then
begin
task.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));
bil:=true;
end;
if not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');
bil:=false;
end;
task.Items.Add('');
if parametersForm.Min.Checked then
task.Items.Add(‘Минимальное значение функции '+FloatToStr(-1*(SimplexTable[1,length(SimplexTable[0])-1])))
else
task.Items.Add(' Максимальное значение функции '+FloatToStr(SimplexTable[1,length(SimplexTable[0])-1]));
end;
end;