电力系统OTS问题中MATPOWER调用MOSEK求解非最优解的优化问询
关于MATPOWER调用MOSEK求解OTS问题的优化疑问解答
问题背景
在电力系统最优输电开关(OTS)场景下,通过MATPOWER调用MOSEK求解混合整数线性规划(MILP)问题,该问题包含极小化目标函数、若干线性约束及二进制变量。在IEEE 9节点测试算例中,求解器返回的解技术上合理正确,但并非最优:MOSEK分支定界算法得到的解需要断开2条线路,而手动推导的最优解仅需断开1条线路,且目标函数值更低。目标函数为:
Total cost = generation_cost + B*(number_of_switching_actions)
其中B为手动设置的权重系数,用于调节开关操作的权重。
已尝试操作
- 增大B值,无明显效果;
- 手动验证认为的最优解,其目标函数值确实更低;
- 在MATPOWER中设置MOSEK参数,代码如下:
%% load the options mpopt = mpoption(); mpopt.model = 'DC'; mpopt = mpoption(mpopt, 'opf.dc.solver', 'MOSEK'); %% Set the Mosek solver parameters mpopt = mpoption(mpopt, ... 'mosek.lp_alg', 0, ... 'mosek.max_it', 1000, ... 'mosek.gap_tol', 1e-7, ... 'mosek.max_time', 60, ... 'mosek.num_threads', 4 ... ); mpopt.verbose = 4 ;
但优化间隙和计算时间无明显变化,MOSEK始终返回以下结果:
An optimal solution satisfying the relative gap tolerance of 1.00e-02(%) has been located. The relative gap is 0.00e+00(%). An optimal solution satisfying the absolute gap tolerance of 0.00e+00 has been located. The absolute gap is 0.00e+00.
问题解答
1. 是否能更好地控制算法,以更多计算时间为代价找到更优解?
可以通过调整MOSEK的混合整数优化(MIO)参数,强制求解器进行更彻底的搜索:
- 收紧间隙容忍度:直接设置MIO专用的间隙参数,比如
mosek.mio_tol_rel_gap和mosek.mio_tol_abs_gap为1e-9级别的严格阈值,避免求解器提前终止。 - 关闭启发式剪枝:设置
mosek.mio_heuristic_level为0,减少求解器依赖启发式算法提前返回次优解的可能,让分支定界遍历更多分支。 - 延长计算时间:将
mosek.max_time从60调至300或600,给求解器充足时间探索解空间。 - 调整分支策略:设置
mosek.mio_branch_strategy为1(强分支策略),虽然计算速度变慢,但能更精准地选择分支变量,减少无效搜索。 - 开启详细日志:将
mpopt.verbose设为5,查看分支定界过程中上下界的变化,确认是否存在被遗漏的更优解。
2. 该问题是否与数值误差或约束公式有关(尽管当前解正确)?
大概率是约束建模或数值缩放的问题:
- 约束检查:核实OTS问题中二进制开关变量与线路潮流的耦合约束是否正确。比如线路断开时的潮流约束是否严格置零,是否因数值精度问题被求解器判定为不可行。
- 数值缩放:如果
generation_cost的量级远大于B*(number_of_switching_actions),求解器会优先优化发电成本,忽略开关次数的减少。可调整B的量级至与发电成本匹配,或对目标函数进行归一化处理。 - 完整性约束验证:确认MATPOWER是否将线路开关变量正确标记为二进制变量,可通过高 verbose 级别输出模型变量类型来验证。
- 手动解可行性验证:将手动解代入MATPOWER的所有约束条件,检查是否严格满足(包括不等式约束的边界),若手动解处于约束边界,可能因数值误差被求解器判定为不可行。
3. MATPOWER是否会影响求解器的正常使用?
MATPOWER作为建模工具,可能在模型传递或参数映射环节出现问题:
- 参数映射偏差:MATPOWER对MOSEK参数的封装可能存在偏差,比如你设置的
mosek.gap_tol可能未正确传递给MIO的间隙参数。可直接使用原生参数结构体设置:
mpopt.mosek.params.MIO_TOL_REL_GAP = 1e-9; mpopt.mosek.params.MIO_TOL_ABS_GAP = 1e-9; mpopt.mosek.params.MAX_TIME = 300;
- 模型简化问题:MATPOWER的DC-OPF模型可能对OTS约束进行了简化,导致求解器得到的解并非全局最优。可手动构建MILP模型直接调用MOSEK求解,与MATPOWER结果对比,确认是否为建模问题。
- 版本兼容性:检查MATPOWER与MOSEK的版本是否兼容,旧版本MATPOWER可能不支持MOSEK的部分参数设置,导致参数无效。
内容的提问来源于stack exchange,提问作者user30342358
相关产品推荐
相关产品推荐

