我有以下优化问题:
在哪里,对于一些, 和和有积极的条目(很大但实际上很稀疏)。
维度不是太大(我会说最多 100 个),但约束的数量可能很大(数十万)。它们是与成对相关的约束的。如何尝试解决这样的问题?有没有办法将其转换为可以使用 Mosek 等优化包解决的标准形式?
最后,如果离散版本被证明非常困难,我可以解决这个问题的持续放松。如果变量是连续的,则可行空间成为标准凸多面体,但目标函数仍然存在问题。任何想法表示赞赏。
谢谢你。
我有以下优化问题:
维度不是太大(我会说最多 100 个),但约束的数量可能很大(数十万)。它们是与成对相关的约束的。如何尝试解决这样的问题?有没有办法将其转换为可以使用 Mosek 等优化包解决的标准形式?
最后,如果离散版本被证明非常困难,我可以解决这个问题的持续放松。如果变量是连续的,则可行空间成为标准凸多面体,但目标函数仍然存在问题。任何想法表示赞赏。
谢谢你。
对于离散版本,它可以转换为混合整数线性程序。你只需要注意每个元素可以写成在哪里在哪里是二进制的。使用相同的二进制变量,倒数很简单
这是用于设置和解决概念验证等问题的 YALMIP 代码(免责声明,与 Mosek 接口的 MATLAB Toolbox YALMIP 由我开发)
k = 5;
n = 10;
delta = binvar(n,k,'full')
x = delta*(1./(1:k))';
xinv = delta*(1:k)';
A = randn(2*n,n);
b = 10*rand(2*n,1);
Constraints = [A*x <= b, sum(delta,2) == 1];
Objective = sum(xinv);
optimize(Constraints,Objective)
value(x)
你所说的连续版本是一个凸程序,因为逆在正正数上是凸的。反标量可以很容易地重新表述为涉及二阶锥的模型,因此您可以在 Mosek 中将其作为二阶锥程序来解决。如果您使用凸性感知 cpower 运算符,YALMIP 会自动执行此操作。
x = sdpvar(n,1);
Constraints = [A*x <= b, 0 <= x <= 1];
optimize(Constraints,sum(cpower(x,-1)))
value(x)
手动引入新变量替换倒数并添加约束, IE,, 可以写成圆锥约束
现在,这是否适用于大型实例,这是一个完全不同的问题。