Решение транспортных задач венгерским методом
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
{
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