19565数学建模附录.docx

上传人:b****2 文档编号:1764437 上传时间:2023-05-01 格式:DOCX 页数:16 大小:17.48KB
下载 相关 举报
19565数学建模附录.docx_第1页
第1页 / 共16页
19565数学建模附录.docx_第2页
第2页 / 共16页
19565数学建模附录.docx_第3页
第3页 / 共16页
19565数学建模附录.docx_第4页
第4页 / 共16页
19565数学建模附录.docx_第5页
第5页 / 共16页
19565数学建模附录.docx_第6页
第6页 / 共16页
19565数学建模附录.docx_第7页
第7页 / 共16页
19565数学建模附录.docx_第8页
第8页 / 共16页
19565数学建模附录.docx_第9页
第9页 / 共16页
19565数学建模附录.docx_第10页
第10页 / 共16页
19565数学建模附录.docx_第11页
第11页 / 共16页
19565数学建模附录.docx_第12页
第12页 / 共16页
19565数学建模附录.docx_第13页
第13页 / 共16页
19565数学建模附录.docx_第14页
第14页 / 共16页
19565数学建模附录.docx_第15页
第15页 / 共16页
19565数学建模附录.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

19565数学建模附录.docx

《19565数学建模附录.docx》由会员分享,可在线阅读,更多相关《19565数学建模附录.docx(16页珍藏版)》请在冰点文库上搜索。

19565数学建模附录.docx

19565数学建模附录

附录:

(1):

数据的准备:

原始数据文件a:

\input.dat如下:

16118181191711819124201212112222123

23124241252412626127261282812929130

30131291322913333134331353513737136

37138381391104223013375044606551946

62057720188680994801010300111122012

12210131342014145001523163217460019

51020652171022731238122494226107028

1110301210341362351411036143037152038

15203916450181811501917801819110024

20306212119522222023232022424120025

2472026266902726520282817029298830

3046231296903229160333370343332035

351603737703637290383830393013033

301903434260353510036

数据准备程序:

a:

\mind\mind.cpp如下:

/******************************************************/

/*filename:

a:

\mind\mind.cpp*/

/*功能:

为解决钢管订购问题准备数据,数据存放在*/

/*c:

\cij0.dat(解问题

(1)所需数据)中和*/

/*c:

\cij1.dat(解问题(3)所需数据)中*/

/*说明:

本程序必须在执行主程序前执行*/

/*作者:

丁林阁*/

/******************************************************/

#include

#include

#include

#include

#defineSIZE39

#defineINFILENAME"a:

\\input.dat"

#defineOUTFILENAME1"c:

\\cij0.dat"

#defineOUTFILENAME2"c:

\\cij1.dat"

#defineINF100000

staticdoublecc[SIZE][SIZE];

staticdoubleisrail[SIZE][SIZE];

staticintisend=0;

intmind(intl,intn,double*d,double*c);//最小路求解函数

intcost(intr);//铁路费用计算函数

voidmain()

