资源

安排大型篮球会议(clp12)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:clp12*//*标题:安排大型篮球会议(clp12)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:CLP、GANTT、SQL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:CLP程序章节中的示例12*//*约束编程书*//*                                                             *//***************************************************************//****************************************************************//*首先,找出所有可能的模式。只考虑时间*//*此时的约束。模式应该合适*//*适合任何球队。暂时不要考虑单个团队*//****************************************************************/%宏模式();proc-clp-out=所有模式findall;/*适用于日期1至18*/%do j=1%至18;变量h&j=[0,1];/*家*/变量a&j=[0,1];/*离开*/变量b&j=[0,1];/*再见*//*一支球队要么是主场,要么是客场,要么就是再见*/林肯h&j+a&j+b&j=1;%结束;/*------------------------------------------------------------*//*标准1-镜像方案*//*------------------------------------------------------------*//*日期分组为成对(j,j1),这样每个*//*球队在第j天和第j1天与同一对手比赛*//*日期j的主场比赛将是日期j1的客场比赛*/%do j=1%至18;%做j1=%eval(&j+1)%到18;%如果(&j=1和&j1=8)或(&j=2和&j 1=9)或(&j=3和&j1=12)或(&j=4和&j1=13)或(&j=5和&j1=14)或(&j=6和&j1=15)或(&j=7和&j1=16)或(&j=10和&j1=17)或(&j=11和&j1=18)%,则林肯h&j=a&j1,a&j=h&j1、b&j=b&j1;;%结束;%结束;/*------------------------------------------------------------*//*标准2-首场和最后一场主客场比赛*//*------------------------------------------------------------*//*每支球队必须在前三场比赛中至少有一场主场比赛*/林肯h1+h2+h3>=1;/*每支球队必须在最后三场比赛中至少有一场主场比赛*/林肯h16+h17+h18>=1;/*没有一支球队可以在最后两天都客场比赛*/林肯a17+a18<2;/*------------------------------------------------------------*//*标准3-主场/客场/再见模式*//*------------------------------------------------------------*/%do j=1%至16;/*没有一支球队可以连续进行两场以上的客场比赛*/林肯a&j+a%eval(&j+1)+a%eval(&j+2)<3;/*没有一支球队可以连续两场以上的主场比赛*/lincon h&j+h%评价(&j+1)+h%评估(&j+2)<3;%结束;/*没有一支球队可以连续三场以上的客场比赛或比分*/%do j=1%至15;林肯a&j+b&j+a%eval(&j+1)+b%eval+b%eval(&j+2)+a%eval;%结束;/*没有一支球队能够连续四场主场比赛或比分*/%do j=1%至14;林肯h&j+b&j+h%评估(&j+1)+b%评估(-j+1)+h%评估+b%eval(&j+2)+h%eval+b%eval(&j+4)<5;%结束;/*------------------------------------------------------------*//*标准4-周末模式*//*------------------------------------------------------------*//*每个队都有四个周末在家比赛*/lincon 0%do j=2%到18%乘以2+h&j%结束=4;/*每个队都有四个周末的比赛*/lincon 0%do j=2%到18%乘以2+a&j%结束=4;/*每个队有一个周末,再见*/lincon 0%do j=2%到18%乘以2+b&j%结束=1;/*------------------------------------------------------------*//*标准5-第一个周末*//*------------------------------------------------------------*//*每支球队必须至少有两场主场比赛或比分*//*前五个周末*/lincon 0%do j=2%到10%乘以2;+h&j+b&j%结束;>=2;/*------------------------------------------------------------*//*标准9-(部分)*//*------------------------------------------------------------*//*在第一场比赛中被淘汰的球队不会在客场比赛*//*最后一次约会或17号回家(Wake)*//*在第16天告别的球队不参加客场比赛*//*日期18(杜克)*/林肯b1+a18<2,b1+h17<2,b16+a18<2;运行;%修补;%模式;/*****************************************************************//*仅考虑时间,确定所有可能的“模式集”*//*约束*//*本阶段不考虑单个团队*//*xi-二进制变量表示模式i在模式集中*//*****************************************************************/%宏模式();数据_全部_;设置所有模式;%do i=1%至38;如果n_=&i,则执行;%do j=1%至18;呼叫信号(“h&i.&j”,输入(h&j,最佳));调用symput(“a&i.&j”,put(a&j,best.));呼叫座谈会(“b&i.&j”,输入(b&j,最佳);%结束;结束;%结束;运行;proc-clp-out=pattern_sets findall;/*xi=1,如果模式i属于模式集*/var(x1-x38)=[0,1];/*每个图案集正好有九个图案*/lincon 0%do i=1%至38;+x&i%结束=9;/*时隙约束*/%do j=1%至18;/*每个时间段四场主场比赛*/lincon 0%do i=1%到38;+&&h&i._&j*x&i%结束=4;/*每个时间段四场客场比赛*/lincon 0%do i=1%到38;+&&a&i._&j*x&i%结束=4;/*每个时间段一次再见*/lincon 0%do i=1%到38;+&&b&i._&j*x&i%结束=1;%结束;/*排除不支持会议日期的模式对*/%do i=1%至38;%做i1=%eval(&i+1)%到38;%让计数=0;%do j=1%至18;%如果(&&h&i.&j=0或&&a&i1.&j=O)和(&&a&i._&j=0或&&h&i1._&j=0))%然后%do;%让计数=%eval(&count+1);%结束;%结束;%如果(&count=18)%,则%do;lincon x&i+x&i1<=1;%结束;%结束;%结束;运行;%修补;%pattern_sets;/*********************************************************************//*将各个团队分配到模式集k*//*团队:1名克莱姆、2名杜克、3名FSU、4名GT、5名UMD、6名UNC、7名NCSU、8名UVA、*//*9唤醒*//*********************************************************************/%宏观时间表(k);proc clp out=ACC_ds_&k varselect=minrmaxc findall;%do j=1%至18;/*阿尔法(i,j):i队在第j天的对手(0=再见)*/%do i=1%至9;varα&i.&j=[0,9];%结束;/*时间表约束1*//*时隙中的对手必须是不同的*/所有差异(%doi=1%~9;alpha&i.&j%end;);/*时间表限制2*/%do i=1%至9;%做i1=1%到9;/*指示i队和i1队是否在时间段j内比赛*/变量X&i._&i1._&j=[0,1];具体化X&i._&i1._&j:(alpha&i._&j=&i1);/*我队打i1如果我队打i*/%如果(&i1>&i)%,则%do;lincon X&i._&i1._&j=X&i1._&i._&j;%结束;%结束;%结束;%结束;/*在团队级别镜像方案*//*将日期分组为成对(j,j1),以便*//*球队在第j天和第j1天与同一对手比赛*//*其中一场比赛应该是每支球队的主场比赛*/%do i=1%至9;%do j=1%至18;%做j1=%eval(&j+1)%到18;%如果(&j=1和&j1=8)或(&j=2和&j 1=9)或(&j=3和&j1=12)或(&j=4和&j1=13)或(&j=5和&j1=14)或(&j=6和&j1=15)或(&j=7和&j1=16)或(&j=10和&j1=17)或(&j=11和&j1=18)%,然后%do;lincon alpha&i.&j=alpha&i.&j1,/*H和A是表示原点的矩阵*//*和客场比赛*/H&i._&j=A&i._&j1,H&i._&j1=A&i._&j;%结束;%结束;%结束;%结束;/*时间表限制3*//*每个队与其他队比赛两次*/%do i=1%至9;%做i1=1%到9;%如果&i1ne&i%,则%do;lincon 0%do j=1%到18;+X&i._&i1._&j%结束;=2;%结束;%结束;%结束;/*时间表限制4*//*球队不与自己对抗*/%do j=1%至18;%do i=1%至9;林肯阿尔法&i.&j<>&i;lincon X&i._&i._&j=0;/*冗余*/%结束;%结束;/*时间表限制5*//*设置再见矩阵*//*alpha&i.&j=0表示团队&i在date&j上再见*/%do j=1%至18;%do i=1%至9;变量B&i._&j=[0,1]/*拜拜矩阵*/具体化B&i._&j:(alpha&i._&j=0);%结束;%结束;/*时间表限制6*//*alpha&i.&j=&i1表示团队&i和&i1在date&j上比赛*//*这一定是一场主场比赛,另一场客场比赛*/%do j=1%至18;%do i=1%至9;%做i1=1%到9;/*具体化控制变量*/变量U&i._&i1._&j=[0,1]V&i._&i1._&j=[0,1];/*如果我在家,而我不在家*/具体化U&i._&i1._&j:(H&i.__&j+A&i1._&j=2);/*如果&i1在家,&i不在家*/具体化V&i._&i1._&j:(A&i._&j+H&i1._&j=2);/*必要条件,如果&i在日期j播放&i1*/林肯X&i._&i1._&j;%结束;%结束;%结束;/*时间表限制7*//*每个团队必须在指定日期回家、离开或告别*/%do j=1%至18;%do i=1%至9;/*团队&i在date&j的主场(客场)*/变量H&i._&j=[0,1]A&i._&j=[0,1];lincon H&i._&j+A&i._&j+B&i._&j=1;%结束;%结束;%do i=1%至9;%做i1=%eval(&i+1)%到9;/*时间表限制8*//*-------------------------------------------------------*//*标准6-对手比赛*//*-------------------------------------------------------*//*最后一个周末是“对手比赛”*//*除非球队与FSU比赛或再见*/%如果(&i=1和&i1=4)或(&i=2和&i1=6)或(&i=5和&i1=8)或(&i=7和&i1=9)%,然后%do;林肯X&i._&i1._18+B&i._18+X&i._3_18=1;/*冗余*/林肯X&i1._&i._18+B&i1._18+X&i1.3_18=1;%结束;/*时间表限制9*//*-------------------------------------------------------*//*标准7-热门比赛*//*-------------------------------------------------------*//*以下配对指定发生在*//*二月份至少一次*/%如果(&i=2和&i1=4)或(&i=2和&i1=9)或(&i=4和&i1=6)或(&i=6和&i1=9)%,然后%do;lincon 0%do j=11%到18;+X&i._&i1._&j%结束;>=1;/*冗余*/lincon 0%do j=11%到18;+X&i1._&i._&j%结束;>=1;%结束;%结束;%结束;/*时间表限制10*//*-------------------------------------------------------*//*标准8-对手序列*//*-------------------------------------------------------*/%do i=1%至9;/*没有球队连续两次客场比赛*//*杜克大学(2)和北卡罗来纳大学(6)*/%do j=1%至17;var Q&i._26_&j=[0,1]P&i._26 _&j=[0,1];具体化Q&i._26_&j:(X&i._2_&j+X&i._6_&j=1);具体化P&i._26_&j:(X&i._2_%评估(&j+1)+X&i._6_%评估;lincon Q&i._26_&j+A&i._&j+P&i..26_&j+A&i._%评估(&j+1)<4;%结束;/*没有一支球队连续三次与之比赛*//*杜克大学(2)、北卡罗来纳大学(6)和威克大学(9)*/%do j=1%至16;var L&i._269_&j=[0,1]M&i._269 _&j=[0,1]N&i._269_&j=[0,1];具体化L&i._269_&j:(X&i._2_&j+X&i._6_&j+X&i._ 9_&j=1);具体化M&i._269_&j:(X&i._2_%评估(&j+1)+X&i._6_%评估+X&i._9_%评估(&j+1)=1);具体化N&i._269_&j:(X&i._2_%评估(&j+2)+X&i._6_%评估+X&i._9_%评估(&j+2)=1);林肯L&i._269_&j+M&i._269 _&j+N&i._2169_&j<3;%结束;%结束;/*时间表限制11*//*-------------------------------------------------------*//*标准9——非同步约束*//*-------------------------------------------------------*//*北卡罗来纳大学在11日和18日扮演杜克大学*/林肯alpha6_11=2;林肯alpha6_18=2;/*北卡罗来纳大学在第二次约会中扮演克莱姆*/linconα_6_2=1;/*杜克在16号告别*/林肯B2_16=1;/*韦克在17号约会中没有回家*/林肯H9_17=0;/*维克在第一次约会时就分手了*/林肯B9_1=1;/*克莱姆、杜克、UMD和威克在最后一次约会中没有客场比赛*/林肯A1_18=0;林肯A2_18=0;林肯A5_18=0;林肯A9_18=0;/*克莱姆、FSU和GT在第一次约会时不会客场比赛*/林肯A1_1=0;林肯A3_1=0;林肯A4_1=0;/*FSU和NCSU在最后一天没有再见*/林肯B3_18=0;林肯B7_18=0;/*UNC在第一次约会中没有再见*/林肯B6_1=0;/*时间表限制12*//*-------------------------------------------------------*//*用图案搭配团队*//*-------------------------------------------------------*/%i=1%到9;/*对于每个团队*/变量p&i=[1,9];%do j=1%至18;/*对于每个日期*/元素(p&i,(&&col&k._h&j),h&i._&j)(p&i、(&&col&k._a_&j)、a&i._&j(p&i,(&&col&k._b_&j),b&i._&j;%结束;%结束;运行;%修补;/**************************************************************//*尝试所有可能的模式集以找到所有有效的时间表*//**************************************************************/%宏findschedules;proc转置数据=pattern_sets out=trans_good;运行;数据处理(_T);设置trans_good;设置所有模式;运行;proc-sql-noprint;%do k=1%至17;/*对于每个图案*/%do j=1%至18;/*对于每个日期*/选择h&j到:col&k.h&j由“,”从temp分隔,其中col&k=1;选择&j到:col&k.a&j由“,”从temp分隔,其中col&k=1;选择b&j到:col&k.b&j由“,”从temp分隔,其中col&k=1;%结束;%结束;运行;数据全部;运行;%do k=1%至17;/*对于每个图案集*/%时间表(k=&k);数据全部;设置所有ACC_ds_&k;运行;%结束;数据全部;设置全部;如果n_=1,则删除;运行;%修补;%查找时间表;/********************//*生成报告*//********************/%宏acc_report;%让Univ1=Clem;%让Univ2=杜克;%让Univ3=FSU;%让Univ4=GT;%让Univ5=UMD;%让Univ6=UNC;%让Univ7=NCSU;%让Univ8=UVA;%让Univ9=唤醒;%设Clem=1;%设Duke=2;%设FSU=3;%设GT=4;%设UMD=5;%设UNC=6;%设NCSU=7;%设UVA=8;%设尾流=9;%let Bye=0;1997年数据表;设置全部;如果(α&Clem_1=&UMD)和(阿尔法和杜克_1=&UVA)和(α&FSU.1=&UNC)和(α&GT.1=&NCSU)和(alpha&UMD.1=&Clem)和(α&UNC.1=&FSU)和(α&NCSU._1=&GT)和(α&UVA.1=&Duke)和(alpha和Wake._1=再见)(alpha&Clem.2=&UNC)和(alpha和Duke.2=&UMD)和(α&FSU.2=&NCSU)和(alpha和GT.2=再见)和(α&UMD._2=杜克)和(alpha和UNC.2=清洁)和(α&NCSU.2=&FSU)和(alpha和UVA.2=尾迹)和(alpha和Wake.2=&UVA)(alpha和Clem.3=尾流)和(alpha和Duke.3=和NCSU)和(α&FSU.3=&UMD)和(α&GT.3=&UNC)和(α&UMD.3=&FSU)和(α&UNC.3=&GT)和(阿尔法和NCSU.3=&Duke)和(α和UVA.3=再见)和(alpha和Wake.3=清洁)然后产出;运行;1997年数据报告(keep=%doi=1%to 9;&&Univ&i%end;);设置时间表1997;格式%doi=1%到9;&&大学和学院$8。%结束;;%do j=1%至18;%do i=1%至9;%做i1=1%到9;如果(alpha&i._&j=&i1)和(H&i._&j=1),则&&Univ&i=“&&Univ&i1”;否则,如果(alpha&i._&j=&i1)和(A&i._&j=1),则&&Univ&i=“@&&Univ&i1”;否则,如果(alpha&i._&j=0)和(B&i._&j=1),则&&Univ&i=“再见”;%结束;%结束;产出;%结束;运行;数据打印优先;Date=“Date”||条(put(_n_,best.));集合报告1997;运行;程序打印;运行;%修补;%acc报告;%宏甘特;%让Univ1=Clem;%让Univ2=杜克;%让Univ3=FSU;%让Univ4=GT;%让Univ5=UMD;%让Univ6=UNC;%让Univ7=NCSU;%让Univ8=UVA;%让Univ9=唤醒;数据模式颜色映射;格式颜色$10。;%do i=1%至9;_模式=&i;color=“黑色”;产出;%结束;运行;%宏setPattern(计数,颜色);模式和计数。v=e color=&color repeat=1;%修补setPattern;%宏setPatterns(数据=pattern_color_map);数据_全部_;集合&data;保留计数1;dummy=解析(“%setPattern('||count||','||color||')”);调用执行(虚拟);计数=计数+1;运行;%修补setPatterns;%setPatterns;proc格式;价值阶段0.5 = '1'17.5 = '18'18.5 = ' ';运行;数据活动;格式_标签$6。行为$5。;格式化s_start阶段。;label act=“团队”;设置时间表1997;keep pattern _label segmt_no act s_start s_finish duration;保持时间0.95;%i=1%到9;/*主场球队*/%do j=1%至18;/*日期*/如果(alpha&i._&j=0)和(B&i._&j=1),则执行;s_start=。;s_finish=。;segmt_no=&j;_label=“”;_模式=。;act=“&&Univ&i”;产出;结束;否则;%做i1=1%到9;如果(alpha&i._&j=&i1)和(H&i._&j=1),则执行;s_start=%eval(&j-1)+0.5;s_finish=&j+0.45;segmt_no=&j;_label=“&&Univ&i1”;_模式=&i;act=“&&Univ&i”;产出;结束;否则,如果(alpha&i._&j=&i1)和(A&i._&j=1),则执行;s_start=%eval(&j-1)+0.5;s_finish=&j+0.45;segmt_no=&j;_label=“@&&Univ&i1”;_模式=&i1;act=“&&Univ&i”;产出;结束;%结束;结束;%结束;%结束;运行;数据标签;_y=-1;_lvar=“_label”;_xvar=“s_start”;_hlabel=1.0;_yoffset=-0.2;_xoffset=0;运行;title1“ACC篮球锦标赛日程安排”;proc-gantt数据=活动labdata=标签;图表/跳过=3诺霍布努姆诺列根图表宽度=95pcompress(压缩)act=行动持续时间=持续时间心智=0.5使用格式增量=1;身份行为;运行;%修补;%甘特;