主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

intlinprog 输出函数和绘图函数语法

什么是输出函数和绘图函数?

intlinprog 可以在算法中发生某些事件后调用输出函数或绘图函数。这些事件包括完成算法的某个阶段,例如求解根 LP 问题、添加割点、成功完成启发式算法、在分支定界期间找到新的整数可行解、显著改善相对间隙或探索分支定界树中的多个节点。

小心

intlinprog 输出函数和绘图函数与其他求解器的不同。有关其他 Optimization Toolbox™ 求解器中的输出函数或绘图函数,请参阅 输出函数和绘图函数语法绘图函数

  • 有一个内置输出函数:savemilpsolutions。此函数收集算法在事件时间找到的整数可行点。它将可行点放在基础工作区中名为 xIntSol 的矩阵中,其中每列是一个整数可行点。它将目标函数值保存在名为 fIntSol 的向量中,其中每个条目都是 xIntSol 中相应列的目标函数。

  • 有一个内置绘图函数:optimplotmilp。此函数绘制了内部计算的最佳目标函数值边界。有关其使用示例,请参阅 工厂、仓库、销售分配模型:基于求解器

通过传递 OutputFcnPlotFcn 名称值参量(包括输出函数或绘图函数的句柄)来调用输出函数或绘图函数。例如,

options = optimoptions(@intlinprog,...
    OutputFcn=@savemilpsolutions,PlotFcn=@optimplotmilp);
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,options);

如果您有多个输出函数或绘图函数,请将它们作为元胞数组传递。

options = optimoptions(@intlinprog,...
    OutputFcn={@savemilpsolutions,@customFcn});

注意

绘图函数不支持 subplot 语句,因为绘图函数框架管理轴。要指定多个子图,请编写单独的绘图函数,并将其作为元胞数组传递给求解器:

options = optimoptions("solvername",PlotFcn={@plot1,@plot2,@plot3});

输出函数支持 subplot,因此您可以使用输出函数代替绘图函数,在一个函数中包含多个绘图。

自定义函数语法

使用以下语法编写您自己的输出函数或绘图函数:

function stop = customFcn(x,optimValues,state)

intlinprog 将数据 xoptimValuesstate 传递给您的函数。

  • stop - 设置为 true 以停止 intlinprog。设置为 false 以允许 intlinprog 继续。

  • x - 要么是空矩阵 [],要么是可行点 N×1 向量。仅当 intlinprog 找到新的整数可行解时,x 才为非空。当 xphase'heuristics' 时,'branching' 可以为非空。

  • optimValues - 其详细信息位于 optimValues 结构体 中的结构。

  • state - 以下值之一:

    • 'init' - intlinprog 开始运行。使用此状态来设置您需要的任何图表或数据结构。

    • 'iter' - intlinprog 正在求解问题。访问与解算器进度相关的数据。例如,绘图或执行文件操作。

    • 'done' - intlinprog 已完成求解问题。关闭所有文件,完成注释图等。

有关编写输出或绘图函数的示例,请参阅内置函数 savemilpsolutions.moptimplotmilp.m

optimValues 结构体

optimValues 字段含义
dualbound

最小化问题的目标函数值的全局下界,最大化问题的目标函数值的全局上界。当 phase = 'rootlp' 时为空。

fval

迄今为止在整数可行点处找到的最佳目标函数。当 phase = 'rootlp' 时,fval 是根节点处的目标函数值,不一定是整数可行点。

numfeaspoints

发现可改善当前解的整数可行解的数量。

numnodes

已探索节点的数量。仅当 phase = 'branching' 时才非零。

phase

算法的阶段。对于 "highs" 算法,phase 始终为 ''。对于 "legacy" 算法,可能的值是:

  • 'rootlp' - intlinprog 求解了根 LP 问题。

  • 'cutgen' - intlinprog 增加了割点并提高了下界。

  • 'heuristics' - intlinprog 使用启发式方法找到了新的可行点。

  • 'branching' - intlinprog 正在创建和探索分支定界树中的节点。

  • 'none' - state'done' 并且未找到新点。

relativegap

dualboundfval 之间的相对间隔。

  • 对于 "legacy" 算法,relativegap 是从 0 到 100 的百分比,与 output 参量完全一样。

  • 对于 "highs" 算法,relativegap 是一个从 0 到 1 的标量。

relativegap = phase'rootlp' = numfeaspoints 时,0 为空。

time

到目前为止所花费的时间(以秒为单位),从 state = 'init' 的时间开始使用 tictoc 进行测量。