Files
thesis-code/GEOEnv.py
T
2024-03-06 22:40:09 +08:00

95 lines
2.7 KiB
Python

import numpy as np
from GEO_parameters import GEO_Parameters
import torch
class GEOEnv:
def __init__(self, num_satellite = 1, num_carrier_wave = 100, num_beam = 1, num_user_dim = 32, delt_t =5, dataset = "month_2.txt", max_intervals = 8):
self.action_space = num_carrier_wave
self.user_space_dim = num_user_dim
self.user_space = num_user_dim * num_user_dim
self.delt_t = delt_t
self.beams = num_beam
self.satellite = num_satellite
self.steps_before_termination = 0
self.datas = []
self.dataset = dataset
self.num_data = len(self.datas)
self.state = np.zeros((self.action_space+1, self.user_space_dim, self.user_space_dim), dtype=np.uint8)
self.max_intervals = 8
def load_data(self):
with open(self.dataset, 'r') as f:
self.datas = f.readlines()
self.num_data = len(self.datas)
def compute_state(self, index):
# state = self.state.copy()
self.state[-1] = np.zeros_like(self.state[-1])
[date_t, beam_type, user, ap] = self.datas[index].split('\t')
user = int(user)
ap = int(ap)
beam_type = int(beam_type)
i = user//10
j = user%10
t = 0
if ap == 0:
t = beam_type
else:
t = -beam_type
self.state[-1][i][j] = t
return self.state
def compute_reward(self, action):
assert type(action) == int
assert action >= 0 and action < self.action_space
# 功率暂时不用
# 频谱效率
axis2_sum = np.sum(self.state, axis= 2)
matrix_sum = np.sum(axis2_sum, axis=1)
if (matrix_sum)
t = 0.0
for i in range(self.action_space):
if matrix_sum[i] == 0:
t += 1/self.action_space
else:
t += 1/self.action_space * matrix_sum[i]/self.max_intervals
# 用户满意率,即action所在的信道的最大可用带宽的满足程度
b = 0.0
acquire = matrix_sum[-1]
supply = self.max_intervals - matrix_sum[action]
b = min(1.0, acquire/supply)
# 如果用户被拒绝了会有一个非常大的惩罚
if abs(b) < 1e-7 or supply <= 0:
b = -1.0
# 载波共用的惩罚
c:float = 0
# 暂时不动
return t + b
def renew_environment():
pass
def step(self, action):
self.state = self.compute_state(self.steps_before_termination)
reward = self.compute_reward(action)
# self.pre
if __name__ == "__main__":
e = GEOEnv()
e.load_data()
print(len(e.datas))
state = e.compute_state(0)
print(state)
state[1][1][2] = 4
t = e.compute_reward(state, 1)
print(t)