优化问题中的变量倒数之和

计算科学 优化 非线性规划 混合整数规划 组合学
2021-12-14 16:09:17

我有以下优化问题:

Minimize1x1+1x2++1dnSubject toAxb
在哪里x=[x1  x2    xn]T,x1,x2,,xn{1,12,13,,1k}对于一些k, 和Ab有积极的条目(A很大但实际上很稀疏)。

维度n不是太大(我会说最多 100 个),但约束的数量可能很大(数十万)。它们是与成对相关的约束x的。如何尝试解决这样的问题?有没有办法将其转换为可以使用 Mosek 等优化包解决的标准形式?

最后,如果离散版本被证明非常困难,我可以解决这个问题的持续放松。如果变量是连续的,则可行空间成为标准凸多面体,但目标函数仍然存在问题。任何想法表示赞赏。

谢谢你。

1个回答

对于离散版本,它可以转换为混合整数线性程序。你只需要注意每个元素xi可以写成xi=j=1kδijj在哪里j=1kδij=1在哪里δij是二进制的。使用相同的二进制变量,倒数很简单xi1=j=1kjδij

这是用于设置和解决概念验证等问题的 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)

手动引入新变量ti替换倒数并添加约束xi1ti, IE,1xiti, 可以写成圆锥约束||1tixi||xi+ti

现在,这是否适用于大型实例,这是一个完全不同的问题。