资源

切割料(omod5)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*姓名:omod5*//*标题:切割料(omod5)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:OPTMODEL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:的OPTMODEL章节中的示例5*//*数学编程*//*                                                             *//***************************************************************//*切屑问题*//*使用延迟的列生成Chvatal线性规划(1983),第198页*/%宏观csp(容量);proc optmodel打印级别=0;/*声明参数和集合*/num容量=容量;设置项目;num需求{ITEMS};数字宽度{ITEMS};num num_patterns init卡(项目);设置PATTERNS=1..num_PATTERNS;num a{项目,图案};num c{ITEMS}初始化0;数量ε=1E-6;/*读取输入数据*/将数据indata读入ITEMS=[_N_]需求宽度;/*生成琐碎的初始列*/对于项目中的{i,模式中的j}a[i,j]=(如果(i=j),则楼层(容量/宽度[i]),否则为0);/*定义主问题*/var x{图案}>=0整数;最小化NumberOfRaws=模式}x[j]中的总和{j;con-demand_con{i在ITEMS}中:模式中的sum{j}a[i,j]*x[j]>=需求[i];问题母版包括x NumberOfRaws demand_con;/*定义列生成子问题*/var y{ITEMS}>=0整数;最大化KnapsackObjective=ITEMS}c[i]*y[i]中的和{i;con背包_密码:项目宽度[i]*y[i]中的总和{i<=容量;问题背包包括y背包目标背包con;/*主回路*/做while(1);打印页面a;/*主问题*//*最小化sum_j x[j]sub.to sum_j a[i,j]*x[j]>=需求[i]x[j]>=0和整数*/使用问题大师;提出“解决主问题”;用lp松弛法求解/预解算器=无解算器=ps基础=warmstart printfreq=1;打印x;打印demand_con.dial;对于{i in ITEMS}c[i]=demand_con[i].dial;/*背包问题*//*最大化sum_ic[i]*y[i]sub.to sum_i width[i]*y[i]<=容量y[i]>=0和整数*/使用问题背包;放置“解决列生成子问题”;用milp/printfreq=0求解;对于项目}中的{i y[i]=圆形(y[i]);打印y;打印KnapsackObjective;如果背包目标<=1+ε,则离开;/*包括新图案*/num_patterns=num_ppatterns+1;对于项目}中的{i,a[i,num_patterns]=y[i];结束;/*解决IP问题,使用四舍五入LP解决方案作为热启动*/使用问题大师;对于模式}中的{j x[j]=ceil(x[j].sol);将“解决(受限制的)主问题作为IP”;用milp/primalin求解;/*清理解决方案并保存到输出数据集*/对于模式}中的{j x[j]=圆形(x[j].sol);从PATTERNS:x[j]>0}中的[pattern]={j创建数据解决方案raws=x{项目中的i}<col('i'|i)=a[i,j]>;退出;%修补csp;/*Chvatal,第199页*/数据indata;投入需求宽度;数据线;78 25.540 22.530 2030 15;运行;%csp(91)/*LP解为整数*//*Chvatal,第195页*/数据indata;投入需求宽度;数据线;97 45610 36395 31211 14;运行;%csp(100)/*LP解是分数*/