{

doublec[SIZE*SIZE],c1[SIZE][SIZE],c2[SIZE][SIZE];

doubledd[SIZE*SIZE];

intn,i,j,rtn,m;

ints[7]={23,25,27,32,31,36,39};

inta[2][21],counter,flag,l;

intvalue;

charfil1[]=OUTFILENAME1;

FILE*fp,*fp1;

flag=54+23;

l=15;

if((fp=fopen(INFILENAME,"r"))==NULL)//打开原始数据文input.dat

{

printf("can'topeninputfile!

!

!

\n");

exit

(1);

}

for(i=0;i<21;i++)

{

a[1][i]=i+1;

a[0][i]=i+1;

}

a[1][15]=26;a[1][16]=30;a[1][17]=33;a[1][18]=34;a[1][19]=35;a[1][20]=36;

for(m=0;m<2;m++)//m=0则生成cij0.dat,m=1则生成cij1.dat

{

if((fp1=fopen(fil1,"w"))==NULL)

{

printf("can'topeninputfile!

!

!

\n");

exit

(1);

}

counter=0;//读取数据计数器以区分图

(1)数据和图

(2)数据

n=SIZE;

for(i=0;i

{

for(j=0;j

{

cc[i][j]=(double)((i==j)?

0:

INF);

c1[i][j]=(double)((i==j)?

0:

INF);

c2[i][j]=(double)((i==j)?

0:

INF);

israil[i][j]=0;

dd[i*SIZE+j]=0;

}

}

fseek(fp,0,SEEK_SET);//读input.dat

while(!

feof(fp)&&counter

{

fscanf(fp,"%d",&i);

fscanf(fp,"%d",&value);

fscanf(fp,"%d",&j);

if(value==1)//value=1表示i到j由铁路连接

{

israil[i-1][j-1]=1;

counter++;

continue;

}

if(israil[i-1][j-1]==1)

{

c1[i-1][j-1]=value;

c1[j-1][i-1]=value;

}

else

{

c2[i-1][j-1]=value;

c2[j-1][i-1]=value;

}

counter++;

}

for(i=0;i

{

for(j=0;j

{

c[i*n+j]=c1[i][j];

}

}

rtn=mind(1,SIZE,c,dd);//生成铁路完全图

for(i=0;i

{

for(j=0;j

{

c1[i][j]=(double)cost((int)c[i*n+j]);

}

}

for(i=0;i

{

for(j=0;j

{

c[i*n+j]=c2[i][j];

dd[i*SIZE+j]=0;

}

}

rtn=mind(1,SIZE,c,dd);//生成公路完全图

for(i=0;i

{

for(j=0;j

{

c2[i][j]=c[i*n+j]*0.1;

}

}

for(i=0;i

{

for(j=0;j

{

c[i*n+j]=(c1[i][j]

c1[i][j]:

c2[i][j]);//合并成运费完全图

dd[i*SIZE+j]=0;

}

}

rtn=mind(1,SIZE,c,dd);//生成最小运费完全图

for(i=0;i

{

for(j=0;j

{

cc[i][j]=c[i*n+j];

}

}

for(i=0;i<7;i++)

{

for(j=0;j

{

fprintf(fp1,"%f",cc[s[i]-1][a[m][j]-1]);

}

fprintf(fp1,"\n");

}

fclose(fp1);

fil1[6]++;

flag=58+23;

l=21;

}

fclose(fp);

}

intmind(intl,intn,double*d,double*c)

{

inti,ii,j,k,n1;

intj1;

doublex;

if(l!

=0)

{

n1=n-1;

for(i=0;i

{

d[i*n+i]=0;

ii=i+1;

for(j=ii;j

d[i*n+j]=d[j*n+i];

}

}/*endofif*/

for(i=0;i

{

c[i*n+i]=0;

}

j1=0;

if(l!

=1)n1=n;

for(k=0;k

{

for(i=0;i

{

if(l==1)j1=i+1;

for(j=j1;j

{

x=d[i*n+k]+d[k*n+j];

c[i*n+j]=x

x:

d[i*n+j];

if(l==1)c[j*n+i]=c[i*n+j];

}

}

for(i=0;i

{

for(j=0;j

{

d[i*n+j]=c[i*n+j];

}

}

}/*endoffor*/

return(0);

}

intcost(intr)

{

if(r>=0&&r<=300)return(20);

else

if(r>300&&r<=350)return(23);

else

if(r>350&&r<=400)return(26);

else

if(r>400&&r<=450)return(29);

else

if(r>450&&r<=500)return(32);

else

if(r>500&&r<=600)return(37);

else

if(r>600&&r<=700)return(44);

else

if(r>700&&r<=800)return(50);

else

if(r>800&&r<=900)return(55);

else

if(r>900&&r<=1000)return(60);

else

if((r-1000)%100>0)

return(60+((r-1000)/100+1)*5);

else

return(60+(r-1000)/100*5);

 

}

(2):

解问题

(1)的程序:

主程序:

a:

\solut2\getmin.m如下:

clear

globalcij;

globalb;

globals;

globalcounter;

globalminc;

globalminx;

getcij;

loadcij;

counter=0;

b=[80080010002000200020003000];

s=[104301750606194205201680480300220210420500];

%x0=rand(7,15)*234;

x0=ones(7,15)*234;

options=foptions;

options(14)=3301;

x=constr('cost',x0,options);

minx

minc

数据处理函数a:

\solut2\getcij.m如下:

functionf=getcij()

fid=0;

whilefid<1

filename='c:

\cij0.dat';

[fid,message]=fopen(filename,'r');

iffid==-1

disp(message);

end

end

cij=fscanf(fid,'%g');

fclose(fid);

p=[160155155160155150160];

cij=cij';

%cij=[cij(1:

15)+p

(1);cij(16:

30)+p

(2);cij(31:

45)+p(3);cij(46:

%60)+p(4);cij(61:

75)+p(5);cij(76:

90)+p(6);cij(91:

105)+p(7)];

cij=[cij(1:

15)+p

(1);cij(16:

30)+p

(2);cij(31:

45)+p(3);…

cij(46:

60)+p(4);cij(61:

75)+p(5);cij(76:

90)+p(6);…

cij(91:

105)+p(7)];

savecijcij;

目标函数a:

\solut2\cost.m如下:

function[f,g]=cost(x)

globalcij;

globalb

globals

globalcounter;

globalminc;

globalminx;

counter=counter+1;

a=sum(x);

%k=sum(x');

%m=find(k~=0);

l

(1)=0;r

(1)=0;

fori=2:

15

l(i)=s(i-1)-r(i-1);

r(i)=a(i)-l(i);

end

f=sum(sum(cij.*x))+0.05*sum(l.*(l-1)+r.*(r+1))

g=-[x;l;r;zeros(1,15)];

%ll=length(m);

%g(10,1:

2*ll)=[k(m)-b(m)500-k(m)];

g(10,1:

4)=-[800-sum(x(1,:

))800-sum(x(2,:

))1000-sum(x(3,:

))sum(x(7,:

))-500];

ifcounter>3300

minc=f;

minx=round(x);

end

(3):

解问题(3)的程序:

主程序:

a:

\solut3\getmin.m如下:

clear

globalcij;

globalb;

globals;

globalcounter;

globalminc;

globalminx;

get2cij;

loadcij;

counter=0;

b=[80080010002000200020003000];

s=[1043017506061942052016804803002202104205004210130190260100];

%x0=rand(7,21)*234;

%x0=ones(7,21)*234;

x0=zeros(7,21);

options=foptions;

options(14)=3601;

x=constr('cost',x0,options);

minx(6,20)=minx(6,20)+1;

minx(5,6)=minx(5,6)+1;

minx(7,6)=minx(7,6)+1;

minx(3,8)=minx(3,8)+1;

minx(1,7)=minx(1,7)+1;

counter=0;

minc=cost(minx);

minx

minc

数据处理函数a:

\solut3\get2cij.m如下:

functionf=get2cij()

fid=0;

whilefid<1

filename='c:

\cij1.dat';

[fid,message]=fopen(filename,'r');

iffid==-1

disp(message);

end

end

cij=fscanf(fid,'%g');

fclose(fid);

p=[160155155160155150160];

cij=cij';

%cij=[cij(1:

15)+p

(1);cij(16:

30)+p

(2);cij(31:

45)+p(3);cij(46:

60)+p(4);cij(61:

75)+p(5);cij(76:

90)+p(6);cij(91:

105)+p(7)];

cij=[cij(1:

21)+p

(1);cij(22:

42)+p

(2);cij(43:

63)+p(3);cij(64:

84)+p(4);cij(85:

105)+p(5);cij(106:

126)+p(6);cij(127:

147)+p(7)];

%fori=1:

7

%cij((i-1)*15+1:

(i-1)*15+15)=cij((i-1)*15+1:

(i-1)*15+15)+p(i);

%end

savecijcij;

 

目标函数a:

\solut3\cost.m如下:

function[f,g]=cost(x)

globalcij;

globalb

globals

globalcounter;

globalminc;

globalminx;

counter=counter+1;

a=sum(x);

%k=sum(x');

%m=find(k~=0);

l

(1)=0;r

(1)=a

(1);

fori=2:

8

l(i)=s(i-1)-r(i-1);

r(i)=a(i)-l(i);

end

l(9)=s(8)-r(8);r(16)=0;l(16)=a(16);u

(1)=s(15)-l(16);r(9)=a(9)-l(9)-u

(1);

l(10)=s(9)-r(9);r(10)=a(10)-l(10);l(11)=s(10)-r(10);r(15)=0;l(15)=a(15);

fori=14:

-1:

12

r(i)=s(i)-l(i+1);

l(i)=a(i)-r(i);

end

r(11)=s(11)-l(12);u

(2)=a(11)-l(11)-r(11);l(17)=s(16)-u

(2);r(18)=0;

l(18)=a(18);u(3)=s(17)-l(18);r(17)=a(17)-l(17)-u(3);l(19)=s(18)-r(17);

r(19)=a(19)-l(19);l(20)=s(19)-r(19);r(20)=a(20)-l(20);l(21)=s(20)-r(20);

r(21)=a(21)-l(21);

f=sum(sum(cij.*x))+0.05*sum(l.*(l-1)+r.*(r+1))+0.05*sum(u.*(u-1))

g=-[x;l;r;zeros(1,21)];

g(10,1:

7)=-[u800-sum(x(1,:

))800-sum(x(2,:

))1000-sum(x(3,:

))sum(x(7,:

))-500];

ifcounter>3600

minc=f;

minx=round(x);

end

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2