我是优化领域的新手,正在尝试使用 CVX 优化问题。这就是我定义目标的方式:
cvx_begin
variables x1 x2 % Define the optimization variables
expression obj % Define the objective function expression
% Define the objective function
obj = x1 + x2 + 1/log2(1 + x1/(1 + x2)) + 1/log2(1 + x2/(1 + x1));
% Minimize the objective function
minimize(obj)
cvx_end
但是出现了这个错误:
纪律凸规划错误: 无法执行以下操作:{real affine} ./ {real affine}
./ 中的错误(第 19 行) z = 次( x, y, './' );
* 错误(第 36 行) z = feval( 操作符, x, y );
/ 中的错误(第 15 行) z = mtimes( x, y, 'rdivide' );
测试错误(第7行) obj = x1 + x2 + 1/log2(1 + x1/(1 + x2)) + 1/log2(1 + x2/(1 + x1));
我尝试使用 inv_pos 之类的
% Start the CVX optimization
cvx_begin
variables x1 x2 % Define the optimization variables
expression obj % Define the objective function expression
% Reformulate the objective function
obj = x1 + x2 + inv_pos(log(2) * log(1 + x1/(1 + x2))) + inv_pos(log(2) * log(1 + x2/(1 + x1)));
% Minimize the objective function
minimize(obj)
cvx_end
但问题在于。
您在 CVX 中遇到的错误源于 CVX 强制执行“纪律凸规划 (DCP)”规则。如果 CVX 不将优化变量之间的除法等操作视为凸函数,则
x1/(1+x2)
会违反这些规则。
您需要将术语
1/log2(1 + x1/(1 + x2))
和 1/log2(1 + x2/(1 + x1))
重新表述为 CVX 接受的凸形式。您可能想使用这些术语的“凸近似”。
我的方法可能取决于您要优化的目标函数的确切形式。
如果您要使用 log-sum-exp 函数来改进您的问题,该函数被认为是凸函数,可以用作基于对数的表达式的近似值。
$$\text{log-sum-exp}(x) = \log \left( \sum_i e^{x_i} \right)$$
(该方程基于 LaTeX)
CVX 还提供
rel_entr(x, y)
函数来计算 x log (x/y)
,可用于将对数项重写为凸形式。
cvx_begin
variables x1 x2
expression obj
% Reformulate the objective using relative entropy (convex reformulation of log)
obj = x1 + x2 + rel_entr(1, 1 + x1/(1 + x2)) / log(2) + rel_entr(1, 1 + x2/(1 + x1)) / log(2);
% Minimize the objective
minimize(obj)
cvx_end
如果这种方法不起作用,您可能需要简化或线性化函数的某些部分。如果您的目标是非凸的,您可以使用的其他优化方法包括基于梯度的优化。