接上面的工作 SDR,SDR处理的QCQP问题形式为:
min x ∈ R n x T C x s . t . x T A i x ⊵ i b i , i = 1 , ⋯ , m , \min_{x \in \mathbb{R} ^n} ~~ x^TCx \\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \mathrm {s.t.} ~~x^TA_ix \unrhd_i b_i, ~i = 1,\cdots,m, x∈Rnmin xTCx s.t. xTAix⊵ibi, i=1,⋯,m,
利用SDR方法, 引入一个新的变量 X = x x T X=xx^T X=xxT 作为优化变量, 那么上述问题可以写为
min X ∈ S n T r ( C X ) s . t . T r ( A i X ) ⊵ i b i , i = 1 , ⋯ , m , X ⪰ 0 , r a n k ( X ) = 1. \min_{X \in \mathbb{S} ^n} ~~ \mathrm {Tr}(CX) \\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \mathrm {s.t.} ~~\mathrm {Tr}(A_iX) \unrhd_i b_i, ~i = 1,\cdots,m, \\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ X \succeq 0, \mathrm {rank} (X) =1. X∈Snmin Tr(CX) s.t. Tr(AiX)⊵ibi, i=1,⋯,m, X⪰0,rank(X)=1.
通过松弛掉 r a n k ( X ) = 1 \mathrm {rank} (X) =1 rank(X)=1 约束,直接使用CVX求解这一凸问题, 得到最优解 X ∗ X^* X∗ 。接下来主要围绕如何从一个并不满足秩为1的矩阵 X ∗ X^* X∗ 中恢复出原QCQP问题所需要的向量 x x x。
一种最直观的想法就是, 要从 X ∗ X^* X∗ 中恢复 x x x。通过求解下面问题来获得一个次优解:
min x ∥ X ∗ − x T x ∥ F 2 \min_x \| X^* - x^Tx \|_F^2 xmin∥X∗−xTx∥F2
该问题的最优解, 则由 x x x 等于 X ∗ X^* X∗ 的 “最大特征向量” 乘以 “最大特征值的根” 给出。
对 X ∗ X^* X∗ 做 EVD 分解得到其最大特征向量, 则是一种直截了当的 SDR恢复方式。matlab 代码如下:
[V,D] = eig(X);
[value,num] = max(diag(D));
x = sqrt(value)*V(:,num);
为什么最优解是最大特征向量?
可以延伸到一个更general的问题, 即低秩矩阵近似问题。涉及 瑞利熵问题
EVD分解法恢复 x x x 虽然简单, 但显然有着较高的误差,从而带来不可避免的损失。 那么类似于常见于梯度下降法中,使用多组随机初始点,再挑选性能最优的作为解 这样的 “枚举思想”, SDR也有类似的并不高明但行之有效的性能优化手段。
具体做法为:
首先生成 L L L 组随机向量
ξ ℓ ∼ N ( 0 , X ∗ ) \xi_{\ell} \sim N (0, X^*) ξℓ∼N(0,X∗)
然后找出令目标函数最小的 ξ ℓ \xi_{\ell} ξℓ,即令 ξ ∗ = a r g m i n ℓ ξ ℓ T C ξ ℓ \xi^* = \mathrm {arg min}_{\ell} ~\xi_{\ell}^T C\xi_{\ell} ξ∗=argminℓ ξℓTCξℓ.
需要指出的是, 如果 ξ ℓ \xi_{\ell} ξℓ 不满足原QCQP问题中的约束, 那么需要进行稍微的“魔改”,使得满足原限制条件。然后再利用修改后的 ξ ℓ \xi_{\ell} ξℓ 进行上述操作。 针对不同的问题, 我们可能需要不同的“魔改”。
由上可见,作为一种启发式算法, 魔改的方式不唯一,也不固定,核心要义是要随机出来的向量能满足原问题的限制条件。
具体流程:
matlab代码方面, 关键点则在于如何生成 一个 服从 N ( 0 , X ∗ ) N (0, X^*) N(0,X∗) 的向量呢?
已知 v = randn(n) 可以得到一个 服从 N ( 0 , 1 ) N (0, 1) N(0,1) 的 n 维向量 v。
如果我们对 v 进行乘法操作 v = A v,其分布则变为 N ( 0 , A A H ) N (0, AA^H) N(0,AAH)。 也就是说, 我们只需要找到能使得 A A H = X ∗ AA^H = X^* AAH=X∗ 的 A A A,就可以使用 v = A v 获得满足分布的 v 向量。 而获得这样的 A A A, 则只需要对 X ∗ X^* X∗ 做 Cholesky 分解即可, 对一个半正定矩阵 X X X 作该分解为:
X = A A H X = AA^H X=AAH
for i = 1 : L
v = randn(n);
A = chol(Xstar); # chol 是内置matlab函数, 得到的是 A^H
V(:, i) = A' * v;
end
另,两个工程实例代码详见 HBF 和 RIS
【1】https://blog.csdn.net/weixin_39274659/article/details/121619619
【2】https://blog.csdn.net/weixin_39274659/article/details/103818469
【3】Wu Q , Zhang R . Intelligent Reflecting Surface Enhanced Wireless Network via Joint Active and Passive Beamforming[J]. IEEE Transactions on Wireless Communications, 2019, PP(99):1-1.