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