matlab递归效率太低,故我是用c实现的。<br>
/*设水平切割单位面积的费用是垂直切割单位面积费用的r倍,且当先后两次垂直切割的平面(不管它们之间<br>
是否穿插水平切割)不平行时,因调整刀具需额外费用e.<br>
用以下实例验证你的方法:待加工长方体和成品长方体的长、宽、高分别为10、14.5、19和3、2、4,<br>
二者左侧面、正面、底面之间的距离分别为6、7、9(单位均为厘米)。<br>
垂直切割费用为每平方厘米1元,r和e的数据有以下4组:<br>
<br>
a.r=1 e=0 ;b.r=1.5 e=0 ; c.r=8 ,e=0 ; d.r=1.5;2≤e≤15<br>
*/<br>
#include <stdio.h><br>
#define OK 1<br>
#define ERROR 0<br>
typedef int Status;<br>
//min_cost为最小花费,cost为总花费。<br>
//min_trace[6]为最小花费时的步骤。<br>
//trace[6]用来记录步骤,n表示已走完的步数。<br>
//在步骤中,0--5分别代表前后左右上下。<br>
//vs1为当前的前垂直面积,vs2为当前的侧垂直面积,ls为当前的水平面积。<br>
//vnum为已垂直切割的次数,lnum为已水平切割的次数。<br>
//p为两次垂直切割平面不平行的概率。<br>
//x,y,z为长方体的位置(二者左侧面、正面、底面之间的距离)。<br>
<br>
Status Find(int trace[],int n,int k){<br>
for(int i=0;i<n;i++)<br>
if(trace==k)break;<br>
if(i==n)return OK;<br>
return ERROR;<br>
}//Find<br>
<br>
Status Print(FILE* fp,int trace[],float cost){<br>
printf("cost=%f\n",cost);<br>
fprintf(fp,"cost=%f\n",cost);<br>
printf("该路径为:");<br>
for(int i=0;i<6;i++){<br>
switch(trace){<br>
case 0:<br>
printf("前--");<br>
fprintf(fp,"前--");<br>
break;<br>
case 1:<br>
printf("后--");<br>
fprintf(fp,"后--");<br>
break;<br>
case 2:<br>
printf("左--");<br>
fprintf(fp,"左--");<br>
break;<br>
case 3:<br>
printf("右--");<br>
fprintf(fp,"右--");<br>
break;<br>
case 4:<br>
printf("上--");<br>
fprintf(fp,"上--");<br>
break;<br>
case 5:<br>
printf("下--");<br>
fprintf(fp,"下--");<br>
break;<br>
}//switch<br>
}//for<br>
printf("END\n");<br>
fprintf(fp,"END\n");<br>
return OK;<br>
}//Print<br>
<br>
Status Print_f2(FILE* fp,int trace[],float cost){<br>
fprintf(fp,"cost=%f\n",cost);<br>
fprintf(fp,"该路径为:");<br>
for(int i=0;i<6;i++){<br>
switch(trace){<br>
case 0:<br>
fprintf(fp,"前--");<br>
break;<br>
case 1:<br>
fprintf(fp,"后--");<br>
break;<br>
case 2:<br>
fprintf(fp,"左--");<br>
break;<br>
case 3:<br>
fprintf(fp,"右--");<br>
break;<br>
case 4:<br>
fprintf(fp,"上--");<br>
break;<br>
case 5:<br>
fprintf(fp,"下--");<br>
break;<br>
}//switch<br>
}//for<br>
fprintf(fp,"END\n");<br>
return OK;<br>
}//Print<br>
<br>
<br>
Status cutting(FILE*fp1,FILE*fp2,float& min_cost,int min_trace[],float cost,int trace[],int n,float vs1,float vs2,float ls,<br>
float unit_cost,int p,int e,int r,float x,float y,float z,float l,float
w,float h,<br>
float L,float W,float H){<br>
if(n>=6){<br>
Print(fp1,trace,cost);<br>
if(min_cost>cost){<br>
fclose(fp2);<br>
fp2=fopen("最优方案.txt","w");<br>
min_cost=cost;<br>
for(int i=0;i<6;i++){<br>
min_trace=trace;<br>
}//for<br>
}//if<br>
if(min_cost==cost)<br>
Print_f2(fp2,trace,cost);<br>
return OK;<br>
}//if<br>
float cost1;<br>
if(Find(trace,n,0)){<br>
trace[n]=0;<br>
cost1=cost+unit_cost*vs1+p*e;<br>
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,vs1,(W-y)*H,(W-y)*L,unit_cost,p,e,r,x,0,z,l,w,h,L,W-y,H);<br>
}//if<br>
if(Find(trace,n,1)){<br>
trace[n]=1;<br>
cost1=cost+unit_cost*vs1+p*e;<br>
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,vs1,(w+y)*H,(w+y)*L,unit_cost,p,e,r,x,y,z,l,w,h,L,w+y,H);<br>
}//if<br>
if(Find(trace,n,2)){<br>
trace[n]=2;<br>
cost1=cost+unit_cost*vs2+p*e;<br>
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,H*(L-x),vs2,W*(L-x),unit_cost,p,e,r,0,y,z,l,w,h,L-x,W,H);<br>
}//if<br>
if(Find(trace,n,3)){<br>
trace[n]=3;<br>
cost1=cost+unit_cost*vs2+p*e;<br>
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,H*(l+x),vs2,W*(l+x),unit_cost,p,e,r,x,y,z,l,w,h,l+x,W,H);<br>
}//if<br>
if(Find(trace,n,4)){<br>
trace[n]=4;<br>
cost1=cost+r*unit_cost*ls+p*e;<br>
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,L*(h+z),W*(h+z),ls,unit_cost,p,e,r,x,y,z,l,w,h,L,W,h+z);<br>
}//if<br>
if(Find(trace,n,5)){<br>
trace[n]=5;<br>
cost1=cost+r*unit_cost*ls+p*e;<br>
cutting(fp1,fp2,min_cost,min_trace,cost1,trace,n+1,L*(H-z),W*(H-z),ls,unit_cost,p,e,r,x,y,0,l,w,h,L,W,H-z);<br>
}//if<br>
return OK;<br>
}//cutting<br>
<br>
void main(){<br>
int min_trace[6],trace[6],n(0),p(0),e,r;<br>
float min_cost(10000),cost(0),unit_cost(1),x(6),y(7),z(9);<br>
float l(3),w(2),h(4),L(10),W(14.5),H(19),vs1,vs2,ls;<br>
FILE* fp1,*fp2;<br>
fp1=fopen("切割方案.txt","w");<br>
fp2=fopen("最优方案.txt","w");<br>
vs1=L*H;<br>
vs2=W*H;<br>
ls=L*W;<br>
printf("e=");<br>
scanf("%d",&e);<br>
printf("r=");<br>
scanf("%d",&r);<br>
cutting(fp1,fp2,min_cost,min_trace,cost,trace,n,vs1,vs2,ls,unit_cost,p,e,r,x,y,z,l,w,h,L,W,H);<br>
printf("最少花费为:%f\n",min_cost);<br>
fprintf(fp1,"最少花费为:%f\n",min_cost);<br>
printf("是请参看“切割方案.txt,最优方案.txt”\n");<br>
fclose(fp1);<br>
fclose(fp2);<br>
}//main<br>
<br>
|