Решение транспортных задач венгерским методом

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



{

if(Cep[nomer][i][Stol[stol-1]]==3)

Cep[nomer][i][Stol[stol-1]]=12; //крест

else

Cep[nomer][i][Stol[stol-1]]=4; //вертикально

}

}

}

}

else //если новый 0* ниже 0'

{

if (Stol[stol-2]<Stol[stol-1])//если старый 0* левее 0'

{

Cep[nomer][Str[str-1]][Stol[stol-1]]=6;//слева вниз

for(int i=Str[str-1]+1;i<Str[str];i++)

{

if(Cep[nomer][i][Stol[stol-1]]==3)

Cep[nomer][i][Stol[stol-1]]=12; //крест

else

Cep[nomer][i][Stol[stol-1]]=4; //вертикально

}

}

{

if (Stol[stol-2]>Stol[stol-1])//если старый 0* правее 0'

{

Cep[nomer][Str[str-1]][Stol[stol-1]]=7;//справа вниз

for(int i=Str[str-1]+1;i<Str[str];i++)

{

if(Cep[nomer][i][Stol[stol-1]]==3)

Cep[nomer][i][Stol[stol-1]]=12; //крест

else

Cep[nomer][i][Stol[stol-1]]=4; //вертикально

}

}

else //если начало цепочки

{

for(int i=Str[str-1];i<Str[str];i++)

{

if(Cep[nomer][i][Stol[stol-1]]==3)

[nomer][i][Stol[stol-1]]=12; //крест

else

Cep[nomer][i][Stol[stol-1]]=4; //вертикально

}

}

}

}

str++;

Q[v]=X[i][Stol[stol-1]];

v++;

break;

}

}

if(stroka==-1)

{

Q[v]=P[Stol[stol-1]];

v++;

break;

}

for(int j=0;j<Cm;j++)

{

if(N[Str[str-1]][j]==3)//если сущ. 0'

{

Stol[stol]=j;

if(Stol[stol]<Stol[stol-1])//если новый 0' левее 0*

{

if (Str[str-2]<Str[str-1]) //если старый 0' выше 0*

{

Cep[nomer][Str[str-1]][Stol[stol-1]]=2;//сверху влево

for(int i=Stol[stol]+1;i<Stol[stol-1];i++)

{

if(Cep[nomer][Str[str-1]][i]==4)

Cep[nomer][Str[str-1]][i]=12;//крест

else

Cep[nomer][Str[str-1]][i]=3;//горизонталь

}

Cep[nomer][Str[str-1]][Stol[stol]]=9;//стрела влево

}

else //если старый 0' ниже 0*

{

Cep[nomer][Str[str-1]][Stol[stol-1]]=6;//снизу влево

for(int i=Stol[stol]+1;i<Stol[stol-1];i++)

{

if(Cep[nomer][Str[str-1]][i]==4)

Cep[nomer][Str[str-1]][i]=12;//крест

else

Cep[nomer][Str[str-1]][i]=3;//горизонталь

}

Cep[nomer][Str[str-1]][Stol[stol]]=9;

}

}

else //если новый 0' правее 0*

{

if (Str[str-2]<Str[str-1])//если старый 0' выше 0*

{

Cep[nomer][Str[str-1]][Stol[stol-1]]=5;//слева вниз

for(int i=Stol[stol-1]+1;i<Stol[stol];i++)

{

if(Cep[nomer][Str[str-1]][i]==4)

Cep[nomer][Str[str-1]][i]=12;//крест

else

Cep[nomer][Str[str-1]][i]=3;//горизонталь

}

Cep[nomer][Str[str-1]][Stol[stol]]=1;

}

else //если старый 0' ниже 0*

{

Cep[nomer][Str[str-1]][Stol[stol-1]]=7;//снизу вправо

for(int i=Stol[stol-1]+1;i<Stol[stol];i++)

{

if(Cep[nomer][Str[str-1]][i]==4)

Cep[nomer][Str[str-1]][i]=12;//крест

else

Cep[nomer][Str[str-1]][i]=3;//горизонталь

}

Cep[nomer][Str[str-1]][Stol[stol]]=1;

}

}

stol++;

Q[v]=D[Str[str-1]][j]-X[Str[str-1]][j];

v++;

break;

}

}

stroka=-1;

}

nomer++;

//Создание новой вкладки

NewTab();

int min=Q[0];

for(int i=1;i<v;i++)

{

if(Q[i]<min)

min=Q[i];

}

str--;

stol--;

X[Str[str]][Stol[stol]]+=min;

P[Stol[stol]]-=min;

while(1)

{

if(str==0)

{

Z[Str[str]]-=min;

break;

}

stol--;

X[Str[str]][Stol[stol]]-=min;

str--;

X[Str[str]][Stol[stol]]+=min;

}

OPrz=0;

OPtr=0;

