/* ======================================================================genhard.c,David Pisinger 2002年,2004年1月====================================================================== *//*这是本文中的测试生成器:**D.皮辛格,*背包难题在哪里*计算机与运筹学(2005)**当前代码生成随机生成的实例*将它们写入文件。考虑了不同的容量*确保正确测试。**该规范符合ANSI-C标准。**通过发出命令运行代码**genhard n r i S型**其中n:项目数量,*r:系数范围,*类型:1=不相关,2=弱相关,3=强相关,*4=逆str.corr,5=几乎str.corl,6=子项和,*7=偶数子项和,8=偶数背包,*9=不相关的类似权重,*11=解开。跨度(2,10)*12=弱。腐蚀跨度(2,10)*13=结构腐蚀跨度(2,10)*14=mstr(3R/10,2R/10,6)*15=pceil(3)*16=圆(2/3)*i:实例号*S:串联试验次数(通常为1000次)**输出将写入文件“test.in”。*输出格式为*n个*0 p[0]w[0]*1 p[1]宽[1]* :*n-1 p[n-1]w[n-1]*c(c)**(c)David Pisinger,*哥本哈根大学DIKU,*Parken 1大学,*DK-2100哥本哈根。*电子邮件:pisinger@diku.dk*/#包括#包括#包括#包括#包括#包括#包括/* ============================================================================================================================================ */#定义srand(x)srand48x(x)#定义randm(x)(lrand48x()%(长)(x))typedef int布尔值;#定义TRUE 1#定义FALSE 0#定义SPAN 10#定义SPAN2 5/* =======================================================================随机的,随机的======================================================================= *//*要生成与HP9000-UNIX相同的实例*//*以下是SRAND48和LRAND48的C版*/无符号int _h48,_l48;无效srand48x(int s){_h48=秒;_l48=0x330E;}int lrand48x(无效){_h48=(_h48*0xDEECE66D)+(_l48*0x5DEEC);_l48=_l48*0xE66D+0xB;_h48=h48+(_l48>>16);_l48=_l48和0xFFFF;返回(_h48>>1);}int i素数(int i){整数j;对于(j=2;j*j<=i;j++){如果(i%j==0)返回FALSE;}返回TRUE;}int primelarger(int i){对于(;;i++)if(isprime(i)),返回i;}/* ======================================================================发电机====================================================================== */long long生成器(int n,int*pp,int*ww,int type,int r,int v,int tests){整数i,p,w,r1,r2,k1,k2;长长wsum,psum,c;文件*输出;int sp[100],sw[100]、span;/*printf(“生成器%d%d%d%d%d\n”,n,类型,r,v,测试)*/srand(v);r1=r/10;r2=r/2;wsum=0;跨度=0;如果(类型==11)跨度=2;如果(类型==12)跨度=2;如果(类型==13)跨度=2;对于(i=0;i<span;i++){sw[i]=兰特(r)+1;如果(类型==11)sp[i]=randm(r)+1;/*解开卷曲*/如果(类型==12)sp[i]=randm(2*r1+1)+sw[i]-r1;/*韦克科尔*/如果(类型==13)sp[i]=sw[i]+r1;/*斯特科尔*/如果(sp[i]<=0)sp[i]=1;sw[i]=(sw[i]+SPAN2-1)/SPAN2;sp[i]=(sp[i]+SPAN2-1)/SPAN2;}对于(i=0;i<n;){w=兰姆(r)+1;开关(类型){情况1:p=randm(r)+1;/*不相关的*/断裂;情况2:p=randm(2*r1+1)+w-r1;/*弱腐蚀*/如果(p<=0)p=1;断裂;情况3:p=w+r1;/*强腐蚀*/断裂;情况4:p=w;/*逆强相关*/w=p+r1;断裂;情况5:p=w+r1+randm(2*r/1000+1)-r/1000;/*alm字符串corr*/断裂;情况6:p=w;/*子集和*/断裂;情况7:w=2*((w+1)/2);/*偶数*/p=w;断裂;情况8:w=2*((w+1)/2);/*双人背包*/p=w+r1;断裂;情况9:p=w;/*不相关、相似的权重*/w=随机数(r1)+100*r;断裂;案例11:案例12:案例13:k1=兰姆(10)+1;k2=兰姆(跨度);w=k1*sw[k2];p=k1*sp[k2];断裂;情况14:w=randm(r)+1;p=w;/*有点困难*/如果(w%6==0){p+=3*r1;中断;}p+=2*r1;断裂;情况15:w=randm(r)+1;p=3*((w+2)/3);/*双倍利润*/断裂;情况16:w=randm(r)+1;p=2*sqrt(4*r*r-(w-2*r)*(w-2*r))/3;断裂;默认值:error(“未定义的问题类型”);}pp[i]=p;ww[i]=w;i++;}wsum=0;psum=0;对于(i=0;i<n;i++){wsum+=ww[i];psum+=pp[i];}c=(v*(长-长)wsum)/(测试+1);对于(i=0;i<n;i++),如果(ww[i]>c)c=ww[i;开关(类型){情况1:返回c;情况2:返回c;情况3:返回c;情况4:返回c;情况5:返回c;情况6:返回c;案例7:返回2*(c/2)+1;情况8:返回2*(c/2)+1;情况9:返回c;情况11:返回c;情况12:返回c;情况13:返回c;情况14:返回c;情况15:返回c;情况16:返回c;默认值:error(“未定义容量类型”);}}/* ======================================================================展品====================================================================== */void showitems(int n,int*pp,int*ww,long long c){整数i;long-long ps,ws;文件*输出;out=fopen(“test.in”,“w”);if(out==NULL)错误(“无文件”);fprintf(输出,“%d\n”,n);对于(i=0;i<n;i++){fprintf(输出,“%5d%5d%5d\n”,i,pp[i],ww[i]);}fprintf(输出,“%lld\n”,c);fclose(输出);}/* ======================================================================主要的====================================================================== */void main(int argc,char*argv[]){int*pp,*ww;int n,r,类型,i,S;int正常;长长c;如果(argc==6){n=原子序数(argv[1]);r=原子序数(argv[2]);类型=atoi(argv[3]);i=原子序数(argv[4]);S=原子(argv[5]);printf(“生成器2%d%d%d%d%d\n”,n,r,type,i,S);}其他{printf(“生成器2\n”);打印f(“n=”);ok=扫描(“%d”,&n);printf(“r=”);ok=扫描(“%d”,&r);打印f(“t=”);ok=扫描(“%d”,&type);打印f(“i=”);ok=扫描(“%d”,&i);printf(“S=”);ok=扫描(“%d”,&S);}pp=(int*)malloc(n*sizeof(int));ww=(int*)malloc(n*sizeof(int));c=发电机(n,pp,ww,type,r,i,S);展品(n,pp,ww,c);游离(pp);免费(ww);}