资源

详细示例(omodd01)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*姓名:omodd01*//*标题:细节示例(omodd01)*//*产品:或*//*系统:所有*//*关键字:或*//*程序:OPTMODEL*//*数据:*//*                                                             *//*支持:更新:*//*参考:*//*MISC:OPTMODEL详细信息部分的示例*//*数学规划章节*//*                                                             *//***************************************************************//*命名的参数*/数据系数;输入cxxx cx cy cxy cyy;数据线;1 -1  -2 -1 1;过程操作模型;变量x,y;数字cxx、cx、cy、cxy、cyy;将数据系数读入cxx cx cy cxy cyy;最小z=cxxx*x**2+cx*x+cy*y+cxy*x*y+Cyy*y**2;解决;退出;/*编制索引*/过程操作模型;数字p{1..3};p[1]=5;p[2]=7;p[3]=9;放置p[*]=;退出;/*INIT子句中的索引*/过程操作模型;1..3}中的数字p{i初始化3+2*i;put(1,.3}p[i]中的和{i);退出;/*使用SUM运算符进行索引*/过程操作模型;数量n init 100000;变量x{1..n};最小z=和{i在1..n}(x[i]-log(i))**2;解决;退出;/*参数*/过程操作模型;数pi=4*atan(1);数字r;圈数=2*pi*r;r=1;放置圆周;/*打印6.2831853072*/r=2;放置圆周;/*打印12.566370614*/退出;/*表达式*/过程操作模型;var x初始值0.5>=0<=1;变量y初始值(0.5>=0)<=1;打印x y;扩张;退出;过程操作模型;1..8}中的数字原始{i=sin(i);排序的数字{i在1..8}init原始[i]中;调用sortn(已排序[*]的);打印原稿;退出;/*索引集*/过程操作模型;put(1,.10}i**2中的和{i);退出;/*AND聚合表达式*/过程操作模型;put(和{i在1..5}i<10中);/*返回1*/put(和{i在1..5}i NE 3中);/*返回0*/退出;/*CARD功能*/过程操作模型;put(卡片(1..3));退出;/*CROSS表达式*/过程操作模型;设置s1=1..2;设置<string>s2={'a','b'};设置<number,string>s3=s1交叉s2;put的s3是s3;设置<number,string,number>s4=s3交叉4..5;put的s4是s4;退出;/*DIFF表达式*/过程操作模型;put({1,3}差异{2,3});/*输出{1}*/退出;/*IN表达式*/过程操作模型;设置s=1..10;put(5英寸);/*输出1*/put(-1不在s中);/*输出1*/集合<num,str>t={<1,'a'>,<2,'b'>,<2,'c'>};put(t中<2,'b'>);/*输出1*/put(t中<1,'b'>);/*输出0*/退出;/*索引集表达式*/过程操作模型;put({i in 1..5:i NE 3});/*输出{1,2,4,5}*/退出;/*INTER表达式*/过程操作模型;put({1,3}inter{2,3});/*输出{3}*/退出;/*INTER聚合表达式*/过程操作模型;put(inter{i in 1..3}i..i+3);/*输出{3,4}*/退出;/*MAX聚合表达式*/过程操作模型;put(2..5}1/i中的最大值{i);退出;/*MIN聚合表达式*/过程操作模型;put(min{iin2..5}1/i);退出;/*OR聚合表达式*/过程操作模型;put(或{iin1..5}i=2);/*返回1*/put(或{i.in1..5}i=7);/*返回0*/退出;/*PROD聚合表达式*/过程操作模型;数量n=5;put(prod{i in 1..n}i);/*输出120*/退出;/*RANGE表达式*/过程操作模型;put(10..30 x 7);/*输出{10,17,24}*/退出;/*设置构造函数表达式*/过程操作模型;put({1,2,3,2});/*输出{1,2,3}*/退出;/*Tuples的显示*/过程操作模型;数量m=3,n=4;变量x{1..4}初始化1;字符串y='c';put({<'a',x[3]>,<'b',m>,<y,m/n>});退出;/*SETOF聚合表达式*/过程操作模型;put({i在1..3}<i,i*i,i**3>中的集合);退出;/*SLICE表达式*/过程操作模型;put(切片(<1,*>,{<1,3>,<1,0>,<3,1>});put(切片(<*,2,*>,{<1,2,3>,<2,4,3>,<2,2,5>});退出;/*Warshall算法*/过程操作模型;集合<str,str>dep={<'B','A'>,<'C','B'>,<'D','C'>};设置<str,str>cl;设置<str>cn;cl=dep;cn=(dep}i中的集合{i,j>)inter(dep{j中的集合);对于{cn中的节点}cl=cl联合(切片(<*,node>,cl)横切片(<node,*>,cl));放置cl;退出;/*SUM表达式*/过程操作模型;put(1..10}i中的和{i);/*输出55*/退出;/*SYMDIFF表达式*/过程操作模型;put({1,3}符号{2,3});/*输出{1,2}*/退出;/*元组表达式*/过程操作模型;放置(<1,2,3>在1..2}<i,i+1,i+2>的{i集合中);put({<1,'a'>,<2,'b'>}交叉{<3,'c'>,<4,'d'>});退出;/*UNION表达式*/过程操作模型;put({1,3}并集{2,3});/*输出{1,3,2}*/退出;/*UNION聚合表达式*/过程操作模型;put(union{i in 1..3}i..i+3);/*输出{1,2,3,4,5,6}*/退出;/*WITHIN表达式*/过程操作模型;放置({1,3}在{2,3}内);/*输出0*/put({1,3}不在{2,3}内);/*输出1*/放置({1,3}在{1,2,3}内);/*输出1*/退出;/*数据集输入/输出*/过程操作模型;set LOCS={“纽约”、“华盛顿”、“波士顿”};/*位置*/设置DOW=1..7;/*星期几*/变量{LOCS,DOW}初始化1;从[location day_of_week]={LOCS,DOW}sale=s创建数据soldata;退出;数据pdat;输入p$maxprod成本;数据线;ABQ 12 0.7米亚9 0.6甲烷14 0.5;过程操作模型;设置<string>植物;var-prod{plants}>=0;数量成本{株};将数据pdat读入plants=[p]prod.ub=maxprod成本;退出;数据abcd;输入字母$@@;数据线;a、b、c、d;/*READ DATA语句:显式索引*/过程操作模型;设置<num>下标=1..4;字符串字母{下标};将数据abcd读入[_N_]字母[5-_N_];打印信函;退出;数据revdata;输入月份rev@@;数据线;1 200 2 345 3 362 4 9585 659 6 804 7 487 8 1469 683 10 732 11 652 12 469;/*CREATE DATA语句:显式索引*/过程操作模型;设置m=1..3;var收益{1..12};将数据revdata读入[_N_]收入=rev;从[month]=m收入[month]创建数据qtr1;从[month]=m收入[month+3]创建数据qtr2;从[month]=m收入[month+6]创建数据qtr3;从[month]=m收入[month+9]创建数据qtr4;/*CREATE DATA语句:动态数据集名称*/过程操作模型;设置m=1..3;var收入{1..12};将数据revdata读入[_N_]收入=rev;对于1..4}中的{q创建数据(“qtr”|q)从[月]=m收入[月+(q-1)*3];/*格式化输出*/过程操作模型;数值a=1.7,b=2.8;集合s={a,b};输入b;/*列表输出*/输入a=b=;/*命名输出*/put“值A:”A 8.1@30“值B:”B 8.;/*格式化的*/string str='比率(A/B)为:';放置str(a/b);/*字符串和表达式*/放置s=;/*命名集输出*/退出;/*PRINT语句:列表表单输出*/过程操作模型;数字方块{i在0..5}=i*i;1..5}中的倒数{i=1/i;打印方形配方;/*PRINT语句:矩阵形式输出*/过程操作模型;设置R=1..6;设置C=1..4;R中的数字a{i,C}中的数字j=10*i+j;打印a;退出;/*ODS表和变量名*/proc optmodel打印级别=2;ods output PrintTable=expt ProblemSummary=exps派生方法=exdmSolverOptions=exso解决方案摘要=exss OptStatistics=exos定时=exti;性能细节;变量x{1..2}>=0;最小z=2*x[1]+3*x[2]+x[1]**2+10*x[2]+2.5*x[1]*x[2]+x[1]**3;conc1:x[1]-x[2]<=1;conc2:x[1]+2*x[2]>=100;解决;打印x;退出;title2“打印表”;proc打印数据=expt;运行;title2“问题摘要”;proc打印数据=exps;运行;title2“求解器选项”;proc打印数据=exso;运行;title2“派生方法”;proc打印数据=exdm;运行;title2“解决方案摘要”;proc打印数据=exss;运行;title2“OptStatistics”;proc打印数据=exos;运行;title 2“时间安排”;proc打印数据=exti;运行;标题2;/*制约因素*/过程操作模型;变量x,y;最小r=x**2+y**2;con c:x+y>=1;解决;打印x y;退出;/*扩展标准化约束*/过程操作模型;变量x{1..3};conb:1..3}中的和{i(x[i]-i)=0;展开b;退出;/*标准化约束的展开和体值*/过程操作模型;var x初始化1;conc1:x**2≤5;conc2:5>=x**2;conc3:-x**2>=-5;con c4:-5<=-x**2;扩张;打印c1.body c2.body c3.body c4.body;退出;/*约束:双重值*/过程操作模型;变量x;最小o1=x**2;conc1:1≤x≤2;解决;打印(c1.dual);最大氧气=-x**2;解决;打印(c1.dual);退出;/*后缀*/过程操作模型;var v>=0<=2初始化1;数字n初始化10;num绑定{1..N}初始化2;var x{i在1..N}中>=0<=ubound[i];扩张;打印变量名称变量标签;退出;过程操作模型;变量x,y;最小z=x+y;conc:x+2*y<=3;解决;打印x.lb x.ub x.status x.sol;打印y.lb y.ub y.status y.sol;打印c.lb c.ub c.body c.dual;x.lb=0;y.lb=0;c.lb=1;解决;打印x.lb x.ub x.status x.sol;打印y.lb y.ub y.status y.sol;打印c.lb c.ub c.body c.dual;退出;/*双重价值*/过程操作模型;变量x,y;最小z=6*x+7*y;反对的论点4*x+y>=5,-x-3*y<=-4,x+y≤4;解决;打印x y;展开_ACON_;print_ACON_.doual_ACON_.body;_ACON_[1].lb=_ACON_[1].lb-1;解决;_ACON_[2].ub=_ACON_[2].ub+1;解决;退出;/*降低了成本*/过程操作模型;var x>=0,y>=0、z>=0;最大成本=4*x+3*y-5*z;反对的论点-x+y+5*z<=15,3*x-2*y-z≤12,2*x+4*y+2*z<=16;解决;打印x y z;打印x.rc y.rc z.rc;退出;/*预溶器*/过程操作模型;var x>=3;var y>=0;conc:x+y≤7;conc2:x+2*y<=15;/*冗余*/展开/求解;退出;/*模型更新*/过程操作模型;变量x,y;最小r=x**2+y**2;conc:x+y>=1;解决;打印x y;滴c;解决;打印x y;恢复c;固定x=0.3;解决;打印x y c.dual;取消固定;解决;打印x y c.dual;退出;/*多种解决方案*/proc optmodel打印级别=0;varx{1..2}整数>=1<=3;con c:alldiff(x);用clp/allsolns求解;打印_NSOL_;在1..2中打印{j,在1..NSOL_}x[j].sol[i]中打印i;从[sol]={i在1..NSOL_}中创建数据solout{jin1..2}<col(“x”||j)=x[j].sol[i]>;/*问题符号输出*/proc optmodel打印级别=0;变量x1>=0,x2>=0;最小化z=x1+x2+x3+x4;con a1:x1+x2+x3<=4;con a2:x4+x5<=6;con a3:x1+x4>=5;cona4:x2+x5>=2;cona5:x3>=3;用lp求解;打印变量名称变量.rc变量状态;打印con_.name con_.lb con_.body con_.ub con_.dual con_.status;/*OPTMODEL选项*/过程操作模型;数量n=1/7;用于{i in 1..9 by 4}做;重置选项pdigits=(i);打印n;结束;重置选项pdigits;/*重置为默认值*/退出;/*调用FCMP函数*/proc fcmp outlib=工作.funcs.test;/*算术几何平均值*/功能agm(a0,b0);a=a0;b=b0;如果a<=0或b<=0,则返回(0);直到(a-b<a/1e12);a1=0.5*a+0.5*b;b1=平方(a*b);a=a1;b=b1;结束;申报(a);endsub;运行;/*必须使用CMPLIB选项指定库*/选项cmplib=work.funcs;过程操作模型;标题“AGM(1,2)”;印刷品(agm(1,2));过程操作模型;标题“AGM优化”;/*求x,其中agm(1,x)==23*/var x初始化1;数量c=23;最小z=(agm(1,x)-c)^2;解决;打印x;退出;/*FCMP输出参数*/proc fcmp outlib=工作.funcs.test;子程序do_sqr(x,sq,text$);outargs sq,文本;sq=x*x;text='这是输出参数的示例';endsub;运行;选项cmplib=work.funcs;过程操作模型;字符串的init repeat(“”,79);/*保留80字节*/数字n;调用do_sqr(7,n,s);打印sn;退出;/*FCMP函数的常量矩阵自变量*/proc fcmp outlib=工作.funcs.test;函数evalpoly(x,系数[*]);z=0;do i=dim1(系数)到1乘以-1;z=z*x+系数[i];结束;返回(z);endsub;运行;选项cmplib=work.funcs;过程操作模型;数值系数{1..3}=[1,-2,1];变量x;最小z=评估值(x,系数);解决;打印x;退出;/*FCMP矩阵的OPTMODEL声明*/proc fcmp outlib=工作.funcs.test;子例程mattest(x[*]);放置x[1]=;endsub;子程序mattest2(x[*,*]);将x[1,1]=;endsub;运行;选项cmplib=work.funcs;过程操作模型;/*以下数组可以用作矩阵*/num N初始化3;num mat1{1..N}初始化0;调用mattest(mat1);/*好的*/设置S1=1..5;num mat2{S1}初始化0;调用mattest(mat2);/*好的*/设置S2={S1,S1};num mat3{S2}初始化0;调用mattest2(mat3);/*好的*/num mat4{S1交叉S1}初始化0;调用mattest2(mat4);/*好的*/num L初始化1;num mat5{L.N}初始化0;调用mattest(mat5);/*好的*/设置S3初始化S1;num mat6{S3}初始化0;调用mattest(mat6);/*好的*//*在执行时检测到一些错误*/S3=2..5;调用mattest(mat6);/*错误:下限不是1*/S3={1,3,4,5};调用mattest(mat6);/*错误:缺少索引2*/L=0;调用mattest(mat5);/*错误:下限不是1*//*以下数组不能用作矩阵*/数字arr1{1..10乘3};/*步长不是1*/调用mattest(arr1);/*错误*/num arr2{i在1..N中,j在1..N:j>=i};/*使用的选择表达式*/调用mattest2(arr2);/*错误*/num arr3{i在1..N中,j在1..i}中;/*对“i”的索引依赖*/调用mattest2(arr3);/*错误*/退出;/*有关索引集的更多信息*/过程操作模型;put({i在1..3中的集合,j在1..3:j>=i}<i,j>);退出;过程操作模型;put({i在1..3,i..3}中);退出;/*SLICE操作员*/过程操作模型;数量N=3;集合<num,str>S={<1,'a'>,<2,'b'>,<3,'a'>,<4,'b'>};put({i在1..N中,<(i),j>在S}中);放置({i在1..N中,j在切片中(<i,*>,S)});退出;/*解算器状态参数*/proc optmodel打印级别=0;var x初始值1>=0.001;最小z=sin(x)/x;解决;对于{k in/STATUS SOLUTION_STATUS ALGORITHM/}放置_ROPTMODEL_STR_[k]=;用于{k-in/OBJECTIVE迭代/}put _ROPTMODEL_NUM_[k]=;退出;/*宏分辨率*/过程操作模型;变量x,y;最小z=x**2+(x*y-1)**2;对于1..3}do中的{n;固定x=n;解决;%放置第1行&_OROPTMODEL_;放置“第2行”(符号(“_OROPTMODEL_”));结束;退出;/*PROC NLP示例7*/处理nlp全部;参数数量x数量数量数量数量b数量cpooltox pooltoy ctox ctoy pools=1;界限0<=amountx amounty amounta amountb amountc,amountx<=100,数量<=200,0<=pooltox pooltoy ctox ctoy,1个<=池<=3个;lincon amounta+amountb=池tox+池玩具,pooltox+ctox=数量x,pooltoy+ctoy=数量,ctox+ctoy=金额c;nlincon nlc1-nlc2>=0。,nlc3=0。;最大f;costa=6;成本b=16;成本c=10;成本x=9;成本=15;f=成本x*金额x+成本*金额-costa*amounta-costb*amountb-costc*amountc;nlc1=2.5*数量x-池*池tox-2。*ctox;nlc2=1.5*数量-泳池*泳池玩具-2.*ctoy;nlc3=3*amounta+amountb-pools*(amounta+amountb);运行;过程操作模型;var amountx init 1>=0<=100,数量初始化1>=0<=200;var amounta init 1>=0,amountb init 1>=0,amountc init 1>=0;var pooltox初始化1>=0,pooltoy初始化1>=0;var ctox初始化1>=0,ctoy初始值1>=0;var池初始化1>=1<=3;con-amounta+amountb=pooltox+pooltoy,pooltox+ctox=数量x,pooltoy+ctoy=数量,ctox+ctoy=金额c;数字costa,costb,costc,costx,costy;costa=6;成本b=16;成本c=10;成本x=9;成本=15;max f=成本x*金额x+成本*金额-costa*amounta-costb*amountb-costc*amountc;成分nlc1:2.5*数量x-池*池毒素-2.*ctox>=0,nlc2:1.5*数量-泳池*泳池玩具-2.*ctoy>=0,nlc3:3*amounta+amountb-池*(amounta+amountb)= 0;解决;打印数量x数量数量数量b数量cpooltox pooltoy ctox ctoy泳池;