/* ======================================================================Generater.c,David Pisinger 1994年4月====================================================================== *//*这是与论文相对应的C代码:**D.皮辛格*背包算法中的核心问题*运筹学(已接受出版)**有关该项目的更多详细信息,请参阅**D.皮辛格*背包问题的算法*哥本哈根大学DIKU 95/1号报告*帕肯大学1*DK-2100哥本哈根**当前代码生成随机生成的实例*将它们写入文件。不同的容量被视为*确保正确测试。**该代码已在hp9000/735上测试,符合*ANSI-C标准,除了一些定时例程(可能*)。要编译代码,请使用:**cc-Aa-O-O发电机.c-lm* *通过发出命令运行代码**i S型发电机**其中n:项目数量,*r:系数范围,*类型:1=未校正。,2=弱相关,3=强相关,4=子集和*i:实例号S: 串联试验次数(通常为1000次)*输出将写入文件“test.in”。**请不要再分发。可联系获取新副本*作者地址如下。错误和问题是指:**David Pisinger,副教授*哥本哈根大学DIKU,*Parken 1大学,*DK-2100哥本哈根。*电子邮件:pisinger@diku.dk*传真:+45 35 32 14 01*/#包括#包括#包括#包括#包括#包括/* =======================================================================================================================================*/#定义srand(x)srand48x(x)#定义randm(x)(lrand48x()%(x))#定义NO(f,i)((int)((i+1)-f))#定义TRUE 1#定义FALSE 0/* ======================================================================类型声明====================================================================== */typedef int布尔值;/*布尔变量*/typedef短itype;/*项目利润和权重*/typedef长型;/*重量总和*//*项目*/typedef结构{t类型p;/*利润*/类型w;/*重量*/布尔值x;/*解决方案变量*/}项目;/* =======================================================================随机的,随机的======================================================================= *//*要生成与HP9000-UNIX相同的实例*//*以下是SRAND48和LRAND48的C版*/无符号长_h48,_l48;void srand48x(长s){_h48=秒;_l48=0x330E;}长lrand48x(无效){_h48=(_h48*0xDEECE66D)+(_l48*0x5DEEC);_l48=_l48*0xE66D+0xB;_h48=h48+(_l48>>16);_l48=_l48和0xFFFF;返回(_h48>>1);}/* ======================================================================错误=================================================================*/void错误(char*str,…){va_list参数;va_start(参数,字符串);vprintf(字符串,参数);printf(“\n”);va_end(参数);printf(“停止!!!\n\n”);出口(-1);}/* ======================================================================帕洛克语====================================================================== */void pfree(无效*p){if(p==NULL)错误(“释放NULL”);自由(p);}void*palloc(size_tno,size_teach){长尺寸;长*p;尺寸=无*(长)每个;如果(大小==0)大小=1;if(size!=(size_t)size)错误(“alloc too big%ld”,size);p=malloc(大小);如果(p==NULL)错误(“无内存大小%ld”,大小);返回p;}/* ======================================================================展品====================================================================== */作废展品(项目*f、项目*1、类型c){项目*i;光笔ps,ws;文件*输出;out=fopen(“test.in”,“w”);if(out==NULL)错误(“无文件”);fprintf(输出,“%d\n”,否(f,l));对于(i=f;i<=l;i++){fprintf(输出,“%5d%5d%5d\n”,NO(f,i),i->p,i->w);}fprintf(输出,“%d\n”,c);fclose(输出);}/*======================================================================制造测试====================================================================== */stype maketest(项*f,项*1,int r,int type,int v,int S){登记项目*i;寄存器类型和;类型c;r1型;srand(v);总和=0;r1=r/10;对于(i=f;i<=l;i++){i->w=随机数(r)+1;开关(类型){情况1:i->p=randm(r)+1;断裂;情况2:i->p=randm(2*r1+1)+i->w-r1;如果(i->p<=0)i->p=1;断裂;情况3:i->p=i->w+10;断裂;情况4:i->p=i->w;断裂;}总和+=i->w;}c=(v*(双)和)/(S+1);如果(c<=r)c=r+1;返回c;}/* ======================================================================主要的====================================================================== */int main(int argc,char*argv[]){项目*f、*1;int n,r,类型,i,S;类型c;如果(argc==6){n=原子序数(argv[1]);r=原子序数(argv[2]);类型=atoi(argv[3]);i=原子序数(argv[4]);S=原子(argv[5]);printf(“生成器%d%d%d%d%d\n”,n,r,type,i,S);}其他{printf(“生成器\n”);打印f(“n=”);扫描(“%d”,&n);printf(“r=”);扫描(“%d”,&r);打印f(“t=”);扫描(“%d”,&type);打印f(“i=”);扫描(“%d”,&i);printf(“S=”);扫描(“%d”,&S);}f=palloc(n,尺寸(项目));l=f+n-1;c=制造测试(f,l,r,type,i,S);展品(f、l、c);pfree(f);返回0;}