diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..a1df6bb --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../../../../:\Users\shahab\Desktop\wireless\wireless-suite\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a2e120d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..82c0b8f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/other.xml b/.idea/other.xml new file mode 100644 index 0000000..640fd80 --- /dev/null +++ b/.idea/other.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/wireless-suite.iml b/.idea/wireless-suite.iml new file mode 100644 index 0000000..c838657 --- /dev/null +++ b/.idea/wireless-suite.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/wireless/agents/noma_ul_time_freq_resource_allocation_v0/noma_ul_proportional_fair.py b/wireless/agents/noma_ul_time_freq_resource_allocation_v0/noma_ul_proportional_fair.py index 5189520..ca6b975 100644 --- a/wireless/agents/noma_ul_time_freq_resource_allocation_v0/noma_ul_proportional_fair.py +++ b/wireless/agents/noma_ul_time_freq_resource_allocation_v0/noma_ul_proportional_fair.py @@ -50,7 +50,7 @@ def _calculate_wsr(self, perm_idx, rx_pwr_mw, w): return wsr def act(self, state, reward, done): - o, cqi, b, buffer_size_per_ue = ProportionalFairAgent.parse_state(state, self.K, self.L) + o, cqi, b, buffer_size_per_ue, throughput = ProportionalFairAgent.parse_state(state, self.K, self.L) p = state[-1] diff --git a/wireless/agents/time_freq_resource_allocation_v0/proportional_fair.py b/wireless/agents/time_freq_resource_allocation_v0/proportional_fair.py index 3769ff6..2d19fb7 100644 --- a/wireless/agents/time_freq_resource_allocation_v0/proportional_fair.py +++ b/wireless/agents/time_freq_resource_allocation_v0/proportional_fair.py @@ -67,3 +67,46 @@ def _calculate_priorities(self, cqi, o, b, buffer_size_per_ue): se[cqi == i] = self.CQI2SE[i] priorities = (1 + o) / b * buffer_size_per_ue * se return priorities + + +class Knapsackagent(ProportionalFairAgent): + def __init__(self, action_space, n_ues, buffer_max_size): + super().__init__(action_space, n_ues, buffer_max_size) + self.r = None + self.window = 25 * 10 + + def _calculate_priorities(self, cqi, o, b, buffer_size_per_ue, throughput): + # Normalized values + k_cqi = (cqi / 15) + k_buffer = (buffer_size_per_ue / (throughput + 1)) + k_age = (o / b) + k_fairness = (1 / (1 + self.n)) + # tanh as ranking function for values + priorities = 1 * np.tanh(k_cqi) + 1 * np.tanh(k_buffer) + 1 * np.tanh(k_age) + 1 * np.tanh(k_fairness) + return priorities + + def act(self, state, reward, done): + # reset the self.r + if self.t % self.window == 0: + self.r = np.zeros(shape=(self.K,), dtype=np.float32) + + o, cqi, b, buffer_size_per_ue = self.parse_state(state, self.K, self.L) + + priorities = self._calculate_priorities(cqi, o, b, buffer_size_per_ue, self.r) + + self.buffer_size_moving_average(state) + + action = np.argmax(priorities) + self.n[action] += 1 + + self.t += 1 + return action + + def buffer_size_moving_average(self, state): + s = np.reshape(state[self.K:self.K * (1 + self.L)], + (self.K, self.L)) # Sizes in bits of packets in UEs' buffers + buffer_size_per_ue = np.sum(s, axis=1) + # Moving Average of buffer sizes + if self.t % 25 == 0 and self.t != 0: + self.r = (1 - 0.1) * self.r + buffer_size_per_ue * 0.1 + diff --git a/wireless/envs/time_freq_resource_allocation_v0.py b/wireless/envs/time_freq_resource_allocation_v0.py index 8dfdd25..2b13884 100644 --- a/wireless/envs/time_freq_resource_allocation_v0.py +++ b/wireless/envs/time_freq_resource_allocation_v0.py @@ -270,3 +270,5 @@ def _generate_traffic(self): def _update_state(self): self.state = np.concatenate((self.cqi, self.s.flatten(), self.e.flatten(), self.qi.flatten(), [self.p])) + + diff --git a/wireless/scripts/launch_agent.py b/wireless/scripts/launch_agent.py index 507e485..d3352e6 100644 --- a/wireless/scripts/launch_agent.py +++ b/wireless/scripts/launch_agent.py @@ -50,8 +50,8 @@ def main(_run): eirp_dbm=_run.config['env']['eirp_dbm'], f_carrier_mhz=_run.config['env']['f_carrier_mhz'], max_pkt_size_bits=_run.config['env']['max_pkt_size_bits'], it=_run.config['env']['non_gbr_traffic_mean_interarrival_time_ttis']) # Init environment - env.seed(seed=_run.config['seed'] + ep) - + env.seed(seed=_run.config['seed'] + ep) + # Init agent if ac["agent"]["agent_type"] == "random": agent = RandomAgent(env.action_space) @@ -64,6 +64,8 @@ def main(_run): agent = ProportionalFairAgent(env.action_space, env.K, env.L) elif ac["agent"]["agent_type"] == "proportional fair channel aware": agent = ProportionalFairChannelAwareAgent(env.action_space, env.K, env.L) + elif ac["agent"]["agent_type"] == "knapsack": + agent = Knapsackagent(env.action_space, env.K, env.L) else: raise NotImplemented