资源

平衡不完全块设计(oclpe08)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*姓名:oclpe08*//*标题:平衡不完整块设计(oclpe08)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:OPTMODEL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:CLP求解器章节中的示例8*//*《数学编程》一书*//*                                                             *//***************************************************************/%宏观bibd(v,b,r,k,lambda,out=bibdout);/*将v对象排列成b块,以便:(i) 每个对象正好出现在r个块中,(ii)每个块正好包含k个对象,(iii)每对物体正好在lambda块中同时出现。等价地,创建一个具有v行和b列的二进制矩阵,每行r1s,每列k1s,以及任意一对不同行之间的标量积lambda。*//*检查必要条件*/%如果(%eval(&r*&v)ne%eval(%eval(&lambda*(&v-1)))或(&v>&b)%然后%do;%不满足放置BIBD的必要条件。;%转到退出;%结束;过程操作模型;num v=&v;num b=&b;数字r=&r;数字k=&k;num lambda=λ;设置OBJECTS=1..v;设置BLOCKS=1..b;/*当对象i出现在块c中时,决策变量X[i,c]=1*/var X{OBJECTS,BLOCKS}二进制;/*强制性约束:*//*(i)每个对象正好出现在r个块中*/con Exactly_r_blocks{i在OBJECTS}中:gcc(块}X[i,c]中的{c,{<0,0,b-r>,<1,0,r>});/*(ii)每个块正好包含k个对象*/块}中的con Exactly_k_objects{c:gcc(对象}X[i,c]中的{i,{<0,0,v-k>,<1,0,k>});/*(iii)每对物体正好出现在lambda块中*/设置PAIRS={对象中的i,对象中的j:i<j};/*辅助变量P[i,j,c]=1当i和j都出现在c中时*/变量P{PAIRS,BLOCKS}二进制;con Pairs_refify{<i,j>在Pairs中,c在BLOCKS}中:具体化(P[i,j,c],X[i,c]+X[j,c]=2);成对的con Pairs_gcc{<i,j>:gcc(块中的{c}P[i,j,c],{<0,0,b-lambda>,<1,0,lambda>});/*对称断裂约束:*//*通过词典排序约束打破行对称*/对象diff{1}}中的con Symmetry_i{i:词典(块X[i,c]中的{c);/*通过词典排序约束打破列对称*/BLOCKS diff{1}}中的con Symmetriy_c{c:词典(OBJECTS}X[i,c]中的{i);用CLP/varselect=FIFO求解;从中创建数据(&O){i在OBJECTS中,c在BLOCKS}<col('X'||i||'_'|c)=X[i,c]>;退出;%放置&_roptmodel;%出口:%修补围兜;%bibd(15,15,7,7,3);%宏bibd_out(v,b,r,k,lambda,out=bibdout,transpose=0);/*使用解决方案中的v行和b列创建二进制矩阵bibd宏的。如果转置=1,则矩阵将被转置便于显示。*/数据bibdmat;出发;数组块{&b.};%i=1%到&v。;%do j=1%to&b。;块[&j.]=x&i._&j。;%结束;产出;%结束;滴x:;运行;%如果&转置%,则%do;/*转置二进制矩阵的行和列显示方便*/proc转置数据=bibdmatout=bibdmat2(重命名=(_NAME_=块))prefix=对象;运行;/*打印解决方案*/过程打印数据=bibdmat2;标题“平衡不完全块设计问题”;title2“(&v,&b,&r,&k,&lambda)”;运行;%结束;%其他%do;/*打印解决方案*/proc打印数据=bibdmat;标题“平衡不完全块设计问题”;title2“(&v,&b,&r,&k,&lambda)”;运行;%结束;%修补围嘴;%bidd_out(15,15,7,7,3);