资源

汽车排序问题(clpe07)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:clpe07*//*标题:汽车排序问题(clpe07)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:CLP、GANTT、SQL*//*数据:*//*                                                             *//*支持:更新:*//*参考编号:*//*MISC:CLP程序章节中的示例7*//*约束编程书*//*                                                             *//***************************************************************//*一线:车辆数量;选项数量;类的数量。第二行:每个选项的最大车辆数量块中的选项。第三行:对于每个选项,最大参考编号。然后对于每个类别:索引编号。;这个级别的汽车数量;对于每个选项,无论此类是否需要它(1或0)。*/数据输入;输入col1 col2 col3 col4 col5 col6 col7;数据线;10 5 6 . . . .1 2 1 2 1 . .2 3 3 5 5 . .0 1 1 0 1 1 01 1 0 0 0 1 02 2 0 1 0 0 13 2 0 1 0 1 04 2 1 0 1 0 05 2 1 1 0 0 0;%宏car_sequencing_data(indata);%全球N辆/*辆数*/否/*选项数量*/Nclss;/*类的数量*//*读取输入数据集*/数据_全部_;集合&indata;如果n_=1,则执行;呼叫信号('Ncars',strip(put(col1,best.)));呼叫信号('Nops',strip(put(col2,best.)));调用信号('Nclss',strip(put(col3,best.));结束;运行;%i=1%到&Nops;%全球最大_&i/*带有选项&i的汽车的最大数量*//*块大小为BlSz_i*/BlSz_&i/*对于选项&i,对应的块大小*//*至最大_i*/list_&i/*选项&i的类指示符列表*/汽车选项&i;/*需要选项&i的汽车数量*/%结束;%i=1%到&Nclss;%全球类&i/*类&i的类索引号*/cars_cls_&i;/*一级车的数量*/%结束;数据_全部_;设置&indata;如果n_=2,则执行;%i=1%到&Nops;调用信号(“Max_&i”,put(col&i,best.));%结束;结束;如果n=3,则执行;%i=1%到&Nops;调用信号(“BlSz_&i”,put(col&i,best.));%结束;结束;如果_n_>=4,则执行;调用symput(“class_”|strip(put(n-3,best.)),put(col1+1,best..));调用symput(“cars_cls_”||strip(put(n-3,best.)),put(col2,best..));%i=1%到&Nops;调用symput(“cars_opts_&i”,put(col2*col%eval(&i+2),best));%结束;结束;运行;/*创建列列表以生成选项列表*/数据输入1;集合&indata;如果n≤3,则删除;运行;proc-sql-noprint;%i=1%到&Nops;从input1中选择col%eval(&i+2)到:list_&i,用“,”分隔;从input1中选择sum(col2*col%eval(&i+2))到:cars_opts_&i;%结束;退出;%修复车辆序列数据;%车辆序列数据(输入);%宏car_sequencing(outdata);proc-clp-out=&outdata varselect=minrmaxc findall;/*声明变量*/无功功率,无功功率/*槽变量:Si-分配给槽i的汽车等级*/%i=1%到&Ncars;S_&i=[1,&Nclss]%结束;/*选项变量:Oij-指示分配给Sloti的类是否需要选项j*/%i=1%到&Ncars;%do j=1%至&Nops;O_&i._&j=[0,1]%结束;%结束;;/*容量限制:每个选项j*//*在BlSz_j汽车的每个序列中,最多安装在Max_j汽车中*/%do j=1%至&Nops;%i=0%至%评估(&Ncars-&&BlSz_&j);林肯0%do k=1%到&BlSz_&j;+O_%评估(&i+&k)_&j%结束;<=&&最大_&j;%结束;%结束;/*需求约束:针对每个类别i*//*完全是cars_cls_i汽车*/gcc(S_1-S_&Ncars)=(%i=1%到&Nclss;(&&class_&i、&&cars_cls_&i和&cars_cls_&i)%结束;);/*元素约束:对于每个插槽i和每个选项j*//*将插槽变量与选项变量关联起来*//*O_i_j是list_j中的第S_i个元素*/%i=1%到&Ncars;%do j=1%至&Nops;元素(S_&i,(&&list_&j),O_&i._&j;%结束;%结束;/*提高效率的冗余约束*//*选项j*//*在&&BlSz_&j汽车的每个序列中,最多&&Max_&j*//*需要选项j*//*所有其他插槽至少包含cars_opt_j-Max_j*//*带选装件j的汽车*/%do j=1%至&Nops;%i=1%至%评估(&Ncars/&BlSz_&j);林肯0%do k=1%到%评估(&Ncars-&i*&BlSz_&j);+O_&k._&j%结束;>=%eval(&&cars_opts_&j-&i*&&Max_&j);%结束;%结束;运行;%修补;%car排序(sequence_out);%宏car_sequencing_gantt;/*将类映射到颜色*/%让class1=红色;%让class2=蓝色;%让class3=灰色;%设class4=蓝色;%让class5=青色;%让class6=黄色;/*设置图案*/%do i=1%至6;图案&i.v=s颜色=&&class&i。;%结束;proc排序数据=sequence_out;通过%do j=1%至10;S_和j%结束;;运行;数据carseq_ds(保持=S_1-S_10);设置sequence_out;运行;proc格式;价值阶段0.5 = '1'9.5 = '10'10.5 = ' ';运行;数据调度;格式_label$8。;格式化s_start阶段。;label solution=“解决方案”;设置carseq_ds;keep _ pattern _ label segmt _ no solution s _ start s _ finish;保留溶液1;%do i=1%至10;s_start=%eval(&i-1)+0.5;s_finish=&i+0.5;segmt_no=&i;nextpat=0;/*确保不匹配*/%do j=1%至6;如果S_&i eq&j,则执行;_label=“类%eval(&j)”;_模式=&j;结束;如果S_&i eq%eval(&j+1),则执行;nextpat=&j;结束;%结束;如果mod(nextpat-pattern,4)ne为0,则执行;s_饰面=s_饰面-0.05;结束;产出;%结束;溶液=溶液+1;运行;数据标签;_y=-1;_lvar=“_label”;_xvar=“s_start”;_hlabel=1.0;_yoffset=-0.6;_xoffset=0.25;运行;goptions htext=1.5;title1 j=c h=5pct“汽车排序问题”;title2 j=c h=3pct“所有六种解决方案的装配顺序”;proc-gantt数据=调度labdata=标签;图表/pcompress(压缩)跳过=3诺霍布努姆诺列根心智=0.5使用格式labsplit=“/”增量=1barht=2巴罗夫=0.8;id解决方案;运行;%修复car_sequencing_gantt;%汽车淬火机;