SemanticCommunication/code/utils/metrics.py

194 lines
6.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Co-MADDPG Evaluation Metrics | Co-MADDPG 评估指标
This module provides the core performance metrics and reward calculation logic for
the cooperative-competitive multi-agent reinforcement learning (Co-MADDPG) framework
in hybrid semantic-traditional wireless resource allocation.
本模块为混合语义-传统无线资源分配中的协作-竞争多智能体强化学习Co-MADDPG框架
提供核心性能指标和奖励计算逻辑。
Key Metrics:
- Jain's Fairness Index / Jain 公平性指数
- Rate Satisfaction Ratio / 速率满足率
- System-level QoE / 系统级体验质量
- Dynamic Cooperation Weight (λ) / 动态协作权重 (λ)
- Mixed Reward Mechanism / 混合奖励机制
Reference:
- "Dynamic Cooperative-Competitive Multi-Agent Reinforcement Learning for
Resource Allocation in Semantic-Traditional Hybrid Wireless Networks"
"""
import numpy as np
def jain_fairness(values) -> float:
"""
Compute Jain's fairness index. | 计算 Jain 公平性指数。
Formula: J = (Σ x_i)² / (n · Σ x_i²)
公式J = (Σ x_i)² / (n · Σ x_i²)
Returns 0.0 if all values are zero or empty. | 如果所有值均为零或为空,则返回 0.0。
Parameters
----------
values : array_like
Resource allocation or performance metrics (e.g., rates, QoE).
资源分配或性能指标例如速率、QoE
Returns
-------
float
Fairness index in range [1/n, 1.0].
[1/n, 1.0] 范围内的公平性指数。
"""
values = np.asarray(values, dtype=np.float64)
if len(values) == 0:
return 0.0
sum_sq = np.sum(values ** 2)
# Avoid division by zero | 避免除以零
if sum_sq == 0:
return 0.0
# Calculate J index | 计算 J 指数
return float(np.sum(values) ** 2 / (len(values) * sum_sq))
def rate_satisfaction(rates, r_req: float) -> float:
"""
Fraction of users meeting minimum rate requirement. | 满足最小速率要求的用户比例。
Parameters
----------
rates : array_like
Per-user achievable rates.
每个用户可达到的速率。
r_req : float
Minimum rate requirement threshold (R_req).
最小速率要求阈值 (R_req)。
Returns
-------
float
Fraction in [0, 1].
[0, 1] 范围内的比例。
"""
rates = np.asarray(rates)
if len(rates) == 0:
return 1.0
# Count how many users' rates exceed the requirement | 统计速率超过要求的用户数量
return float(np.mean(rates >= r_req))
def compute_system_qoe(qoe_list) -> float:
"""
Compute system-level QoE as mean of per-user QoE values. | 计算系统级 QoE即用户 QoE 的平均值。
Parameters
----------
qoe_list : array_like
List of QoE values for all active users.
所有活跃用户的 QoE 值列表。
Returns
-------
float
Mean system QoE.
平均系统 QoE。
"""
if len(qoe_list) == 0:
return 0.0
# Simple arithmetic mean | 简单算术平均值
return float(np.mean(qoe_list))
def compute_lambda(qoe_sys: float, beta: float = 5.0,
q_th: float = 0.6) -> float:
"""
Compute dynamic cooperation weight λ using sigmoid function. | 使用 Sigmoid 函数计算动态协作权重 λ。
λ(t) = 1 / (1 + exp(-β · (QoE_sys - Q_th)))
Parameters
----------
qoe_sys : float
Current system-level QoE.
当前系统级 QoE。
beta : float
Steepness of the switching transition (β).
切换过渡的陡峭程度 (β)。
q_th : float
QoE threshold for cooperative behavior (Q_th).
协作行为的 QoE 阈值 (Q_th)。
Returns
-------
float
λ value in [0, 1], representing the degree of cooperation.
[0, 1] 范围内的 λ 值,代表协作程度。
"""
# Sigmoid function maps QoE difference to [0, 1] | Sigmoid 函数将 QoE 差异映射到 [0, 1]
return float(1.0 / (1.0 + np.exp(-beta * (qoe_sys - q_th))))
def compute_mixed_reward(qoe_self: float, qoe_other: float,
qoe_sys: float, lambda_val: float,
coop_w=(0.5, 0.3, 0.2),
comp_w=(0.8, 0.2)) -> float:
"""
Compute dynamically mixed cooperative-competitive reward. | 计算动态混合的协作-竞争奖励。
r = λ · r_coop + (1-λ) · r_comp
Parameters
----------
qoe_self : float
Individual QoE of the agent. | 智能体自身的 QoE。
qoe_other : float
Mean QoE of other agents in the same cell. | 同小区内其他智能体的平均 QoE。
qoe_sys : float
Overall system QoE. | 系统整体 QoE。
lambda_val : float
Dynamic cooperation weight (λ). | 动态协作权重 (λ)。
coop_w : tuple
Weights for cooperative reward (self, others, system). | 协作奖励权重(自身、他人、系统)。
comp_w : tuple
Weights for competitive reward (self, system). | 竞争奖励权重(自身、系统)。
Returns
-------
float
The final mixed reward value. | 最终混合奖励值。
"""
# Cooperative reward emphasizes global performance | 协作奖励强调全局性能
r_coop = coop_w[0] * qoe_self + coop_w[1] * qoe_other + coop_w[2] * qoe_sys
# Competitive reward focuses more on individual gain | 竞争奖励更关注个人收益
r_comp = comp_w[0] * qoe_self + comp_w[1] * qoe_sys
# Linear combination based on lambda | 基于 lambda 的线性组合
return float(lambda_val * r_coop + (1.0 - lambda_val) * r_comp)
def moving_average(values, window: int = 50) -> np.ndarray:
"""
Compute moving average of a series for visualization smoothing. | 计算序列的移动平均值,用于可视化平滑。
Parameters
----------
values : array_like
Input time series data. | 输入的时间序列数据。
window : int
Smoothing window size. | 平滑窗口大小。
Returns
-------
np.ndarray
Smoothed series. | 平滑后的序列。
"""
values = np.asarray(values, dtype=np.float64)
if len(values) < window:
return values
# Standard 1D convolution for moving average | 用于移动平均的标准一维卷积
return np.convolve(values, np.ones(window) / window, mode='valid')