将最小化绝对值加权和改为线性优化

问题描述 投票:0回答:1

例如,我们有一个优化问题

分钟 $$\Sum_{i=1}^{i=n} |w_{i} - a_{i}| * b_{i}$$ 英石。 \sum_{i=1}^{n} ci * wi = 0

并给出 ai、bi、ci。如何将其转换为线性程序?

我知道如果我们想要最小化 |x - a|,我们应该让 b 最小化,其中 b > x-a 且 b > -(x-a)。然而,在这种情况下,我们想要最小化绝对值的加权和并且不知道bi的符号。有谁知道怎么办吗

python optimization linear-programming convex-optimization cxvpy
1个回答
0
投票

仅当 ${b}_{i} \geq 0$ 时,问题才是凸的,否则问题不是凸的。
为了看到它,假设问题是一维的,所有都是标量。
设置 $a = 0, b = -1$ 的输出函数 $- \left| w ight|$ 不是凸的(它是凹的)。

假设 ${b}_{i}$ 为非负值,则:

import numpy as np
import scipy as sp

# %%
numElements = 10
vA = np.random.randn(numElements)
vB = np.random.randn(numElements)
vC = np.random.randn(numElements)

hObjFun = lambda vW: np.dot(np.abs(vW - vA), np.maximum(vB, 0))

# %%
# Solution in the given formulation

vW1 = cp.Variable(numElements)

oObjFun = cp.Minimize( cp.abs(vW1 - vA).T @ cp.pos(vB) )
oCvxPrb = cp.Problem(oObjFun, [(vW1.T @ vC) == 0])
oCvxPrb.solve(solver = cp.CLARABEL)

# %% 
# Solution in Linear Programming form

vW2 = cp.Variable(numElements)
vT = cp.Variable(numElements)

oObjFun = cp.Minimize( vT.T @ cp.pos(vB) )
oCvxPrb = cp.Problem(oObjFun, [(vW2.T @ vC) == 0, vW2 - vA <= vT, -vT <= vW2 - vA])
oCvxPrb.solve(solver = cp.CLARABEL)

# %%
# Verify solution

np.isclose(hObjFun(vW1.value), hObjFun(vW2.value)) #<! Should print `True

© www.soinside.com 2019 - 2024. All rights reserved.