matlab运行所有linprog algortithms(是否有matlab列表的算法?)

时间:2017-06-04 21:13:44

标签: matlab optimization linear-programming

Matlab提供了多种解决线性程序的算法。 例如,Matlab R2012b提供:' active-set',' trust-region-reflect',' interior-point',' interior-point-convex& #39;,' 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最佳。

1 个答案:

答案 0 :(得分: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并没有像你希望的那样简单,因为你所要求的并不是一个好主意。

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

毕竟,为什么停止只是循环使用替代算法?为什么不循环使用其他选项的许多值,例如约束公差,最优公差,最大功能评估数等等?这些可能具有影响事物作为算法选择的可能性。很快你就会运行一个优化算法来搜索原始优化的元参数空间。

这不是一个很好的计划 - 可能更好的选择一种推荐的算法,坚持下去,如果事情没有成功,那么就要专注于改善问题的表达,而不是过度调整优化本身。