资源

汽车排序问题(oclpe07)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*姓名:oclpe07*//*标题:汽车排序问题(oclpe07)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:OPTMODEL、GANTT、SQL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:CLP求解器章节中的示例7*//*数学编程书*//*                                                             *//***************************************************************/数据类data;输入类cars_cls;数据线;1个2 13 24 25 2个6 2;数据选项data;输入选项max blSz class1-class6;数据线;1 1 2 1 0 0 0 1 12 2 3 0 0 1 1 0 13 1 3 1 0 0 0 1 04 2 5 1 1 0 1 0 05 1 5 0 0 1 0 0 0;%宏car_sequencing(outdata);过程操作模型;集合CLASSES;num类=卡片(类);num cars_cls{类别};将数据class_data读入CLASSES=[class]cars_cls;设置OPTIONS;num最大值{选项};num blSz{选项};num列表{OPTIONS,CLASSES};num cars_opt{选项}中的i=类中的和{k}cars_cls[k]*list[i,k];将数据option_data读入OPTIONS=[option]max blSz{类中的k}<list[option,k]=col('class'||k)>;num nCars=类中的和{k}cars_cls[k];设置SLOTS=1..nCars;/*声明变量*//*槽变量:S[i]-分配给槽i的汽车等级*/var S{SLOTS}integer>=1<=类;/*选项变量:O[i,j]-指示分配给插槽i的类是否需要选项j*/var O{SLOTS,OPTIONS}二进制;/*容量限制:每个选项j*//*在blSz[j]车辆的每个序列中最多安装[j]个*/con CapacityCon{j在OPTIONS中,i在0..(nCars-blSz[j])}中:1..blSz[j]}中的和{k[i+k,j]<=最大值[j];/*需求约束:对于每个k类*//*完全是cars_cls[k]车*/con满足需求con:gcc(S,CLASSES}<k,cars_cls[k],cars_cls[k]>中{k的集合);/*元素约束:对于每个插槽i和每个选项j*//*将插槽变量与选项变量关联起来*//*O[i,j]=列表[j,S[i]]*/con OptionsAtSlotCon{i在SLOTS中,j在OPTIONS}中:元素(S[i],{k在CLASSES}列表[j,k],O[i,j]中);/*提高效率的冗余约束*//*选项j*//*在blSz[j]辆车的每个序列中最多只能有[j]个*//*需要选项j*//*所有其他插槽至少包含cars_opt[j]-max[j]*//*带选装件j的汽车*/OPTIONS中的con BoundRemainingCon{j,1中的i..(nCars/blSz[j])}:求和{k in 1..(nCars-i*blSz[j])}O[k,j]>=cars_opt[j]-i*max[j];用CLP/varselect=minrmaxc findall求解;/*从PROC OPTMODEL阵列复制典型的PROC CLP输出*/创建数据和输出数据。(下降=sol)从[sol]=(1..NSOL_){插槽中的i}<col('S_'||i)=S[i].sol[sol]>{i在插槽中,j在OPTIONS}<col('O_'||i||'_'|j)=O[i,j].sol[sol]>;退出;%修补;%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;%汽车淬火机;