for(int i=0;i<Zn;i++)

OPrz+=Z[i];

for(int i=0;i<Pm;i++)

OPtr+=P[i];

delete []G;

G=NULL;

delete []F;

F=NULL;

delete []Q;

Q=NULL;

delete []Str;

Str=NULL;

delete []Stol;

Stol=NULL;

}

//!!!

MessageDlg(L"Задача оптимизированa.", mtConfirmation,

TMsgDlgButtons() << mbOK, 0);

//Заполнения таблицы издержек

Izderg->RowCount=Cn;

Izderg->ColCount=Cm;

for(int i=0;i<Cn;i++)

{

for(int j=0;j<Cm;j++)

{

switch (N[i][j])

{

case 4:

Izderg->Cells[j][i]="0*";

break;

case 3:

Izderg->Cells[j][i]="0'";

break;

case 2:

Izderg->Cells[j][i]=L'\u022a';

break;

case 1:

Izderg->Cells[j][i]=L'\u0230';

break;

case 0:

Izderg->Cells[j][i]="0";

case -1:

Izderg->Cells[j][i]=FormatFloat("",C[i][j]/100.0);

break;

}

}

}

//Заполнения таблицы опорного плана

Plan->RowCount=Xn;

Plan->ColCount=Xm;

for(int i=0;i<Xn;i++)

{

for(int j=0;j<Xm;j++)

{

if(X[i][j]==0)

Plan->Cells[j][i]="";

else

Plan->Cells[j][i]=FormatFloat("",X[i][j]/100.0);

}

}

L=0;

Lstr="L=";

for(int i=0;i<Cn;i++)

{

for(int j=0;j<Cm;j++)

{

if(X[i][j]>0)

{

L+=X[i][j]*C0[i][j];

Lstr+=FormatFloat("",C0[i][j]/100.0)+"*"+FormatFloat("",X[i][j]/100.0)+"+";

}

}

}

Lstr.Delete(Lstr.Length(),1);

Lstr+="="+FormatFloat("",L/10000.0);

Edit2->Text=Lstr;

//Освобождение памяти

delete []C;

C=NULL;

delete []P;

P=NULL;

delete []Z;

Z=NULL;

delete []D;

D=NULL;

delete []X;

X=NULL;

delete []N;

N=NULL;

}__fastcall TForm1::NOpenClick(TObject *Sender)

{

if(OpenDialog1->Execute())

{

MyFName=OpenDialog1->FileName;

Open(OpenDialog1->FileName);

}

}

//---------------------------------------------------------------------------__fastcall TForm1::NSaveAsClick(TObject *Sender)

{

SaveDialog1->FileName=MyFName;

if(SaveDialog1->Execute())

{

MyFName=SaveDialog1->FileName;

Save(SaveDialog1->FileName);

}

}

//---------------------------------------------------------------------------__fastcall TForm1::NSaveClick(TObject *Sender)

{

if(MyFName!="")

Save(MyFName);

else

if(SaveDialog1->Execute())

{

MyFName=SaveDialog1->FileName;

Save(SaveDialog1->FileName);

}

}

//---------------------------------------------------------------------------__fastcall TForm1::NNewClick(TObject *Sender)

{

Zapas->RowCount=8;

for(int i=1;iRowCount;i++)

{

Zapas->Cells[0][i]="";

}

StoimPer->ColCount=8;

StoimPer->RowCount=8;

for(int i=1;iRowCount;i++)

{

for(int j=1;jColCount;j++)

{

StoimPer->Cells[j][i]="";

}

}

Ogran->ColCount=8;

Ogran->RowCount=8;

Potr->ColCount=8;

for(int j=1;jColCount;j++)

{

Potr->Cells[j][0]="";

}

Edit2->Text="L=";

}

//---------------------------------------------------------------------------TForm1::Save(UnicodeString adr)

{

ofstream f(adr.t_str() ,ios::out);

for(int i=1;iRowCount;i++)

{

if(Zapas->Cells[0][i]=="")

{

f<<"0 ";

}

else

{

fCells[0][i].ToDouble()<<" ";

}

}

f<<"\n\n";

for(int i=1;iRowCount;i++)

{

for(int j=1;jColCount;j++)

{

if(StoimPer->Cells[j][i]=="")

{

f<<"0 ";

}

else

{

fCells[j][i].ToDouble()<<" ";

}

}

f<<"\n";

}

f<<"\n";

for(int i=0;iRowCount;i++)

{

for(int j=0;jColCount;j++)

{

if(Ogran->Cells[j][i]=="")

{

f<<"0 ";

}

else

{

fCells[j][i].ToDouble()<<" ";

}

}

f<<"\n";

}

f<<"\n";

for(int i=1;iColCount;i++)

{

if(Potr->Cells[i][0]=="")

{

f<<"0 ";

}

else

{

fCells[i][0