电源控制
此示例修改自Boyd、Kim、Vandenberghe和Hassibi的《几何规划教程》”[链接](https://web.stanford.edu/~boyd/papers/pdf/gp_tutorial.pdf)”。
问题数据修改自CVX示例库中相应的示例(Almir Mutapcic)。
此示例制定和解决了一个通信系统的功率控制问题,目标是最小化n个发射机的总发射功率,每个发射机将正功率级别 \(P_1\), \(P_2\), \(\ldots\), \(P_n\) 发送给标为 \(1, \ldots, n\) 的 \(n\) 个接收机,接收机 \(i\) 从发射机 \(i\) 接收信号。
接收机 \(i\) 接收的来自发射机 \(j\) 的功率为 \(G_{ij} P_{j}\),其中 \(G_{ij} > 0\) 表示从发射机 \(j\) 到接收机 \(i\) 的路径增益。接收机 \(i\) 的信号功率为 \(G_{ii} P_i\),干扰功率为 \(\sum_{k \neq i} G_{ik}P_k\)。接收机 \(i\) 的噪声功率为 \(\sigma_i\),接收机 - 发射机对的信噪比(SINR)为
\[S_i = \frac{G_{ii}P_i}{\sigma_i + \sum_{k \neq i} G_{ik}P_k}.\]
发射机和接收机受到最小SINR \(S^{\text{min}}\) 的约束, \(P_i\) 介于 \(P_i^{\text{min}}\) 和 \(P_i^{\text{max}}\) 之间。这给出了问题
\[\begin{split}\begin{array}{ll}
\mbox{最小化} & P_1 + \cdots + P_n \\
\mbox{满足约束} & P_i^{\text{min}} \leq P_i \leq P_i^{\text{max}}, \\
& 1/S^{\text{min}} \geq \frac{\sigma_i + \sum_{k \neq i} G_{ik}P_k}{G_{ii}P_i}.
\end{array}\end{split}\]
import cvxpy as cp
import numpy as np
# 问题数据
n = 5 # 收发器数量
sigma = 0.5 * np.ones(n) # 接收器 i 的噪声功率
p_min = 0.1 * np.ones(n) # 发射器 i 的最小功率
p_max = 5 * np.ones(n) # 发射器 i 的最大功率
sinr_min = 0.2 # 每个接收器的信干噪比阈值
# 路径增益矩阵
G = np.array(
[[1.0, 0.1, 0.2, 0.1, 0.05],
[0.1, 1.0, 0.1, 0.1, 0.05],
[0.2, 0.1, 1.0, 0.2, 0.2],
[0.1, 0.1, 0.2, 1.0, 0.1],
[0.05, 0.05, 0.2, 0.1, 1.0]])
p = cp.Variable(shape=(n,), pos=True)
objective = cp.Minimize(cp.sum(p))
S_p = []
for i in range(n):
S_p.append(cp.sum(cp.hstack(G[i, k]*p[k] for k in range(n) if i != k)))
S = sigma + cp.hstack(S_p)
signal_power = cp.multiply(cp.diag(G), p)
inverse_sinr = S/signal_power
constraints = [
p >= p_min,
p <= p_max,
inverse_sinr <= (1/sinr_min),
]
problem = cp.Problem(objective, constraints)
problem.is_dgp()
True
problem.solve(gp=True)
problem.value
0.9615384629119621
p.value
array([0.18653846, 0.16730769, 0.23461538, 0.19615385, 0.17692308])
inverse_sinr.value
array([5., 5., 5., 5., 5.])
(1/sinr_min)
5.0