from __future__ import division
import numpy as np
import time
import random
import math
np.random.seed(1234)
'''
定义了架构的四个基本CLASS,分别是:V2Vchannels,V2Ichannels,Vehicle,Environ。
其中Environ的方法(即函数)最多,Vehicle没有函数只有几个属性,其余两者各有两个方法(分别是计算路损和阴影衰落)。
'''
class V2Vchannels:
# Simulator of the V2V Channels
# 内部参数:这里将bs和ms的高度设置为1.5m,阴影的std为3,都是来自TR36 885-A.1.4-1(规范);载波频率为2,单位为GHz;
def __init__(self):
self.t = 0
self.h_bs = 1.5
self.h_ms = 1.5
self.fc = 2
self.decorrelation_distance = 10
self.shadow_std = 3
# 计算路损
def get_path_loss(self, position_A, position_B):
d1 = abs(position_A[0] - position_B[0])
d2 = abs(position_A[1] - position_B[1])
d = math.hypot(d1, d2) + 0.001 # 返回欧几里德范数
d_bp = 4 * (self.h_bs - 1) * (self.h_ms - 1) * self.fc * (10 ** 9) / (3 * 10 ** 8)
def PL_Los(d):
if d <= 3:
return 22.7 * np.log10(3) + 41 + 20 * np.log10(self.fc / 5)
else:
if d < d_bp:
return 22.7 * np.log10(d) + 41 + 20 * np.log10(self.fc / 5)
else:
return 40.0 * np.log10(d) + 9.45 - 17.3 * np.log10(self.h_bs) - 17.3 * np.log10(self.h_ms) + 2.7 * np.log10(self.fc / 5)
def PL_NLos(d_a, d_b):
n_j = max(2.8 - 0.0024 * d_b, 1.84)
return PL_Los(d_a) + 20 - 12.5 * n_j + 10 * n_j * np.log10(d_b) + 3 * np.log10(self.fc / 5)
if min(d1, d2) < 7:
PL = PL_Los(d)
else:
PL = min(PL_NLos(d1, d2), PL_NLos(d2, d1))
return PL # + self.shadow_std * np.random.normal()
# 更新阴影衰落 # 这个更新公式是出自文献[1]-A-1.4 Channel model表格后的部分
def get_shadowing(self, delta_distance, shadowing):
return np.exp(-1 * (delta_distance / self.decorrelation_distance)) * shadowing \
+ math.sqrt(1 - np.exp(-2 * (delta_distance / self.decorrelation_distance))) * np.random.normal(0, 3) # standard dev is 3 db
# 包含的两个方法和V2V相同,但是计算路损的时候不再区分Los了
# 两个方法均是文献[1]-Table A.1.4-2的内容和其后的说明
class V2Ichannels:
# Simulator of the V2I channels
def __init__(self):
self.h_bs = 25
self.h_ms = 1.5
self.Decorrelation_distance = 50
self.BS_position = [750 / 2, 1299 / 2] # center of the grids
self.shadow_std = 8
def get_path_loss(self, position_A):
d1 = abs(position_A[0] - self.BS_position[0])
d2 = abs(position_A[1] - self.BS_position[1])
distance = math.hypot(d1, d2)
return 128.1 + 37.6 * np.log10(math.sqrt(distance ** 2 + (self.h_bs - self.h_ms) ** 2) / 1000) # + self.shadow_std * np.random.normal()
def get_shadowing(self, delta_distance, shadowing):
nVeh = len(shadowing)
self.R = np.sqrt(0.5 * np.ones([nVeh, nVeh]) + 0.5 * np.identity(nVeh))
return np.multiply(np.exp(-1 * (delta_distance / self.Decorrelation_distance)), shadowing) \
+ np.sqrt(1 - np.exp(-2 * (delta_distance / self.Decorrelation_distance))) * np.random.normal(0, 8, nVeh)
class Vehicle:
# Vehicle simulator: include all the information for a vehicle
# 初始化时需要传入三个参数:起始位置、起始方向、速度。
# 函数内部将自己定义两个list:neighbors、destinations,分别存放邻居和V2V的通信端(这里两者在数值上相同,因为设定V2V的对象即为邻居)
def __init__(self, start_position, start_direction, velocity):
self.position = start_position
self.direction = start_direction
self.velocity = velocity
self.neighbors = []
self.destinations = []
class Environ:
# 初始化需要传入4个list(为上下左右路口的位置数据):down_lane, up_lane, left_lane, right_lane;地图的宽和高;
# 车辆数和邻居数。除以上所提外,内部含有好多参数,如下:
def __init__(self, n_veh, n_neighbor):
# ################## SETTINGS ######################
# 参数初始化:这部分直接写在代码中,没有函数,大概包括:地图属性(路口坐标,整体地图尺寸)、#车、#邻居、#RB、#episode,一些算法参数
# 对于地图参数 up_lanes / down_lanes / left_lanes / right_lanes 的含义,首先要了解本次所用的系统模型由3GPP TR 36.885的城市案例
# 给出,每条街有四个车道(正反方向各两个车道) ,车道宽3.5m,模型网格(road grid)的尺寸以黄线之间的距离确定,为433m*250m,
# 区域面积为1299m*750m。仿真中等比例缩小为原来的1/2(这点可以由 width 和 height 参数是 / 2 的看出来),
# 反映在车道的参数上就是在 lanes 中的 i / 2.0 。
'''
下面以 up_lanes 为例进行说明。在上图中我们可以看到,车道宽3.5m,所以将车视作质点的话,应该是在3.5m的车道中间移动的,
因此在 up_lanes 中 in 后面的 中括号里 3.5 需要 /2,第二项的3.5就是通向双车道的第二条车道的中间;
第三项 +250 就是越过建筑物的第一条同向车道,以此类推
'''
up_lanes = [i / 2.0 for i in
[3.5 / 2, 3.5 / 2 + 3.5, 250 + 3.5 / 2, 250 + 3.5 + 3.5 / 2, 500 + 3.5 / 2, 500 + 3.5 + 3.5 / 2]]
down_lanes = [i / 2.0 for i in
[250 - 3.5 - 3.5 / 2, 250 - 3.5 / 2, 500 - 3.5 - 3.5 / 2, 500 - 3.5 / 2, 750 - 3.5 - 3.5 / 2,
750 - 3.5 / 2]]
left_lanes = [i / 2.0 for i in
[3.5 / 2, 3.5 / 2 + 3.5, 433 + 3.5 / 2, 433 + 3.5 + 3.5 / 2, 866 + 3.5 / 2, 866 + 3.5 + 3.5 / 2]]
right_lanes = [i / 2.0 for i in
[433 - 3.5 - 3.5 / 2, 433 - 3.5 / 2, 866 - 3.5 - 3.5 / 2, 866 - 3.5 / 2, 1299 - 3.5 - 3.5 / 2,
1299 - 3.5 / 2]]
width = 750 / 2
height = 1298 / 2
self.down_lanes = down_lanes
self.up_lanes = up_lanes
self.left_lanes = left_lanes
self.right_lanes = right_lanes
self.width = width
self.height = height
self.V2Vchannels = V2Vchannels()
self.V2Ichannels = V2Ichannels()
self.vehicles = []
self.demand = []
self.V2V_Shadowing = []
self.V2I_Shadowing = []
self.delta_distance = []
self.V2V_channels_abs = []
self.V2I_channels_abs = []
self.V2I_power_dB = 23 # 23dBm = 0.199W
# self.V2V_power_dB_List = [23, 15, 5, -100] # the power levels.23dBm=0.199W;15dBm=0.03W;5dBm=0.003W;-100dBm=0.1pW
#self.V2V_power_dB_List = [23, 20, 17, 14, 11, 8, 5, -100] # the power levels.23dBm=0.199W;15dBm=0.03W;5dBm=0.003W;-100dBm=0.1pW
self.sig2_dB = -114
self.bsAntGain = 8 # 基站单天线增益
self.bsNoiseFigure = 5 # 基站噪声系数
self.vehAntGain = 3 # 车辆单天线增益
self.vehNoiseFigure = 9
self.sig2 = 10 ** (self.sig2_dB / 10) # dB转化成mW单位
self.n_RB = n_veh # 正交频带数目
self.n_Veh = n_veh
self.n_neighbor = n_neighbor
self.time_fast = 0.001
self.time_slow = 0.1 # update slow fading/vehicle position every 100 ms
self.bandwidth = int(1e6) # bandwidth per RB, 1 MHz
self.demand_size = int((4 * 190 + 300) * 8 * 1) # V2V payload: 2 * 1060 Bytes every 100 ms
self.V2V_Interference_all = np.zeros((self.n_Veh, self.n_neighbor, self.n_RB)) + self.sig2 # 定义RB为频域上连续的12个子载波
# 添加车:有两个方法�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
VN-MADDPG This is the source code for our paper: 基于多智能体深度强化学习的车联网通信资源分配优化. A brief introduction of this work is as follows: 无线网络的高速发展为车联网提供了更好的支持,但是如何为高速移动车辆提供更高质量的服务仍然是一个挑战.通过分析多个车对车(Vehicle-to-Vehicle, V2V)链路重用的车对基础设施(Vehicle-to-Infrastructure, V2I)链路占用的频谱,研究了基于连续动作空间的多智能体深度强化学习的车联网中的频谱共享问题.车辆高移动性带来的信道的快速变化为集中式管理网络资源带来了局限性,因此将资源共享建模为多智能体深度强化学习问题,提出一种基于分布式执行的多智能体深度确定性策略梯度(Multi-Agent Deep Deterministic Policy Gradient, MADDPG)算法.每个智能体与车联网环境进行交互并观察到自己的局部状态,均获得一个共同的奖励,通过汇总其他智能体的动作集中训练Critic网络,从而
资源推荐
资源详情
资源评论
收起资源包目录
人工智能-项目实践-强化学习-Code for paper 基于多智能体深度强化学习的车联网通信资源分配优化.zip (19个子文件)
VN-MADDPG-main
SAMADDPG
Environment_marl.py 31KB
DDPG_method.py 11KB
MADQN
madqn.py 14KB
replay_memory.py 2KB
Environment_marl.py 30KB
__pycache__
replay_memory.cpython-37.pyc 1KB
Environment_marl.cpython-37.pyc 16KB
Random
Environment_marl.py 32KB
random.py 6KB
MADDPG
replay_buffer.py 6KB
model_agent_maddpg.py 5KB
replay_memory.py 1KB
segment_tree.py 5KB
Environment_marl.py 33KB
maddpg.py 13KB
__pycache__
model_agent_maddpg.cpython-37.pyc 3KB
Environment_marl.cpython-37.pyc 17KB
segment_tree.cpython-37.pyc 5KB
replay_buffer.cpython-37.pyc 6KB
共 19 条
- 1
博士僧小星
- 粉丝: 2229
- 资源: 5988
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页