【问题标题】:matlab running all linprog algortithms (is there a matlab-list of algorithms?)运行所有 linprog 算法的 matlab(是否有 matlab 算法列表?)
【发布时间】:2017-11-05 15:07:41
【问题描述】:

Matlab 提供了多种求解线性规划的算法。 例如 Matlab R2012b 提供:'active-set'、'trust-region-reflective'、'interior-point'、'interior-point-convex'、'levenberg-marquardt'、'trust-region-dogleg'、'lm -line-search' 或 'sqp'。

但其他版本的 Matlab 支持不同的算法。

我想在用户 Matlab-Version 支持的所有算法上运行一个循环。我希望它们像Matlab的推荐顺序一样被订购。

我想实现这样的东西:

i=1;
x=[];
while (isempty(x))
    options=optimset(options,'Algorithm',Here_I_need_a_list_of_Algorithms(i))
    x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options);
end

在 99% 的情况下,这段代码应该等价于

x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options);

但有时由于数值问题(exitflag -4),算法会返回一个空数组。如果其他算法之一有可能找到解决方案,我也想尝试一下。

所以我的问题是: 是否有可能自动获取已安装的 Matlab 版本支持的所有 linprog 算法的列表,如 Matlab 推荐的那样。

我认为循环遍历所有算法在其他场景中也很有意义。例如,当您需要非常精确的数据并且有很多时间时,您可以将它们全部运行,然后评估哪个会给出最好的结果。 或者想遍历所有算法,如果想找出哪种算法最适合具有某种结构的 LP。

【问题讨论】:

  • 我对 matlab 不是很熟悉,但是 quick check 对我来说只显示了对偶单纯形和两个内点算法,这是我所预料的(你真的在谈论 LP 吗?)。当然,大多数非线性方法也可以解决 LP,但我不建议这样做。我不知道这些实现有多好,但 LP 应该不会太麻烦(除了非常不稳定的配方)。我会尝试双单纯形和内点算法,而忽略其他一切! (这也简化了关于准确性的推理)
  • @sascha 不幸的是,我的旧 Matlab R2012b 中没有实现双单形。但你是对的,双单形是当前 Matlab R2017a 的默认设置。你是对的,仅适用于 LP •大规模内点 •中规模活动集 •中规模单纯形是有用的选项,因为我最初的问题中提到的一些算法不是 LP 求解器。跨度>

标签: matlab optimization linear-programming


【解决方案1】:

据我所知,没有自动的方法可以做到这一点。如果你真的想这样做,最简单的做法是去在线文档,并检查以前的版本(在线文档适用于旧版本,而不仅仅是最新版本),并构造一些像这样的变量:

r2012balgos = {'active-set', 'trust-region-reflective', 'interior-point', 'interior-point-convex', 'levenberg-marquardt', 'trust-region-dogleg', 'lm-line-search', 'sqp'};

...

r2017aalgos = {...};

v = ver('matlab');

switch v.Release
    case '(R2012b)'
        algos = r2012balgos;
    ....
    case '(R2017a)'
        algos = r2017aalgos;
end

% loop through each of the algorithms

看起来很无聊,但应该只需要大约 30 分钟。

不过,MathWorks 没有让这一切变得像您希望的那样简单是有原因的,因为您所要求的并不是一个好主意。

可以构建一个算法找到解决方案而其他算法没有找到解决方案的人为问题。但在实践中,通常如果推荐的算法没有找到解决方案,这并不表示您应该切换算法,这表明您的问题没有很好地表述,您应该考虑修改它,也许通过修改一些约束,或重新制定目标函数。

毕竟,为什么只停止循环遍历替代算法呢?为什么不循环遍历其他选项的大量值,例如约束容差、最优容差、函数评估的最大数量等?这些可能与算法选择一样影响事物的可能性。很快您就会运行一种优化算法,在元参数空间中搜索您的原始优化。

这不是一个好计划 - 最好只选择一种推荐的算法,坚持下去,如果事情没有解决,那么专注于改进问题的表述,而不是过度调整优化本身。

【讨论】:

  • 在我的算法中,LP 以理论上必须有解决方案的方式制定。但是在不到 1% 的情况下,我得到了一个 exitflag -4:Exiting:无法收敛,因为原始残差、对偶残差或上限可行性为 NaN。 (当然,我检查了求解器输入中没有 NaN。)我在互联网上发现的关于 exitflag -4 的唯一信息是de.mathworks.com/matlabcentral/answers/…,它似乎是 matlab 求解器的错误。只需更改参数即可避免exitflag -4。
  • 如果你有退出标志 -4,这意味着你在优化的某个地方得到了 NaN,它不能继续。当然,这可能是一个错误,但这不太可能,并且您提到的链接中没有任何内容表明这一点。更有可能的是,您已经以 NaN 在某些方面是正确的方式来阐述您的问题。也许改变参数意味着这些点被避免了。或者你可以重新表述你的问题,这样 NaN 就不会出现。
  • 为了帮助诊断问题,为什么不尝试将Display 选项设置为iter-detailed,这样您就可以准确地看到每次迭代中发生的情况。我猜你会发现 NaN 是正确的,这将帮助你重新组织事情,以免它们继续发生。
猜你喜欢
  • 2019-04-03
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多