以编程方式识别 Mosek 的解决方案类型参数
Programmatically identify Mosek's solution type parameter
首先,Mosek 的初始化 API 效果很好。我们能够将优化速度提高 25 倍,仅通过对样本问题进行决策变量初始化(所有变量都受积分约束)。
现在,我们正在解决一个新的大规模 MIQCQP 问题(一些变量积分约束和一些连续),我们想要初始化所有这些变量。
当使用 task.putxxslice
API [1] 时,我们在确定 whichsol
参数的值时遇到问题。
疑惑:
由于我们的问题既有积分又有连续,用 whichsol = mosek.soltype.itg
代替所有变量(积分和连续)是否正确?
我们的最终 objective 正在添加此通用支持自定义 Cvxpy。我们几乎已经实现了这一点,只是 - 是否有任何编程方式来决定 Cvxpy 中的 whichsol
?或者更好地问 - 这是正确的方法吗?
if num_bool + num_int > 0: # if problem is Mixed-integer (some integral, some contiguous)
whichsol = mosek.soltype.itg
elif inverse_data['is_LP']: # if problem is LP
whichsol = mosek.soltype.bas
else: # all other cases
whichsol = mosek.soltype.itr
for idx, initial_guess in zip(idx_list, initial_guess_list):
task.putxxslice(whichsol, idx, idx+1, [initial_guess])
[1] - https://docs.mosek.com/latest/pythonapi/optimizer-task.html#mosek.task.putxxslice
在 Mosek 中设置初始点的原因是:
当问题具有整数变量时混合整数求解器的起始可行点,在这种情况下设置 itg
热启动单纯形求解器,在这种情况下设置 bas
.
热启动 conic/interior-point 求解器,在这种情况下设置 itr
,尽管这个选项只是理论上的,因为目前 Mosek 不会热启动并且只是忽略该解决方案.
通常如果问题中有任何整数变量,那么只有 itg
解是相关的。如果问题是线性的,并且通过 Mosek 参数明确选择了单纯形求解器,则只有 bas
解相关。
然而假设问题有整数变量,但用户设置了 Mosek 参数 iparam.mio_mode=ignore
因为现在只想求解 LP 松弛。极不可能有人真的需要这样的组合,但至少在原则上是可能的。然后怎样呢?有很多这样的极端情况,您必须明确检查很多 Mosek 参数(可能会随时间变化)才能做出决定。
解决此问题的一种方法是设置所有三个原始解决方案,并设置参数 iparam.remove_unused_solutions
。然后,一旦 Mosek 内部决定使用哪个优化器,它将清除此时不相关的那些解决方案。
另一种选择是您只设置 itg
解决方案。任何 cvxpy 用户都不太可能将此功能用于除上述 1. 之外的任何其他内容。
首先,Mosek 的初始化 API 效果很好。我们能够将优化速度提高 25 倍,仅通过对样本问题进行决策变量初始化(所有变量都受积分约束)。
现在,我们正在解决一个新的大规模 MIQCQP 问题(一些变量积分约束和一些连续),我们想要初始化所有这些变量。
当使用 task.putxxslice
API [1] 时,我们在确定 whichsol
参数的值时遇到问题。
疑惑:
由于我们的问题既有积分又有连续,用
whichsol = mosek.soltype.itg
代替所有变量(积分和连续)是否正确?我们的最终 objective 正在添加此通用支持自定义 Cvxpy。我们几乎已经实现了这一点,只是 - 是否有任何编程方式来决定 Cvxpy 中的
whichsol
?或者更好地问 - 这是正确的方法吗?
if num_bool + num_int > 0: # if problem is Mixed-integer (some integral, some contiguous)
whichsol = mosek.soltype.itg
elif inverse_data['is_LP']: # if problem is LP
whichsol = mosek.soltype.bas
else: # all other cases
whichsol = mosek.soltype.itr
for idx, initial_guess in zip(idx_list, initial_guess_list):
task.putxxslice(whichsol, idx, idx+1, [initial_guess])
[1] - https://docs.mosek.com/latest/pythonapi/optimizer-task.html#mosek.task.putxxslice
在 Mosek 中设置初始点的原因是:
当问题具有整数变量时混合整数求解器的起始可行点,在这种情况下设置
itg
热启动单纯形求解器,在这种情况下设置
bas
.热启动 conic/interior-point 求解器,在这种情况下设置
itr
,尽管这个选项只是理论上的,因为目前 Mosek 不会热启动并且只是忽略该解决方案.
通常如果问题中有任何整数变量,那么只有 itg
解是相关的。如果问题是线性的,并且通过 Mosek 参数明确选择了单纯形求解器,则只有 bas
解相关。
然而假设问题有整数变量,但用户设置了 Mosek 参数 iparam.mio_mode=ignore
因为现在只想求解 LP 松弛。极不可能有人真的需要这样的组合,但至少在原则上是可能的。然后怎样呢?有很多这样的极端情况,您必须明确检查很多 Mosek 参数(可能会随时间变化)才能做出决定。
解决此问题的一种方法是设置所有三个原始解决方案,并设置参数 iparam.remove_unused_solutions
。然后,一旦 Mosek 内部决定使用哪个优化器,它将清除此时不相关的那些解决方案。
另一种选择是您只设置 itg
解决方案。任何 cvxpy 用户都不太可能将此功能用于除上述 1. 之外的任何其他内容。