资源

平衡不完全块设计(第13条)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:clpe13*//*标题:平衡不完整块设计(第13条)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:CLP*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:CLP程序章节中的示例13*//*约束编程书*//*                                                             *//***************************************************************/%宏观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的必要条件。;%转到退出;%结束;proc-clp-out=&out(keep=x:)domain=[0,1]varselect=FIFO;/*决策变量:*//*当对象i出现在块c中时,决策变量X_i_c=1*/无功功率,无功功率(%i=1%到&v;x&i.1-x&i.&b。%结束;) = [0,1];/*强制性约束:*//*(i)每个对象正好出现在r个块中*/%设q=%eval(&b.-&r.);/*每行有&q 0s和&r 1s*/%i=1%到&v;gcc(x&i.1-x&i.&b.)=((0,0,&q.)(1,0,&r.));%结束;/*(ii)每个块正好包含k个对象*/%设h=%eval(&v.-&k.);/*每列有&h 0s和&k 1s*/%做c=1%到&b;海湾合作委员会(%i=1%到&v;x、i、c。%结束;)=((0,0,&h.)(1,0,&k.));%结束;/*(iii)每对物体正好出现在lambda块中*/%设t=%eval(&b.-&lambda.);%i=1%到%评估(&v.-1);%do j=%eval(&i.+1)%to&v;/*如果i和j都出现在c中,则辅助变量pij_c=1*/var(p&i.&j.1-p&i.&j.&b)=[0,1];%做c=1%到&b;具体化损益:(x&i.&c.+x&j.&c.=2);%结束;gcc(p&i.&j.1-p&i.&j.&b.)=((0,0,&t.)(1,0,&lambda.));%结束;%结束;/*对称打断约束:*//*通过字典排序约束打破行对称*/%do i=2%至-v。;%设i1=%eval(&i.-1);词典((x&i._1-x&i._&b.)LEX_LT(x&i1._1-x&i1._&b;%结束;/*通过词典排序约束打破列对称*/%做c=2%到&b。;%设c1=%eval(&c.-1);词典(%doi=1%to&v。;x和i._&c。%结束;)LEX_LE(发光二极管_发光二极管)(i=1%到&v。;x、i、c1。%结束;);%结束;运行;%放置(&O)rclp;%出口:%修补围兜;%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=对象;运行;/*打印解决方案*/proc打印数据=bibdmat2;标题“平衡不完全块设计问题”;title 2“(&v,&b,-r,&k,&lambda)”;运行;%结束;%否则%做;/*打印解决方案*/proc打印数据=bibdmat;标题“平衡不完全块设计问题”;title2“(&v,&b,&r,&k,&lambda)”;运行;%结束;%修补围嘴;%bidd_out(15,15,7,7,3);