Смекни!
smekni.com

Задача составления оптимального графика ремонта инструмента (стр. 4 из 5)

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;


7. Руководство пользователя

7.1 Системные требования

Процессор: Pentium I или аналогичный AMD 400 MHz и выше

ОЗУ: 64 Мб и более

ОС: Windows 98, 2000, ХР

7.2 Описание возможностей

Данная программа предназначена для расчета графика ремонта и покупки инструмента, чтобы при минимальных издержках обеспечить предприятие инструментом в течении 6,7 или 8 последовательных дней. Входными данными для программы являются: стоимость покупки нового инструмента (5,6,7 у.е.), срок и цена обычного ремонта ( 2, 3, 4 дня за 1, 2, 3 у.е соответственно), срок и цена срочного ремонта ( 1, 2, 3 дня за 3, 4, 5 у.е соответственно), а также количество инструментов, требуемых утром каждого дня (от 15 до 45 инструментов) и номер выходного дня, в которые как производство так и ремонтные службы не работают.

В результате работы программы будет составлен график оптимального ремонта и покупки инструмента, представленный в виде двух таблиц (утро и вечер каждого дня).

В программе присутствует "Инженерный" режим работы, с помощью которого можно просмотреть этапы вычисления задачи. Этот режим предназначен для специалистов.

Данные, для которых разрабатывалась данная программа, введены по умолчанию. Поэтому для расчета графика на основе этих данных достаточно нажать на кнопку "Рассчитать".


7.3 Основное окно программы

7.4 Главное меню программы

Главное меню программы содержит пункты: "Файл", "Режим" и "Помощь".

В пункте "Файл" находятся подпункты "Открыть", "Сохранить" и "Выход".

"Открыть" - служит для открытия файлов формата mbs. Используется для открытия файлов с сохраненными результатами расчетов в данной программе.

"Сохранить" - служит для сохранения файлов в формате mbs. Используется для сохранения результатов расчетов в файл.

"Выход" - закрывает программу без сохранения результатов.

В пункте "Режим" находятся подпункты "Пользовательский" и "Инженерный".