表上作业法的源代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/* 表上作业法的源代码 */

#include ""

#include ""

#include ""

/* #define debug */

#define a(j) (*(C+(M-1)*N+j)) /*销量数组*/

#define b(i) (*(C+i*N+N-1)) /*产量数组*/

#define c(i,j) (*(C+i*N+j)) /*运价数组*/

#define x(i,j) (*(X+i*(N-1)+j)) /*运量数组 */

/*(<:基本解,>=:运量为0) */

#define s(i,j) (*(S+i*(N-1)+j)) /*检验数数组Sij */ #define u(i) (*(U+i)) /*位势数组Ui*/

#define v(i) (*(V+i)) /*位势数组Vi*/

#define cpi(k) ((CP+k)->i) /*闭回路点i标*/

#define cpj(k) ((CP+k)->j) /*闭回路点i标*/

#define cpf(k) ((CP+k)->f) /*闭回路点i标*/

/* f=0:j++; f=2:j--;

f=1;i--; f=3:i++; */

/*void TP(int M,int N,double *C,double *X); */

10 6 30

0 20 30 40 50 60

12 7 14 16 9 10 9 13 8 14

183 185 119 162 137 102 179 118 114

189 107 169 161 179 169 140 135 112

184 149 128 106 165 178 199 183 194

127 184 173 124 125 151 127 178 160

162 105 150 185 179 153 174 121 142

108 163 157 138 189 171 114 131 165

150 159 131 155 135 165 124 167 107

109 107 149 175 162 108 182 135 181

106 136 183 134 179 188 136 131 189

166 158 159 180 162 104 116 159 111

void main()

{

int M,N,i,j;

double *C; /*存储运价,产量及销量 */

double *X; /*存储运量分配方案 */

float z;

FILE *fp;

char fn[80];

double sum;

void TP(int M,int N,double *C,double *X);

printf("please input the data file name: ");

scanf("%s",fn);

if((fp=fopen(fn,"r"))==NULL)

{

printf("Cannot open the data file!");

}

fscanf(fp,"%d%d",&M,&N);

M++; N++;

X=(double *)malloc(sizeof(double)*(M-1)*(N-1));

C=(double *)malloc(sizeof(double)*M*N);

/* 把运价,供应量和需求量的数据读入到数组c(i,j); */

/*---高太光:这里可以直接定义固定的数组c(i,j),也可以从文件读取

for(i=0;i

{

for(j=0;j

{

fscanf(fp,"%f",&z);

c(i,j)=z;

}

printf("\n");

}

fclose(fp);

/* output c(i,j); */

printf("\n=============Data File================\n");

for(i=0;i

for(j=0;j

{

printf("%10.3f",c(i,j));

}

printf("\n");

}

getch();

TP(M,N,C,X);

/* 输出产销分配方案; */

printf("\n=============Best Solution===================\n"); sum=0;

for(i=0;i

{

for(j=0;j

{

if(x(i,j)>=

printf("%10s","******");

else

{printf("%10.3f",x(i,j));

sum+=(x(i,j)*c(i,j));

}

}

printf("\n");

}

printf("\n\n\tThe min Cost is: %-10.4f\n",sum);

getch();

}

struct PATH{

int i,j,f;

}; /*记录闭回路点结构*/

void TP(int M,int N, double *C,double *X)

{

double *U,*V,*S;

int MN1,m,n;

struct PATH *CP;

int k,i,j,l,k1,l1,ip;

double Cmin,sum;

int I0,J0,Imin,Jmin;

int fi,fj,fc,f;

MN1=(M-1)+(N-1)-1;

m=M-1;n=N-1;

S=(double *)malloc(sizeof(double)*(M-1)*(N-1));

U=(double *)malloc(sizeof(double)*M);

V=(double *)malloc(sizeof(double)*N);

CP=(struct PATH *)malloc(sizeof(struct PATH)*(MN1+1)); #ifdef debug

printf("\nM=%d,N=%d,m=%d,n=%d\n",M,N,m,n);

printf("\nb(i)is following:\n");

for(i=0;i

printf("%8.4f\t",b(i));

printf("\na(j)is folowing:\n");

for(j=0;j

printf("%8.4f\t",a(j));

printf("\n");

getch();

#endif

/*解初始化Xij=; */

for(i=0;i

for(j=0;j

x(i,j)=;

/*最小元素法求初始可行解 */

for(k=0;k

{

Cmin=;

for(i=0;i

{

fi=0;

for(l=0;l

{

相关文档
最新文档