使用intlinprog函数可以实现混合整数线性规划,该函数的语法格式为:[大谦MATLAB,dqmatlab点com]
x = intlinprog(f,ic,A,b):使目标函数f最小化,并且满足ic中x 的元素为整数,A*x≤b。
x = intlinprog(f,ic,A,b,Aeq,beq):要求还满足等式约束Aeq*x=beq,如果没有不等式存在,设置A=[], b=[]。
x = intlinprog(f,ic,A,b,Aeq,beq,lb,ub):给变量x的取值设置下限和上限,即lb≤x≤ub。如果没有等式存在,则设置Aeq=[], beq=[]。
x = intlinprog(f,ic,A,b,Aeq,beq,lb,ub,options):使用options指定的选项进行最小化。如果没有变量边界约束,设置lb=[], ub=[]。options的设置如表6-1所示。
表6-1 options的设置
| 选 项 | 描 述 | 默 认 值 |
|---|---|---|
| AbsoluteGapTolerance | 非负实数。如果目标函数计算值的上界和下界之差小于或等于AbsoluteGapTolerance,则intlinprog函数计算终止 | 0 |
| BranchRule | 分枝时选择元素的规则: ' maxpscost'——具有最大伪距的分数部分 ' mostfractional'——分数部分接近1/2 ' maxfun'——目标向量f的绝对值中具有最大对应分量的分数 | ' maxpscost' |
| ConstraintTolerance | 1E-9~1E-3的实数,这是线性约束可以得到的最大的差异,并且仍然被认为是满意的。该值不是计算终止阈值 | 1e-4 |
| CutGeneration | 剪枝水平,具体介绍如下: ' none':没有剪枝 ' basic':正常剪枝 ' intermediate':中度剪枝 ' advanced':重度剪枝 | ' basic' |
| CutMaxIterations | 在进入分支和绑定阶段之前,遍历所有剪枝生成方法的数量(值为1~50的整数)。通过将剪切生成选项设置为“否”,禁用剪切生成 | 10 |
| Display | 显示级别,具体介绍如下: ' off'或' none':没有迭代显示 ' final':只显示最终值 ' iter':显示迭代信息 | ' iter' |
| Heuristics | 搜索可行点的算法: ' none' ' rss' ' round' ' rins' | ' rss' |
| HeuristicsMaxNodes | 严格的正整数,它限制节点的数目,可以在其分支定界搜索中搜索可行点 | 50 |
| IntegerPreprocess | 整数预处理的类型,具体介绍如下: ' none':使用极少数整数预处理步骤 ' basic':使用中等数量的整数预处理步骤 ' advanced':使用所有可用的整数预处理步骤 | ' basic' |
| IntegerTolerance | 1E-6~1E-3的实数,其中解X的分量可以具有整数的最大偏差,并且仍然被认为是整数。该值不是终止阈值 | 1e-5 |
| LPMaxIterations | 严格的正整数,分支定界计算中每个节点上单纯型算法迭代的最大次数 | 3e4 |
| LPOptimalityTolerance | 非负实数,减小值必须大于该值 | 1e-7 |
| LPPreprocess | 松弛线性规划解的预处理类型,具体介绍如下: ' none' :没有预处理 ' basic' :使用预处理 | ' basic' |
| MaxNodes | 严格的正整数,是intlinprog函数进行分支定界处理时的最大节点数 | 1e7 |
| MaxFeasiblePoints | 严格的正整数,如果intlinprog函数找到MaxFeasiblePoints个整数可行点,则它会终止计算 | Inf |
| MaxTime | 正的实数,规定intlinprog函数运行的最大时间,按秒计算 | 7200 |
| NodeSelection | 选择下一步探索的节点,具体介绍如下: ' simplebestproj' :使用最佳投影 ' minobj' :使用最小化目标函数 ' mininfeas' :使用整数不可行解的最小和 | ' simplebestproj' |
| ObjectiveCutOff | 实数,在分支定界计算中,intlinprog函数丢弃任何线性规划解的目标值大于ObjectiveCutOff的任意节点 | Inf |
| ObjectiveImprovementThreshold | 非负实数,只有当intlinprog函数找到另一个目标函数值,它比当前可行解至少小ObjectiveImprovementThreshold时,该函数才改变当前可行解的值。要求满足(fold-fnew)/(1+fold)>ObjectiveImprovementThreshold |
1e-4 |
| OutputFcn | 指定优化函数调用事件的一个或多个函数,既可以是函数句柄,也可以是函数句柄的元胞数组 | [ ] |
| PlotFcn | 在算法执行时绘制不同的进度度量,从预定义的图中选择或自己编写。传递函数句柄或函数句柄的元胞格数组 | [ ] |
| RelativeGapTolerance | 0~1的实数。如果目标函数的内部计算的上界和下界的相对差小于或等于RelativeGapTolerance,则intlinprog函数计算停止 | 1e-4 |
| RootLPAlgorithm | 求解线性规划的算法,具体介绍如下所示: ' dual-simplex' :对偶单纯型算法 ' primal-simplex' :原始单纯型算法 | ' dual-simplex' |
| RootLPMaxIterations | 非负整数,即单纯型算法迭代的最大数,用来求解初始线性规划问题 | 3e4 |
x = intlinprog(problem):使用problem结构封装所有的求解器输入。该结构包含的字段名包括前面介绍的语法格式中的所有的输入参数名称,即f、ic、Aineq、bineq、Aeq、beq、lb、ub、solver、options等。其中,f、ic、solver和options是必需的,其他的为可选。例如
problem.f=[1,2,3];
problem.ic=[2,3];
problem.options=optimoptions('intlinprog');
problem.Aineq=[-3,-2,-1];
problem.bineq=-20;
problem.lb=[-6.1,-1.2,7.3];
problem.solver='intlinprog';
[x,fval,exitflag,output] = intlinprog(___):对于上面指定的任何输入变量,返回目标值fval和描述退出条件的exitflag,以及包含优化处理信息的output结构。
exitflag的取值及其所表示的意义如下所示。
2:intlinprog函数过早终止,找到整数可行点。
1:intlinprog函数收敛于解x。
0:intlinprog函数过早终止,没有找到整数可行点。
-1:intlinprog函数因为输出函数或绘图函数终止。
-2:没有找到可行点。
-3:无解。
output结构中的字段如表6-2所示。
表6-2 output结构中的字段
| 字 段 | 描 述 |
|---|---|
| relativegap | intlinprog函数所采用的分支定界算法计算得到的目标函数值的上界(U)和下界(L)之间的相对差异。
relativegap=(U-L)/(abs(U)+1)
如果ic=[],则relativegap=[] |
| absolutegap | intlinprog函数所采用的分支定界算法计算得到的目标函数值的上界(U)和下界(L)之间的绝对差异。 absolutegap=U-L 如果ic=[],则absolutegap=[] |
| numfeaspoints | 找到的整数可行点的个数。 如果ic=[],则numfeaspoints=[]。同样,如果出现松弛问题是不可行的,则numfeaspoints=[] |
| numnodes | 分支定界算法中的节点个数。如果在预处理或初始剪枝时就找到了问题的解,则numnodes=0。 如果ic=[],则numnodes=[] |
| constrviolation | constrviolation = max([0; norm(Aeqx-beq, inf); (lb-x); (x-ub); (Aix-bi)]) |
| message | 退出信息 |