高斯信道中的最优功率和带宽分配

作者:Robert Gowers,Roger Hill,Sami Al-Izzi,Timothy Pollington和Keith Briggs

来自Boyd和Vandenberghe的《凸优化》,练习4.62第210页

考虑一个系统,中心节点向n个接收器传输消息。每个接收器信道:math:i in {1,…,n}`有一个发送功率:math:`P_i 和带宽:math:W_i。总功率和带宽的一部分被分配给每个信道,使得:math:sum_{i=1}^{n}P_i = P_{tot} 和:math:sum_{i=1}^{n}W_i = W_{tot}。给定每个信道比特率的效用函数:math:u_i(R_i),目标是最大化总效用:math:U = sum_{i=1}^{n}u_i(R_i)

假设每个信道都受到高斯白噪声的干扰,信噪比由:math:beta_i P_i/W_i`给出。这意味着比特率由以下公式给出: :math:`R_i = alpha_i W_i log_2(1+beta_iP_i/W_i),其中:math:alpha_i\(\beta_i\) 是已知正常量。

其中一个最简单的效用函数是数据速率本身,它也给出了一个凸目标函数。

因此,最优化问题的数学表示为: 最小化 \(\sum_{i=1}^{n}-\alpha_i W_i \log_2(1+\beta_iP_i/W_i)`条件为 :math:\)sum_{i=1}^{n}P_i = P_{tot} quad sum_{i=1}^{n}W_i = W_{tot} quad P succeq 0 quad W succeq 0`

尽管这是一个凸优化问题,但由于 \(P_i\)\(W_i\) 是变量,必须将其重新写成 DCP 形式,因为 DCP 禁止直接将一个变量除以另一个变量。为了将问题重写为 DCP 格式,我们利用 CVXPY 中的 \(\texttt{kl_div}\) 函数来计算 Kullback-Leibler 散度。

\(\text{kl_div}(x,y) = x\log(x/y)-x+y\)

\(-R_i = \text{kl_div}(\alpha_i W_i, \alpha_i(W_i+\beta_iP_i)) - \alpha_i\beta_iP_i\)

现在目标函数已经处于 DCP 形式,可以使用 CVXPY 求解该问题。

#!/usr/bin/env python3
# @作者: R. Gowers, S. Al-Izzi, T. Pollington, R. Hill & K. Briggs

import numpy as np
import cvxpy as cp
def optimal_power(n, a_val, b_val, P_tot=1.0, W_tot=1.0):
    # 输入参数: α 和 β 是 R_i 方程中的常数
    n = len(a_val)
    if n != len(b_val):
        print('alpha 和 beta 向量必须具有相同的长度!')
        return 'failed', np.nan, np.nan, np.nan

    P = cp.Variable(shape=n)
    W = cp.Variable(shape=n)
    alpha = cp.Parameter(shape=n)
    beta = cp.Parameter(shape=n)
    alpha.value = np.array(a_val)
    beta.value = np.array(b_val)

    # 这个函数将被用作目标函数,因此必须是 DCP 的;
    # 即,内部的元素乘法必须发生在 kl_div 内部,
    # 而不是外部,否则求解器无法知道它是 DCP 的...
    R = cp.kl_div(cp.multiply(alpha, W),
                  cp.multiply(alpha, W + cp.multiply(beta, P))) - \
                  cp.multiply(alpha, cp.multiply(beta, P))

    objective = cp.Minimize(cp.sum(R))
    constraints = [P>=0.0,
                   W>=0.0,
                   cp.sum(P)-P_tot==0.0,
                   cp.sum(W)-W_tot==0.0]

    prob = cp.Problem(objective, constraints)
    prob.solve()

    return prob.status, -prob.value, P.value, W.value

示例

考虑有5个通道的情况, \(n=5\), \(\alpha = \beta = (2.0,2.2,2.4,2.6,2.8)\), \(P_{\text{tot}} = 0.5\)\(W_{\text{tot}}=1\)

np.set_printoptions(precision=3)
n = 5               # 系统中接收器的数量

a_val = np.arange(10,n+10)/(1.0*n)  # α
b_val = np.arange(10,n+10)/(1.0*n)  # β
P_tot = 0.5
W_tot = 1.0
status, utility, power, bandwidth = optimal_power(n, a_val, b_val, P_tot, W_tot)

print('状态: {}'.format(status))
print('最优效用值 = {:.4g}'.format(utility))
print('最优功率水平:\n{}'.format(power))
print('最优带宽:\n{}'.format(bandwidth))
状态: 最优
最优效用值 = 2.451
最优功率水平:
[1.151e-09 1.708e-09 2.756e-09 5.788e-09 5.000e-01]
最优带宽:
[3.091e-09 3.955e-09 5.908e-09 1.193e-08 1.000e+00]