⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transport.cpp

📁 source code for transportation method programming
💻 CPP
字号:

#include <stdio.h>
#include <math.h>

#define  NMAX  10


     double C[NMAX][NMAX], XM[NMAX][NMAX];
     double R[NMAX][NMAX];
     double DAO[NMAX], RAD[NMAX];

     int P[5][2*NMAX+5];

     int ID,IDES,IF1,IOPTIMAL,ISOU,IX,IY,LT,NR;
     double CC,CT,QT,TT,XINFCC;


void Init() {
  int I,J;
  printf("\n TRANSPORT MODEL\n\n");
  printf(" NUMBER OF SOURCES ? "); scanf("%d", &ISOU);
  printf("\n NUMBER OF DESTINATIONS ? "); scanf("%d", &IDES);
  printf("\n INPUT THE AVAILABLE SOURCE QUANTITIES:\n");
  for (I=1; I<=ISOU; I++) {
    printf("  SOURCE #%d ? ", I); scanf("%lf", &DAO[I]);
  }
  printf("\n INPUT THE REQUIRED DESTINATION QUANTITIES:\n");
  for (I=1; I<=IDES; I++) {
    printf("  DESTINATION #%d ? ", I); scanf("%lf", &RAD[I]);
  }
  printf("\n INPUT TRANSPORT COSTS MATRIX:\n");
  for (I=1; I<=ISOU; I++)
	for (J=1; J<=IDES; J++) {
      printf("  FROM SOURCE #%d TO DESTINATION #%d ? ", I, J);
      scanf("%lf", &C[I][J]);
    }
  printf("\n\n TRANSPORT MODEL\n");
}

  void Corner();
  void Optimal();
  void TCost();
  void Seek_Path(int I,int J);
  void Increase(int I,int J);

void SubMain() {  //STEPPING STONE ALGORITHM
  Corner();
  Optimal();
  TCost();
}

void Corner() {  //N-W CORNER
//Labels: e20, e50, e60
    int I,J;
    I=1; J=1;
e20:if (DAO[I]<=RAD[J]) goto e50;
    XM[I][J] += RAD[J]; DAO[I] -= RAD[J];
    RAD[J]=0; J++;
    goto e60;  //else
e50:XM[I][J] += DAO[I]; RAD[J] -= DAO[I];
    DAO[I]=0; I++;
e60:if (I<=ISOU && J<=IDES) goto e20;
}

void Optimal() {
//Labels: e10, e70, e140, e150
     int I,J;
e10: XINFCC=0.0;
     for (I=1; I<=ISOU; I++)
       for (J=1; J<=IDES; J++) {
         if (XM[I][J] != 0.0) goto e70;
         Seek_Path(I,J);
         Increase(I,J);
e70:;  }
	 if (XINFCC>=0.0) {
       IOPTIMAL=1;
       goto e150;
     }
     for (I=1; I<=LT; I++) {
       IX=P[3][I]; IY=P[4][I];
       if (I % 2 == 0) {
         XM[IX][IY] -= TT;
         goto e140;
       }
       XM[IX][IY] += TT;
e140:;}
e150:if (IOPTIMAL==0) goto e10;
}

void Seek_Path(int I, int J) {
//Labels: e70, e160, e260
     int I1,I2;
     for (I1=1; I1<=ISOU; I1++)
       for (I2=1; I2<=IDES; I2++)
         R[I1][I2]=XM[I1][I2];
     for (I1=1; I1<=ISOU; I1++) R[I1][0]=0.0;
     for (I2=1; I2<=IDES; I2++) R[0][I2]=0.0;
     R[I][J]=1.0;
e70: for (I2=1; I2<=IDES; I2++) {
       if (R[0][I2]==1.0) goto e160;
       NR=0;
       for (I1=1; I1<=ISOU; I1++)
         if (R[I1][I2] != 0.0) NR++;
	   if (NR!=1) goto e160;
       for (I1=1; I1<=ISOU; I1++) R[I1][I2]=0.0;
       R[0][I2]=1.0; IF1=1;
e160:;}
     for (I1=1; I1<=ISOU; I1++) {
       if (R[I1][0]==1.0) goto e260;
       NR=0;
       for (I2=1; I2<=IDES; I2++)
         if (R[I1][I2] != 0.0) NR++;
       if (NR!=1) goto e260;
       for (I2=1; I2<=IDES; I2++) R[I1][I2]=0.0;
       R[I1][0]=1.0; IF1=1;
e260:;}
     if (IF1==1) {
       IF1=0; goto e70;
     }
}

void Increase(int I, int J) {
//Labels: e20,e70,e130,e170,e180,e230
     int I1,I2;
     P[1][1]=I; P[2][1]=J; IX=I; IY=J; ID=1; CC=0.0; QT=999999.0;
e20: ID++; IF1=0;
	 for (I1=1; I1<=ISOU; I1++) {
       if (R[I1][IY]==0.0 || I1==IX) goto e70;
       P[1][ID]=I1; P[2][ID]=IY; IX=I1; CC -= C[IX][IY];
       IF1=1; I1=ISOU;
       if (XM[IX][IY] < QT && XM[IX][IY] > 0.0)  QT=XM[IX][IY];
e70:;}
     if (IF1==0) goto e170;
     ID++; IF1=0;
	 for (I2=1; I2<=IDES; I2++) {
       if (R[IX][I2]==0.0 || I2==IY) goto e130;
       P[1][ID]=IX; P[2][ID]=I2; IY=I2; CC += C[IX][IY];
       IF1=1; I2=IDES;
e130:;}
     if (IF1==0) goto e170;
     if (IX!=I || IY!=J) goto e20;
     goto e180;
e170:printf(" DEGENERATE SOLUTION !\n");
     return;
e180:if (CC>0.0 || CC>XINFCC) goto e230;
     TT=QT; XINFCC=CC; ID--; LT=ID;
     for (I1=1; I1<=ID; I1++) {
       P[3][I1]=P[1][I1]; P[4][I1]=P[2][I1];
     }
e230:;}

void TCost() {
    int I,J;
    CT=0.0;
    printf("\n TRANSPORTS:\n");
    for (I=1; I<=ISOU; I++)
      for (J=1; J<=IDES; J++) {
        CT += XM[I][J]*C[I][J];
        if (XM[I][J]==0.0) goto e10;
        printf("    FROM SOURCE #%d TO DESTINATION #%d: %8.2f\n", I, J, XM[I][J]);
e10:;}
    printf("\n TOTAL TRANSPORT COST: %10.1f\n\n", CT);
}


void main()  {
  Init();
  SubMain();
}

//end of file transpor.cpp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -