/* ======================================================================test_mulknap.c,David Pisinger,1998年6月====================================================================== */#包括#包括#包括#包括#包括#包括#包括#包括#包括“mulknap.h”/* ============================================================================================================================================ */#定义测试20#定义srand(x)srand48(x)#定义随机(x)(lrand48()%(长)(x))#定义TRUE 1/*布尔值*/#定义FALSE 0/* ======================================================================全局变量====================================================================== */文件*跟踪;/* ======================================================================类型声明====================================================================== */typedef int布尔值;typedef long tyype;/*州数*/typedef短itype;/*项目利润和权重*/typedef长型;/*重量总和*/typedef浮点ftype;/*产品类型(足够精度)*/typedef双ptype;/*产品类型(足够精度)*/typedef带符号字符mtype;/*背包数量*/typedef无符号长btype;/*二进制解向量*/typedef int(*funcptr)(常量无效*,常量无效*);/*项目记录*/typedef结构irec{城市类型p;/*利润*/类型w;/*重量*/m类型x;/*最优解变量*/m类型y;/*当前解决方案*/m类型a;/*仅在a之后考虑*/m类型r;/*减少*/}项目;/* ======================================================================调试例程====================================================================== */静态无效错误(char*str,…){va_list参数;va_start(参数,字符串);vprintf(字符串,参数);printf(“\n”);va_end(参数);出口(-1);}/* ======================================================================展品====================================================================== */void showitems(int n,int m,int*p,int*w,int*x,int*c){整数i;整数j,k;int ps、ws、*wsum;布尔校验;fprintf(trace,“items\n”);对于(i=0;i!=n;i++){fprintf(记录道,“%3d:%1d(%d,%d)\n”,i+1,x[i],p[i]、w[i]);}fprintf(trace,“容量”);对于(i=0;i!=m;i++){fprintf(跟踪,“c[%d]%d\n”,i+1,c[i]);}}/* ======================================================================消费品=================================================================*/int summitems(int n,int m,int*p,int*w,int*x,int*c,int z){整数i;整数j,k;int ps,ws,csum,*wsum;布尔校验;/*printf(“汇总项%d\n”,n)*/wsum=malloc(m*sizeof(int));ps=0;对于(j=0;j<m;j++)wsum[j]=0;对于(i=0;i!=n;i++){如果(x[i]!=0){如果(x[i]<0)错误(“x太小”);如果(x[i]>m)错误(“x太大”);ps+=p[i];wsum[x[i]-1]+=w[i];}}ws=0;csum=0;对于(j=0;j!=m;j++){如果(wsum[j]>c[j])错误(“过量填充c[%hd]:w%ld,c%ld\n”,j+1,wsum[j],c[j]);ws+=wsum[j];csum=+c[j];}自由(wsum);/*printf(“汇总项(%ld,%ld)\n”,ps,ws)*/如果(ps!=z)错误(“错误解决方案”);返回csum;}/* ======================================================================无帽====================================================================== */静态int无帽(int*a,int*b){/*按递增顺序排序容量的功能*/返回(*a-*b);}/* ======================================================================汇总数据====================================================================== */无效汇总数据(int n1,int m1,int r1,int t1,int s1,int迭代1,int紧缩1,int缩减1,int核心大小1,int gub1,int z1,int csum1,int tottime1){静态long n;静态长r;静态长m;静态长t;静态长s;静态长检查=0;静态长迭代=0;静态长期拧紧=0;静态长岩芯尺寸=0;静态长tottime=0;静态长间隙=0;静态长度减少=0;静态长zsum=0;静态长csum=0;双均值;如果(n1==0){平均值=总时间/(1000*(两次)试验);fprintf(跟踪,“n=%ld\n”,n);fprintf(跟踪,“r=%ld\n”,r);fprintf(跟踪,“m=%ld\n”,m);fprintf(跟踪,“t=%ld\n”,t);fprintf(跟踪,“sim=%ld\n”,s);fprintf(trace,“iterates=%.1lf\n”,iterates/(double)TESTS);fprintf(trace,“拧紧=%.1lf\n”,拧紧/(双)1);fprintf(trace,“gap=%.1lf\n”,gap/(double)TESTS);fprintf(trace,“reduced=%.1lf\n”,reduced/(double)1);fprintf(trace,“coresize=%.1lf\n”,coresize/(double)TESTS);fprintf(跟踪,“zsum=%.0lf\n”,zsum/(双精度)1);fprintf(trace,“csum=%.0lf\n”,csum/(double)1);fprintf(trace,“time=%.2lf\n”,mean/(double)1);}其他{iterates+=iterates1;如果(拧紧1>拧紧)拧紧=拧紧1;if(reduced1>reduced)reduced=reduced1;芯尺寸+=芯尺寸1;间隙+=gub-z1;zsum=((zsum+z1)%1000);csum=((csum+csum1)%1000);tottime+=tottime1;n=n1;m=m1;r=r1;t=t1;s=s1;}}/* ======================================================================制造测试====================================================================== */void maketest(int n,int m,int*p,int*w,int*x,int*c,int类型,int r,布尔相似){寄存器int i;寄存器类型minw,maxw;寄存器类型和;触针csum,c4,c2,maxc;布尔ok;整数r1,j;r1=r/10;用于(;;){总和=0;最小重量=r;最大值=0;对于(i=0;i!=n;i++){w[i]=随机(r-9)+10;/*重量(单位:[10,R])*/如果(w[i]<minw)minw=w[i];如果(w[i]>maxw)maxw=w[i];开关(类型){情况1:p[i]=随机(r)+1;断裂;案例2:do{p[i]=随机(2*r1+1)+w[i]-r1;}而(p[i]<=0);断裂;情况3:p[i]=w[i]+10;断裂;情况4:p[i]=w[i];断裂;默认值:p=0;}总和+=w[i];x[i]=0;}csum=0;c4=(0.4*总和)/m;c2=(0.2*总和)/m;对于(j=0;j<m-1;j++){如果(类似){c[j]=c4+随机(c2);}其他{c[j]=随机(总和/2-csum);}csum+=c[j];}c[m-1]=总和/2-csum;csum+=c[m-1];ok=真;对于(j=0,maxc=0;j<m;j++){如果(c[j]<=0)ok=FALSE;如果(c[j]<minw)ok=FALSE;如果(c[j]>maxc)maxc=c[j];}如果(maxw>maxc)ok=FALSE;如果(总和<=csum)ok=FALSE;如果(好)断开;}/*printf(“maketest sum%ld,csum%ld\n”,sum,csum)*/if(csum>=sum)错误(“maketest too greedy”);qsort(c,m,sizeof(int),(functr)capless);/*必须订购容量*/}/* ======================================================================主要的====================================================================== */void main(int argc,char*argv[]){int n,r,m,类型,s,v,z,csum;整数*p,*w,*x,*c;字符sim[80];如果(argc==6){n=原子序数(argv[1]);r=原子序数(argv[2]);m=原子序数(argv[3]);类型=atoi(argv[4]);s=(strcmp(argv[5],“s”)==0);printf(“Mulknap%d、%d、%d,%d、%c\n”,n,r,m,type,(s?'s':'d'));}其他{printf(“Mulknap\n”);打印f(“n=”);扫描(“%d”,&n);printf(“r=”);scanf(“%d”,-r);打印f(“m=”);扫描(“%d”,&m);printf(“t=”);扫描(“%d”,&type);打印f(“s=”);扫描(“%s”,&sim);s=(strcmp(sim,“s”)==0);}p=malloc(sizeof(int)*n);w=malloc(sizeof(int)*n);x=malloc(sizeof(int)*n);c=malloc(sizeof(int)*m);trace=fopen(“trace.mul”,“a”);fprintf(trace,“\nMULKNAP:n:%d,r:%d,m:%d,type:%d,s:%c\n”,n、 r,m,type,(s?'s':'d'));对于(v=1;v<=测试;v++){srand(v);printf(“测试%d\n”,v);/*fprintf(跟踪,“测试%d\n”,v)*/maketest(n,m,p,w,x,c,type,r,s);z=多重(n,m,p,w,x,c);/*展品(n、m、p、w、x、c)*/csum=汇总项(n、m、p、w、x、c、z);fprintf(跟踪,“%2d:itr%ld,z%ld\n”,v,iterates,z);sumdata(n、m、r、type、s、iterates、tighted、reduced、coresize、,gub、z、csum、tottime);}免费(c);自由(x);自由(w);自由(p);sumdata(0,0,0,1,0,0,0,0+0,0);fclose(跟踪);}