count:=count+1;
inc:=inc+1;
NumOfNewVars:=NumOfNewVars+1;
end;
end;
end;
//код ниже реализует поиск искусственной переменной находящейся максимально близко к правому нижнему углу единичной матрицы
maxEl:=newBase[1];
for i:=2 to mm do
if (newBase[i]>newBase[i-1]) then
maxEl:=newBase[i];
if maxel<Base[nn] then
maxel:=Base[nn];
//если единичная матрица неполная, то добавляются дополнительные переменные
if maxel<mm then
begin
ncols:=mm-maxel;
inc:=1;
for i:=count to ncols+count-1 do
begin
newBase[i]:=maxel+inc;
inc:=inc+1;
NumOfNewVars:=NumOfNewVars+1;
end;
end;
//запись вектора содержащего базисные переменные
for i:=1 to nn do
full[i]:=Basis[i];
j:=1;
for i:=nn+1 to nn+mm do
begin
full[i]:=newBase[j];
j:=j+1;
end;
AddVars:=full;
end;
{------------------------------------------------------------------}
function ArtificialVars(Fkoef: TFirstKoef):Simplex; //реализацияметодаискусственныхпеременных
var
i,j,mm,nn,p,q:integer;
Basis : TE;
Simp: Simplex;
begin
p:=strtoint(Form1.Edit1.Text);
q:=strtoint(Form1.Edit3.Text);
mm:=2*(Form1.TrackBar1.Position-1);
nn:=2*(Form1.TrackBar1.Position-1)+(Form1.TrackBar1.Position-2-p)+(Form1.TrackBar1.Position-2-q)+1;
for i:=1 to nn do
Basis[i]:=0;
for j:=1 to nn do //
for i:=1 to mm do //перебор начальной матрицы коэфицентов по столбцам сверху вниз
begin;
Simp[i,j]:=Fkoef[i,j];
if Fkoef[i,j]=1 then //если в столбце есть еденица
if nullcheck(j,Fkoef) then //проверка является ли данный столбец базисным
Basis[j]:=i;
end;
fullBasis:=AddVars(Basis); //вызов функции для добавления искусственных столбцов чтобы получить базисное решение
for j:=1 to NumOfNewVars do
for i:=1 to mm do
if i=fullBasis[nn+j] then
Simp[i,nn+j]:=1
else
Simp[i,nn+j]:=0;
ArtificialVars:=Simp;
end;
{------------------------------------------------------------------}
function TForm1.SelectCol(fullSimp: FullSimplex):integer;
var
j,mm,nn,p,q,napravCol:integer;
maxdelt:real;
begin
p:=strtoint(Form1.Edit1.Text);
q:=strtoint(Form1.Edit3.Text);
nn:=2*(Form1.TrackBar1.Position-1)+(Form1.TrackBar1.Position-2-p)+(Form1.TrackBar1.Position-2-q);
mm:=2*(Form1.TrackBar1.Position-1);
maxdelt:=fullSimp[mm+2,4];
for j:=5 to nn+3+Numofnewvars do
if fullSimp[mm+2,j]>maxdelt then
begin
maxdelt:=fullSimp[mm+2,j];
napravCol:=j;
end;
if maxdelt>0 then
SelectCol:=napravCol
else
SelectCol:=-1;
end;
{------------------------------------------------------------------}
function SelectRow(fullSimp: FullSimplex; Col: integer):integer;
var
i,mm,napravRow:integer;
minel,tmp:real;
begin
mm:=2*(Form1.TrackBar1.Position-1);
tmp:=1000;
for i:=2 to mm+1 do
if fullSimp[i,Col]>0 then
begin
minel:=tmp;
tmp:=fullSimp[i,3]/fullSimp[i,Col];
if tmp<minel then
begin
minel:=tmp;
napravRow:=i;
end;
end;
SelectRow:=napravRow;
end;
{------------------------------------------------------------------}
function Delta(fullSimp: FullSimplex;j: integer):real;
var
i,mm:integer;
delt: real;
begin
delt:=0;
mm:=2*(Form1.TrackBar1.Position-1);
for i:=2 to mm do
delt:=delt+fullSimp[i,j] * fullSimp[i,1];
Delta:=delt-fullSimp[1,j];
end;
{------------------------------------------------------------------}
function TForm1.NewTable(fullSimp: FullSimplex; TarFunc: TTarFunc):FullSimplex;
var
p,q,mm,nn,NapravCol,NapravRow,i,j: integer;
NapravEl:real;
NewTab: FullSimplex;
err: boolean;
begin
p:=strtoint(Form1.Edit1.Text);
q:=strtoint(Form1.Edit3.Text);
nn:=2*(Form1.TrackBar1.Position-1)+(Form1.TrackBar1.Position-2-p)+(Form1.TrackBar1.Position-2-q);
mm:=2*(Form1.TrackBar1.Position-1);
NapravCol:=SelectCol(fullSimp);
NapravRow:=SelectRow(fullSimp,NapravCol);
NapravEl:=fullSimp[NapravRow,NapravCol];
for j:=4 to nn+Numofnewvars+3 do
NewTab[1,j]:=TarFunc[j-3];
for j:=1 to 2 do
for i:=1 to mm+1 do
NewTab[i,j]:=fullSimp[i,j];
NewTab[NapravRow,1]:=TarFunc[NapravCol-3];
NewTab[NapravRow,2]:=NapravCol-3;
for j:=3 to nn+Numofnewvars+3 do
NewTab[NapravRow,j]:=fullSimp[NapravRow,j]/NapravEl;
for i:=2 to mm+2 do
for j:=3 to nn+3+Numofnewvars do
if i<>NapravRow then
NewTab[i,j]:=fullSimp[i,j]-NewTab[NapravRow,j]* fullSimp[i,NapravCol];
Err:=false;
for j:=3 to nn+3+Numofnewvars do
if (NewTab[mm+2,j]<>Delta(NewTab,j)) and (not Err) then
begin
err:=true;
NewTab[1,1]:=-1;
end;
NewTable:=NewTab;
end;
{------------------------------------------------------------------}
function SimplexTables(Simp: Simplex):FullSimplex;
var
FS: FullSimplex;
i,j,p,q,mm,nn,a,b,c,k,basecount, iterCnt: integer;
err: boolean;
begin
p:=strtoint(Form1.Edit1.Text);
q:=strtoint(Form1.Edit3.Text);
nn:=2*(Form1.TrackBar1.Position-1)+(Form1.TrackBar1.Position-2-p)+(Form1.TrackBar1.Position-2-q);
mm:=2*(Form1.TrackBar1.Position-1);
a:= strtoint(Form1.Edit5.Text);
b:= strtoint(Form1.Edit2.Text);
c:= strtoint(Form1.Edit4.Text);
for i:=1 to Form1.TrackBar1.Position-1 do
TarFunc[i]:=a;
for i:=Form1.TrackBar1.Position to 2*Form1.TrackBar1.Position-3-p do
TarFunc[i]:=b;
for i:=2*Form1.TrackBar1.Position-2-p to 3*Form1.TrackBar1.Position-5-p-q do
TarFunc[i]:=c;
for i:=3*Form1.TrackBar1.Position-4-p-q to 4*Form1.TrackBar1.Position-6-p-q do
TarFunc[i]:=0;
for i:=4*Form1.TrackBar1.Position-5-p-q to 4*Form1.TrackBar1.Position-6-p-q+ NumOfNewVars do
TarFunc[i]:=1000;
basecount:=0;
for i:=1 to mm+2 do
begin
for j:=1 to nn+NumOfNewVars+3 do
begin
if j>3 then
FS[1,j]:=Tarfunc[j-3];
if i>1 then
for k:=1 to m+n do
if fullBasis[k]=basecount then
begin
FS[i,1]:=tarFunc[k-1];
FS[i,2]:=k-1;
end;
if (i>1) and (j>2) then
FS[i,j]:=Simp[i-1,j-2];
end;
basecount:=basecount+1;
end;
for j:=3 to nn+3+Numofnewvars do
FS[mm+2,j]:=Delta(FS,j);
err:=false;
iterCnt:=0;
EngFull:=FS;
repeat
FS:=form1.NewTable(FS,TarFunc);
if FS[1,1]=-1 then
err:=true;
if iterCnt>1000 then
err:=true;
iterCnt:=iterCnt+1;
until (form1.SelectCol(FS)=-1) or (err);
for i:=2 to m+1 do
if (fs[i,1]=1000) then
err:=true;
if err then
begin
MessageDlg('При заданных условиях задача неразрешима!', mtError, [mbAbort],0 );
form1.n3.Enabled:=false;
form1.n6.Enabled:=false;
end;
SimplexTables:=FS;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Task;
end;
procedure Tform1.Task;
var
i,j,p,q,inc,cntx,k,cnt,holiday: integer;
sklad: real;
Matr: TFirstKoef;
Tools: array[1..8] of integer;
NewTools: array[1..7] of integer;
Simp: Simplex;
Fsimp: fullsimplex;
begin
Tools[1]:=strtoint(Edit6.Text);
Tools[2]:=strtoint(Edit7.Text);
Tools[3]:=strtoint(Edit8.Text);
Tools[4]:=strtoint(Edit9.Text);
Tools[5]:=strtoint(Edit10.Text);
Tools[6]:=strtoint(Edit11.Text);
Tools[7]:=strtoint(Edit12.Text);
Tools[8]:=strtoint(Edit13.Text);
inc:=0;
for i:=1 to 8 do
if Tools[i]=0 then
holiday:=i;
for i:=1 to 7 do
if Tools[i]<>0 then
NewTools[i]:=Tools[i+inc]
else
begin
inc:=1;
NewTools[i]:=Tools[i+inc]
end;
p:=strtoint(Edit1.Text);
q:=strtoint(Edit3.Text);
cntx:=2;
for i:=1 to TrackBar1.Position-1 do
begin
Matr[i,1]:=newTools[i];
if i-1>=0 then
begin
Matr[i,cntx]:=1;
cntx:=cntx+1;
end;
end;
for i:=1 to TrackBar1.Position-1 do
begin
if i-p-1>0 then
begin
Matr[i,cntx]:=1;
cntx:=cntx+1;
end;
end;
for i:=1 to TrackBar1.Position-1 do
begin
if i-q-1>0 then
begin
Matr[i,cntx]:=1;
cntx:=cntx+1;
end;
end;
cntx:=TrackBar1.Position+1;
for i:=TrackBar1.Position to 2*(TrackBar1.Position-1) do
begin
Matr[i,1]:=newTools[i-(TrackBar1.Position-1)];
if TrackBar1.Position-2-p >= i-(TrackBar1.Position-1) then
begin
Matr[i,cntx]:=1;
cntx:=cntx+1;
end;
end;
for i:=TrackBar1.Position to 2*(TrackBar1.Position-1) do
if TrackBar1.Position-2-q >= i-(TrackBar1.Position-1) then
begin
Matr[i,cntx]:=1;
cntx:=cntx+1;
end;
for i:=TrackBar1.Position to 2*(TrackBar1.Position-1) do
begin
Matr[i,cntx]:=1;
if i>TrackBar1.Position then
Matr[i,cntx-1]:=-1;
cntx:=cntx+1;
end;
Simp:=ArtificialVars(Matr);
fSimp:=SimplexTables(simp);
if fsimp[1,1]<>-1 then
begin
for i:=1 to StringGrid1.RowCount do
for j:=1 to StringGrid1.ColCount do
begin
StringGrid1.Cells[j,i]:='';
StringGrid1.Cells[0,i]:='День '+floattostr(i);
StringGrid2.Cells[j,i]:='';
StringGrid2.Cells[0,i]:='День '+floattostr(i);
end;
for j:=1 to 3 do
begin
StringGrid1.Cells[j,holiday]:=' Выходной';
StringGrid2.Cells[j,holiday]:=' Выходной';
end;
cnt:=0;
For i:=1 to TrackBar1.Position-1 do
for j:=2 to 4*Form1.TrackBar1.Position-6-p-q do
if (matr[i,j]=1) then
for k:=2 to 2*TrackBar1.Position-1 do
if (fsimp[k,2]=j-1) then
begin
if i=holiday then
cnt:=1;
if j-1<=TrackBar1.Position-1 then
StringGrid1.Cells[1,i+cnt]:=' '+floattostr(fsimp[k,3]);
if (j-1>TrackBar1.Position-1) and (j-1<=2*Form1.TrackBar1.Position-3-p) then
StringGrid1.Cells[2,i+cnt]:=' '+floattostr(fsimp[k,3]);
if (j-1>2*Form1.TrackBar1.Position-3-p) and (j-1<=3*Form1.TrackBar1.Position-4-p-q) then
StringGrid1.Cells[3,i+cnt]:=' '+floattostr(fsimp[k,3]);
end;
for i:=1 to StringGrid1.RowCount do
for j:=1 to StringGrid1.ColCount do
begin
if (StringGrid1.Cells[2,i]<>'') and (i<>holiday) then
if (i>=holiday) and (i-p-1<=holiday) then
StringGrid2.Cells[2,i-p-2]:=StringGrid1.Cells[2,i]
else
StringGrid2.Cells[2,i-p-1]:=StringGrid1.Cells[2,i];
if (StringGrid1.Cells[3,i]<>'') and (i<>holiday) then
if (i>=holiday) and (i-q-1<=holiday) then
StringGrid2.Cells[3,i-q-2]:=StringGrid1.Cells[3,i]
else
StringGrid2.Cells[3,i-q-1]:=StringGrid1.Cells[3,i];
end;
sklad:=0;
for i:=1 to StringGrid2.RowCount-1 do
begin
if (StringGrid2.Cells[2,i]<>'') and (i<>holiday) then
StringGrid2.Cells[1,i]:=' '+floattostr(tools[i]
strtofloat(StringGrid2.Cells[2,i]));
if (StringGrid2.Cells[3,i]<>'') and (i<>holiday) then
StringGrid2.Cells[1,i]:=' '+floattostr(tools[i]- strtofloat(StringGrid2.Cells[3,i]));
if (StringGrid2.Cells[3,i]<>'') and (i<>holiday) and (StringGrid2.Cells[2,i]<>'') then
StringGrid2.Cells[1,i]:=' '+floattostr(tools[i]-strtofloat(StringGrid2.Cells[3,i])-strtofloat(StringGrid2.Cells[2,i]));
if (i<>holiday) and (StringGrid2.Cells[3,i]='') and (StringGrid2.Cells[2,i]='') then
StringGrid2.Cells[1,i]:=' '+floattostr(tools[i]);
if (i<>holiday) then
sklad:=sklad+strtofloat(StringGrid2.Cells[1,i]);
end;
for i:=1 to StringGrid1.RowCount do
for j:=1 to StringGrid1.ColCount do
begin
if (StringGrid1.Cells[j,i]='') or (StringGrid1.Cells[j,i]=' 0') then
StringGrid1.Cells[j,i]:=' - ';
if (StringGrid2.Cells[j,i]='') or (StringGrid2.Cells[j,i]=' 0') then
StringGrid2.Cells[j,i]:=' - ';
end;
Label20.Caption:='Суммарныезатраты: '+floattostr(fsimp[2*(TrackBar1.Position-1)+2,3])+' у.е.';
Label21.Caption:='Инструментовнаскладе: '+ floattostr(sklad)+' шт.';
N6.Enabled:=true;
n3.Enabled:=true;
end;
end;
Процессор: Pentium I или аналогичный AMD 400 MHz и выше
ОЗУ: 64 Мб и более
ОС: Windows 98, 2000, ХР
Данная программа предназначена для расчета графика ремонта и покупки инструмента, чтобы при минимальных издержках обеспечить предприятие инструментом в течении 6,7 или 8 последовательных дней. Входными данными для программы являются: стоимость покупки нового инструмента (5,6,7 у.е.), срок и цена обычного ремонта ( 2, 3, 4 дня за 1, 2, 3 у.е соответственно), срок и цена срочного ремонта ( 1, 2, 3 дня за 3, 4, 5 у.е соответственно), а также количество инструментов, требуемых утром каждого дня (от 15 до 45 инструментов) и номер выходного дня, в которые как производство так и ремонтные службы не работают.
В результате работы программы будет составлен график оптимального ремонта и покупки инструмента, представленный в виде двух таблиц (утро и вечер каждого дня).
В программе присутствует "Инженерный" режим работы, с помощью которого можно просмотреть этапы вычисления задачи. Этот режим предназначен для специалистов.
Данные, для которых разрабатывалась данная программа, введены по умолчанию. Поэтому для расчета графика на основе этих данных достаточно нажать на кнопку "Рассчитать".
Главное меню программы содержит пункты: "Файл", "Режим" и "Помощь".
В пункте "Файл" находятся подпункты "Открыть", "Сохранить" и "Выход".
"Открыть" - служит для открытия файлов формата mbs. Используется для открытия файлов с сохраненными результатами расчетов в данной программе.
"Сохранить" - служит для сохранения файлов в формате mbs. Используется для сохранения результатов расчетов в файл.
"Выход" - закрывает программу без сохранения результатов.
В пункте "Режим" находятся подпункты "Пользовательский" и "Инженерный".