Сравнение различных методов расчета ПДВ для реального предприятия
begin
f := (Basis[i] = num);
inc(i);
end;
if (f) then
Result := i-1
else
Result := -1;
end;
function TSimplex.SimplexStep: integer;
var
i,j : integer;
f,opt : boolean;
x,y : integer; //координаты опорного элемента
CurMax : extended;
temp : array of TConstrain;
tempC : TExtArray;
begin
opt := true;
CurMax := -1;
for i := 0 to N-1 do
begin
//проверка на разрешимость
if (C[i] > 0) then
begin
opt := false; //а это попутная проверка на оптимальность
if (C[i] > CurMax) then //а это поиск ведущего столбца (максимальный элемент в C[i])
begin
CurMax := C[i];
x := i;
end;
f := true;
for j := 0 to M-1 do
f := f and (Cons[j].A[i] < 0);
if (f) then
begin
Result := SIMPLEX_NO_BOTTOM;
exit;
end;
end;
end;
if (opt) then
Result := SIMPLEX_DONE
else
begin
//зная номер ведущего столбца, ищем номер ведущей строки
CurMax := MaxExtended; //на самом деле тут будем искать минимум, а не Max
for j := 0 to M-1 do
if (Cons[j].A[x] > 0) then //идем только по положительным элементам
if (Cons[j].B/Cons[j].A[x] < CurMax) then
begin
CurMax := Cons[j].B/Cons[j].A[x];
y := j;
end
else if (DoPrec(Cons[j].B/Cons[j].A[x] - CurMax) = 0) then
if (Cons[j].isT) then
y := j;
//сохраняем текущие значения
SetLength(temp, M);
for j := 0 to M-1 do
begin
SetLength(temp[j].A, N);
for i := 0 to N-1 do
temp[j].A[i] := Cons[j].A[i];
temp[j].B := Cons[j].B;
end;
SetLength(tempC, N);
for i := 0 to N-1 do
tempC[i] := C[i];
//делаем пересчет таблицы
//строка делиться на ведущий элемент
MulString(y, 1/Cons[y].A[x]);
//преобразование остальных элементов
for j := 0 to M-1 do
begin
if (j <> y) then
begin
for i := 0 to N-1 do
begin
Cons[j].A[i] := DoPrec(temp[j].A[i] - temp[j].A[x]*temp[y].A[i]/temp[y].A[x]);
end;
Cons[j].B := DoPrec(temp[j].B - temp[j].A[x]*temp[y].B/temp[y].A[x]);
end
else
begin
for i := 0 to N-1 do
Cons[j].A[i] := DoPrec(Cons[j].A[i]);
end;
end;
//и строка с коэффициентами функции
for i := 0 to N-1 do
begin
C[i] := DoPrec(tempC[i] - tempC[x]*temp[y].A[i]/temp[y].A[x]);
end;
Basis[y] := x;
//и сама функция:
L := DoPrec(L - tempC[x]*temp[y].B/temp[y].A[x]);
for i:= 0 to M-1 do
SetLength(temp[i].A, 0);
SetLength(temp, 0);
SetLength(tempC, 0);
Result := SIMPLEX_NEXT_STEP;
end;
end;
function TSimplex.Solve: integer;
var
i,j : integer;
Simplex : TSimplex;
f : boolean;
Step : integer;
cc : extended;
begin
//oldN := N;
NormaliCe;
f:=false;
if (not CheckBasis) then begin
Simplex:=TSimplex.CreateBasis(self);
Simplex.Solve;
f:=Simplex.GetMin<>0;
if (not f) then for i:=0 to M-1 do begin
for j:=0 to N-1 do Cons[i].A[j]:=Simplex.Cons[i].A[j];
Cons[i].B:=Simplex.Cons[i].B;
Cons[i].isT := false;
Basis[i]:=Simplex.Basis[i];
cc := C[Basis[i]];
for j:=0 to N-1 do
C[j] := DoPrec(C[j] - cc*Cons[i].A[j]);
L := DoPrec(L - cc*Cons[i].B);
Экологические заметки
Распространение мелких млекопитающих в Пензенской области
В настоящее время в российской териологии этап фаунистических
исследований, т.е. установление видового состава и границ ареалов, можно
считать в целом завершившимся. Однако для нек ...
Экологическая культура общества
Экологическая культура –
это уровень восприятия людьми природы, окружающего мира и оценка своего
положения во вселенной, отношение человека к миру. Здесь необходимо сразу
прояснит ...
Экологическая сертификация продукции
Экология - это наука о взаимоотношении организма с окружающей средой.
Объектом экологических исследований является, в том числе человек. При этом
человека обычно изучают, прежде ...