鲁棒优化工具包-XProg和RSOME
鲁棒优化工具包-XProg和RSOME
记录一下鲁棒优化学习内容。之前研究过一段时间的鲁棒优化,但由于没有数据也就没有继续研究下去。最近有时间,觉得鲁棒优化比较有意思就继续研究一下。主要结合XProg[1]和RSOME[2]进行鲁棒优化的学习和实际操作。
1.XProg和RSOME
XProg工具箱针对随机规划、鲁棒优化和分布鲁棒优化(DRO)设计的MATLAB工具包,优化问题求解需要调用CPLEX12.6或者依赖C/C++编译器。新加坡国立大学的 Peng Xiong于2016年发布了1.0版本,其后没再更新[3],对于XProg感兴趣的可以通过文献[1]获得源代码。
RSOME是针对鲁棒随机优化(RSO)设计的MATLAB工具箱,其也能够处理一般的随机规划、鲁棒优化和DRO问题[2]。RSO处理的是具有不确定场景(多种场景)的不确定性优化问题。也即是对之前的不确定性问题,例如DRO扩展了多种不同的场景,每种场景具有一定的概率,如果把多场景退化为单场景,也就是最基本的DRO问题。
XProg和RSOME中关于场景(Scenario)的定义和实现不太相同。XProg的场景实现方式主要针对于随机规划(stochastic programming),需要针对每个场景设置不同的参数和概率。针对DRO而言,XProg其一般只关注于模糊集的设计,并且只针对是单一场景。而RSO是对DRO在多场景下的扩展,也即是把DRO从单一的场景推广到了多个不同的场景,并且每一场景的模糊集可以不相同。这也是RSO的定义,多场景下的DRO和随机线性规划。
XProg中大部分的功能和应用场景可以使用RSOME改写建模,因为XProg的作者同样是RSOME的作者之一,二者思想和代码具有相似性。但是对于DRO中具有嵌套子集(非全概率)的情况,自我感觉还无法使用RSOME进行建模。
例如,XProg用户手册中例4.2.1中定义的模糊集:
该种情况,RSOME只能描述前四行表示的模糊集,后两行的情况目前无法表述。
2.错误分析
在使用RSOME的时候遇到了一些错误,记录一下。
(1)对XProg的例4.2.2的多产品报童问题,使用RSOME进行改写。RSOME在建模模糊集时,利用P.suppset()添加集合约束时,需要一次性添加完成,不能分开添加,否则报错(Error using subsref, reference non-existent field objval, Error in Cplex/subsref)。
如上图所示,在定义模糊集时分开定义会报错。
解决办法,将以上图片中的关于suppset的定义全部写到一个suppset()函数中,也即是一次性把不含期望的模糊集定义完成。
(2)相同的程序代码,使用RSOME建模,利用MATLAB2013b和cplex12.4.0求解会报以下错误(Error using subsref, Reference to non-existent field ‘qcpdslack’. Error in Cplex/subsref)
目前原因尚未明确,搜索相关内容没有找到原因和解决方案。
改用高版本的cplex和MATLAB,例如MATLAB2018和cplex12.8.0会报以下错误:(错误使用 cplexlink1280, CPLEX Error: Promotional version. Problem size limits exceeded.)
由于问题求解规模超过cplex教育版的限制,此时解决方案有两种,一是缩减求解问题规模,二是使用无限制版的CPLEX或者其他对应的求解器。但是在使用的算例中(XProg的例4.2.2多产品报童问题)决策变量的规模没有超过10个,即便是引入辅助变量也没有超过30个。自我感觉,可能在使用cplex求解时又涉及相关的问题转换,导致求解变量增加,不知这样理解是否正确,有待探讨。
参考文献
[1]【学界】XPROG: 简单实用的鲁棒优化(RO, DRO)编程语言.
https://zhuanlan.zhihu.com/p/47023680
[2]RSOME: Robust Stochastic Optimization Made Easy. www.rsomerso.com
[3] Peng Xiong. XProg 1.0 Users’ Guide-MATLAB Toolbox for Optimization under Uncertainty, 2016.10.17.