Untitled
unknown
plain_text
2 years ago
20 kB
6
Indexable
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 24 18:35:18 2021
@author: TAIHM
"""
import matplotlib.pyplot as plt
import numpy as np
import math
from math import pi
import random as rd
from numpy import random
import cvxpy as cp
#System parameters
No_eMBB = 5
No_uRLLC = 10
No_mMTC = 20
GRID_WIDTH = 500 #meter
GRIG_LENGTH = 500 #meter
GRID_SIZE = 1 #metter
TIME_SLOT = 1 #second
SPEED = 10 #metter per second
BS_HEIGHT = 20 #m
# Communication parameters
f_c= 6e9 #carrier frequency 6GHz
c= 3e8 #speed of light
alpha_eMBB = 2.7 #pathloss exponent
alpha_uRLLC = 2.7 #pathloss exponent
alpha_mMTC = 3.7 #pathloss exponent
B = 1e6 #Hz Robot bandwidth
P_eMBB = 10 #watt constraint transmit power eMBB service
P_uRLLC = 1 #watt constraint transmit power uRLLC service
P_mMTC = 0.1 #watt constraint transmit power mMTC service
R_eMBB_min = 50 # MBps
R_uRLLC_min = 20 # MBps
R_mMTC_min = 2 # MBps
n_0 = 1e-14 #dBm noise
def normalize(value, minTar, maxTar,minVal=-1,maxVal =1 ):
return ((value- minVal)/(maxVal - minVal))*(maxTar - minTar) + minTar
def get_grid(coordinates):
return [math.ceil(coordinates[0]/GRID_SIZE)-1, math.ceil(coordinates[1]/GRID_SIZE)-1]
def get_coordinates(grid):
return [grid[0]*GRID_SIZE + GRID_SIZE/2,grid[1]*GRID_SIZE + GRID_SIZE/2]
class eMBB:
def __init__(self, X, Y):
self.grid = [X,Y]
self.coordinates = get_coordinates(self.grid)
class uRLLC:
def __init__(self, X, Y):
self.grid = [X,Y]
self.coordinates = get_coordinates(self.grid)
class mMTC:
def __init__(self, X, Y):
self.grid = [X,Y]
self.coordinates = get_coordinates(self.grid)
class Network():
def __init__(self):
self.No_eMBB = No_eMBB
self.No_uRLLC= No_uRLLC
self.No_mMTC = No_mMTC
self.BS = [250,250]
self.No_RBs = 0
self.fairness = 0.0
self.X_eMBB = rd.sample(range(GRID_WIDTH), self.No_eMBB)
self.Y_eMBB = rd.sample(range(GRIG_LENGTH), self.No_eMBB)
self.X_uRLLC = rd.sample(range(GRID_WIDTH), self.No_uRLLC)
self.Y_uRLLC = rd.sample(range(GRIG_LENGTH), self.No_uRLLC)
self.X_mMTC = rd.sample(range(GRID_WIDTH), self.No_mMTC)
self.Y_mMTC = rd.sample(range(GRIG_LENGTH), self.No_mMTC)
# Init services set
self.eMBBs = [eMBB(self.X_eMBB[i],self.Y_eMBB[i]) for i in range(self.No_eMBB)]
self.uRLLCs = [uRLLC(self.X_uRLLC[i],self.Y_uRLLC[i]) for i in range(self.No_uRLLC)]
self.mMTCs = [mMTC(self.X_mMTC[i],self.Y_mMTC[i]) for i in range(self.No_mMTC)]
# Calculate eMBB to BS uplink throughput
self.dis_eMBB = [np.sqrt(pow(self.eMBBs[i].grid[0] - self.BS[0],2) + pow(self.eMBBs[i].grid[1] - self.BS[1],2)
+ pow(BS_HEIGHT,2)) for i in range(self.No_eMBB)]
self.g_eMBB = [random.rayleigh(scale=1.0, size=None)*pow(c/(4*pi*f_c),2)*self.dis_eMBB[i]**(-alpha_eMBB) for i in range(self.No_eMBB)]
self.eMBB_SINR = [P_eMBB*self.g_eMBB[i]/n_0 for i in range(self.No_eMBB)]
self.eMBB_RATE = [np.log2(1 + self.eMBB_SINR[i]) for i in range(self.No_eMBB)]
# Calculate uRLLC to BS uplink throughput
self.dis_uRLLC = [np.sqrt(pow(self.uRLLCs[i].grid[0] - self.BS[0],2) + pow(self.uRLLCs[i].grid[1] - self.BS[1],2)
+ pow(BS_HEIGHT,2)) for i in range(self.No_uRLLC)]
self.g_uRLLC = [random.rayleigh(scale=1.0, size=None)*pow(c/(4*pi*f_c),2)*self.dis_uRLLC[i]**(-alpha_uRLLC) for i in range(self.No_uRLLC)]
self.uRLLC_SINR = [P_uRLLC*self.g_uRLLC[i]/n_0 for i in range(self.No_uRLLC)]
self.uRLLC_RATE = [np.log2(1 + self.uRLLC_SINR[i]) for i in range(self.No_uRLLC)]
# Calculate mMTC to BS uplink throughput
self.dis_mMTC = [np.sqrt(pow(self.mMTCs[i].grid[0] - self.BS[0],2) + pow(self.mMTCs[i].grid[1] - self.BS[1],2)
+ pow(BS_HEIGHT,2)) for i in range(self.No_mMTC)]
self.g_mMTC = [random.rayleigh(scale=1.0, size=None)*pow(c/(4*pi*f_c),2)*self.dis_mMTC[i]**(-alpha_mMTC) for i in range(self.No_mMTC)]
self.mMTC_SINR = [P_mMTC*self.g_mMTC[i]/n_0 for i in range(self.No_mMTC)]
self.mMTC_RATE = [np.log2(1 + self.mMTC_SINR[i]) for i in range(self.No_mMTC)]
def reset(self,eMBB_lambda,uRLLC_lambda,mMTC_lambda ):
"""
Reset the initial value
"""
self.No_eMBB = int(No_eMBB*np.random.normal(loc=eMBB_lambda, scale=0.01))
if self.No_eMBB == 0:
self.No_eMBB = 1
self.No_uRLLC= int(No_uRLLC*np.random.normal(loc=uRLLC_lambda, scale=0.01))
if self.No_uRLLC == 0:
self.No_uRLLC = 1
self.No_mMTC = int(No_mMTC*np.random.normal(loc=mMTC_lambda, scale=0.01))
if self.No_mMTC == 0:
self.No_mMTC = 1
self.BS = [250,250]
self.No_RBs = 0
self.fairness = 0.0
self.X_eMBB = rd.sample(range(GRID_WIDTH), self.No_eMBB)
self.Y_eMBB = rd.sample(range(GRIG_LENGTH), self.No_eMBB)
self.X_uRLLC = rd.sample(range(GRID_WIDTH), self.No_uRLLC)
self.Y_uRLLC = rd.sample(range(GRIG_LENGTH), self.No_uRLLC)
self.X_mMTC = rd.sample(range(GRID_WIDTH), self.No_mMTC)
self.Y_mMTC = rd.sample(range(GRIG_LENGTH), self.No_mMTC)
# Init services set
self.eMBBs = [eMBB(self.X_eMBB[i],self.Y_eMBB[i]) for i in range(self.No_eMBB)]
self.uRLLCs = [uRLLC(self.X_uRLLC[i],self.Y_uRLLC[i]) for i in range(self.No_uRLLC)]
self.mMTCs = [mMTC(self.X_mMTC[i],self.Y_mMTC[i]) for i in range(self.No_mMTC)]
# Calculate eMBB to BS uplink throughput
self.dis_eMBB = [np.sqrt(pow(self.eMBBs[i].grid[0] - self.BS[0],2) + pow(self.eMBBs[i].grid[1] - self.BS[1],2)
+ pow(BS_HEIGHT,2)) for i in range(self.No_eMBB)]
self.g_eMBB = [random.rayleigh(scale=1.0, size=None)*pow(c/(4*pi*f_c),2)*self.dis_eMBB[i]**(-alpha_eMBB) for i in range(self.No_eMBB)]
self.eMBB_SINR = [P_eMBB*self.g_eMBB[i]/n_0 for i in range(self.No_eMBB)]
self.eMBB_RATE = [np.log2(1 + self.eMBB_SINR[i]) for i in range(self.No_eMBB)]
self.eMBB_Request = [int(R_eMBB_min/self.eMBB_RATE[i]) for i in range(self.No_eMBB)]
# Calculate uRLLC to BS uplink throughput
self.dis_uRLLC = [np.sqrt(pow(self.uRLLCs[i].grid[0] - self.BS[0],2) + pow(self.uRLLCs[i].grid[1] - self.BS[1],2)
+ pow(BS_HEIGHT,2)) for i in range(self.No_uRLLC)]
self.g_uRLLC = [random.rayleigh(scale=1.0, size=None)*pow(c/(4*pi*f_c),2)*self.dis_uRLLC[i]**(-alpha_uRLLC) for i in range(self.No_uRLLC)]
self.uRLLC_SINR = [P_uRLLC*self.g_uRLLC[i]/n_0 for i in range(self.No_uRLLC)]
self.uRLLC_RATE = [np.log2(1 + self.uRLLC_SINR[i]) for i in range(self.No_uRLLC)]
self.uRLLC_Request = [int(R_uRLLC_min/self.uRLLC_RATE[i]) for i in range(self.No_uRLLC)]
# Calculate mMTC to BS uplink throughput
self.dis_mMTC = [np.sqrt(pow(self.mMTCs[i].grid[0] - self.BS[0],2) + pow(self.mMTCs[i].grid[1] - self.BS[1],2)
+ pow(BS_HEIGHT,2)) for i in range(self.No_mMTC)]
self.g_mMTC = [random.rayleigh(scale=1.0, size=None)*pow(c/(4*pi*f_c),2)*self.dis_mMTC[i]**(-alpha_mMTC) for i in range(self.No_mMTC)]
self.mMTC_SINR = [P_mMTC*self.g_mMTC[i]/n_0 for i in range(self.No_mMTC)]
self.mMTC_RATE = [np.log2(1 + self.mMTC_SINR[i]) for i in range(self.No_mMTC)]
self.mMTC_Request = [int(R_mMTC_min/self.mMTC_RATE[i]) for i in range(self.No_mMTC)]
self.Sum_Request = sum(self.eMBB_Request ) + sum(self.uRLLC_Request) + sum(self.mMTC_Request)
return self.Sum_Request
def shapley(self):
sum_rate = sum(self.eMBB_RATE) + sum(self.uRLLC_RATE) + sum(self.mMTC_RATE)
sum_request = sum(self.eMBB_Request ) + sum(self.uRLLC_Request) + sum(self.mMTC_Request)
c_eMBB = max((sum(self.eMBB_RATE)/sum_rate)*(self.No_RBs - sum_request),0)
c_uRLLC = max((sum(self.uRLLC_RATE)/sum_rate)*(self.No_RBs - sum_request),0)
c_mMTC = max((sum(self.mMTC_RATE)/sum_rate)*(self.No_RBs - sum_request),0)
v_A = max(0, self.No_RBs - sum_request - c_uRLLC - c_mMTC)
v_B = max(0, self.No_RBs - sum_request - c_eMBB - c_mMTC)
v_C = max(0, self.No_RBs - sum_request - c_eMBB - c_uRLLC)
v_AB = max(0, self.No_RBs - sum_request - c_mMTC)
v_AC = max(0, self.No_RBs - sum_request - c_uRLLC)
v_BC = max(0, self.No_RBs - sum_request - c_eMBB)
v_ABC = max(0, self.No_RBs - sum_request)
#pi_ABC = [v_A, v_AB - v_A, v_ABC - v_AB]
#pi_ACB = [v_A, v_ABC - v_AC, v_AC - v_A]
#pi_BAC = [v_AB - v_B, v_B, v_ABC - v_AB]
#pi_BCA = [v_ABC - v_BC, v_B, v_BC - v_B]
#pi_CAB = [v_AC - v_C, v_ABC - v_AC , v_C]
#pi_CBA = [v_ABC - v_BC, v_BC - v_C, v_C]
#shapley_eMBB = (pi_ABC[0] + pi_ACB[0] + pi_BAC[0] + pi_BCA[0] + pi_CAB[0] + pi_CBA[0])/6
#shapley_uRLLC = (pi_ABC[1] + pi_ACB[1] + pi_BAC[1] + pi_BCA[1] + pi_CAB[1] + pi_CBA[1])/6
#shapley_mMTC = (pi_ABC[2] + pi_ACB[2] + pi_BAC[2] + pi_BCA[2] + pi_CAB[2] + pi_CBA[2])/6
self.shapley_eMBB = (v_A + v_A + v_AB - v_B + v_ABC - v_BC + v_AC - v_C + v_ABC - v_BC)/6
self.shapley_uRLLC = (v_AB - v_A + v_ABC - v_AC + v_B + v_B + v_ABC - v_AC + v_BC - v_C)/6
self.shapley_mMTC = (v_ABC - v_AB + v_AC - v_A + v_ABC - v_AB + v_BC - v_B + v_C + v_C)/6
#lambda_eMBB = np.where(c_eMBB != 0, self.shapley_eMBB/c_eMBB, 0)
#lambda_uRLLC = np.where(c_uRLLC != 0, self.shapley_uRLLC/c_uRLLC, 0)
#lambda_mMTC = np.where(c_mMTC != 0, self.shapley_mMTC/c_mMTC, 0)
# if c_eMBB != 0:
# lambda_eMBB = self.shapley_eMBB + sum(self.eMBB_Request )
# else:
# lambda_eMBB = 0.0 #sum(self.eMBB_Request )
# if c_uRLLC != 0:
# lambda_uRLLC = self.shapley_uRLLC + sum(self.uRLLC_Request)
# else:
# lambda_uRLLC = 0.0 #sum(self.uRLLC_Request)
# if c_mMTC != 0:
# lambda_mMTC = self.shapley_mMTC + sum(self.mMTC_Request)
# else:
# lambda_mMTC = 0.0 #sum(self.mMTC_Request)
lambda_eMBB = self.shapley_eMBB + sum(self.eMBB_Request )
lambda_uRLLC = self.shapley_uRLLC + sum(self.uRLLC_Request)
lambda_mMTC = self.shapley_mMTC + sum(self.mMTC_Request)
#if ((lambda_mMTC!=0)&(lambda_uRLLC!=0)&(lambda_mMTC!=0)):
self.fairness = float((lambda_eMBB+lambda_uRLLC+lambda_mMTC)**2/(3*(lambda_eMBB**2+lambda_uRLLC**2+lambda_mMTC**2)))
self.throughput_eMBB = lambda_eMBB*sum(self.eMBB_RATE)
self.thoughput_uRLLC = lambda_uRLLC*sum(self.uRLLC_RATE)
self.thoughput_mMTC = lambda_mMTC*sum(self.mMTC_RATE)
self.thoughput = lambda_eMBB*sum(self.eMBB_RATE) + lambda_uRLLC*sum(self.uRLLC_RATE) + lambda_mMTC*sum(self.mMTC_RATE)
self.SLA_violation = 0
for i in range(self.No_eMBB):
if self.eMBB_RATE[i]*lambda_eMBB/self.No_eMBB < R_eMBB_min:
self.SLA_violation += 1
for i in range(self.No_uRLLC):
if self.uRLLC_RATE[i]*lambda_uRLLC/self.No_uRLLC < R_uRLLC_min:
self.SLA_violation += 1
for i in range(self.No_mMTC):
if self.mMTC_RATE[i]*lambda_mMTC/self.No_mMTC < R_mMTC_min:
self.SLA_violation += 1
self.SLA_violation = self.SLA_violation/(self.No_eMBB+self.No_mMTC+self.No_uRLLC)
return np.array([self.shapley_eMBB, self.shapley_uRLLC, self.shapley_mMTC])
def optimal(self):
N = self.No_eMBB+self.No_mMTC+self.No_uRLLC
x = cp.Variable(self.No_eMBB)
y = cp.Variable(self.No_mMTC)
z = cp.Variable(self.No_uRLLC)
self.SLA_violation_Opt = 0
self.optimal_rate = 0
self.optimal_fairness = 0
constraints = []
for i in range(self.No_eMBB):
constraints.append(x[i]*self.eMBB_RATE[i]>=R_eMBB_min)
for i in range(self.No_mMTC):
constraints.append(y[i]*self.mMTC_RATE[i]>=R_mMTC_min)
for i in range(self.No_uRLLC):
constraints.append(z[i]*self.uRLLC_RATE[i]>=R_uRLLC_min)
constraints.append(cp.norm1(x) + cp.norm1(y) + cp.norm1(z) <= self.No_RBs)
obj = 0
for i in range(self.No_eMBB):
obj += x[i]*self.eMBB_RATE[i]
for i in range(self.No_mMTC):
obj += y[i]*self.mMTC_RATE[i]
for i in range(self.No_uRLLC):
obj += z[i]*self.uRLLC_RATE[i]
prob = cp.Problem(cp.Maximize(obj), constraints)
prob.solve(solver = "MOSEK")
if x[0].value != None:
#print("optimal var", x.value, y.value, z.value)
#print("status:", prob.status)
#print("optimal value", prob.value)
self.optimal_rate = sum(x.value)*sum(self.eMBB_RATE) + sum(z.value)*sum(self.uRLLC_RATE) + sum(y.value)*sum(self.mMTC_RATE)
self.optimal_fairness = float((sum(x.value)+sum(y.value)+sum(z.value))**2/(3*(sum(x.value)**2+sum(y.value)**2+sum(z.value)**2)))
#print("optimal value:", self.optimal_rate)
#print("Sum X:", cp.sum(x.value).value)
#print("norm1 X:", cp.norm1(x.value).value)
self.SLA_violation_Opt = 0
for i in range(self.No_eMBB):
if self.eMBB_RATE[i]*x[i].value < R_eMBB_min:
self.SLA_violation_Opt += 1
for i in range(self.No_uRLLC):
if self.uRLLC_RATE[i]*z[i].value < R_uRLLC_min:
self.SLA_violation_Opt += 1
for i in range(self.No_mMTC):
if self.mMTC_RATE[i]*y[i].value < R_mMTC_min:
self.SLA_violation_Opt += 1
self.SLA_violation_Opt = self.SLA_violation_Opt/(self.No_eMBB+self.No_mMTC+self.No_uRLLC)
else:
self.SLA_violation_Opt = 1
return self.optimal_rate
###constrained equal award CEA rule
def CEA(self,No_RBs):
eMBB_active = True
uRLLC_active = True
mMTC_active = True
cea_eMBB = 0
cea_uRLLC = 0
cea_mMTC = 0
remain = No_RBs
while (eMBB_active|uRLLC_active|mMTC_active):
if eMBB_active:
cea_eMBB = cea_eMBB + remain/3
if uRLLC_active:
cea_uRLLC = cea_uRLLC+ remain/3
if mMTC_active:
cea_mMTC = cea_mMTC + remain/3
if cea_eMBB >= sum(self.eMBB_Request):
cea_eMBB = sum(self.eMBB_Request)
eMBB_active = False
if cea_uRLLC >= sum(self.uRLLC_Request):
cea_uRLLC = sum(self.uRLLC_Request)
uRLLC_active = False
if cea_mMTC >= sum(self.mMTC_Request):
cea_mMTC = sum(self.mMTC_Request)
mMTC_active = False
remain = remain - (cea_eMBB + cea_uRLLC + cea_uRLLC)
if remain <= 0:
break
self.SLA_violation_CEA = 0
for i in range(self.No_eMBB):
if self.eMBB_RATE[i]*cea_eMBB/self.No_eMBB < R_eMBB_min:
self.SLA_violation_CEA += 1
for i in range(self.No_uRLLC):
if self.uRLLC_RATE[i]*cea_uRLLC/self.No_uRLLC < R_uRLLC_min:
self.SLA_violation_CEA += 1
for i in range(self.No_mMTC):
if self.mMTC_RATE[i]*cea_mMTC/self.No_mMTC < R_mMTC_min:
self.SLA_violation_CEA += 1
self.SLA_violation_CEA = self.SLA_violation_CEA/(self.No_eMBB+self.No_mMTC+self.No_uRLLC)
return cea_eMBB, cea_uRLLC, cea_mMTC
###constrained equal loss CEL rule:
def CEL(self,No_RBs):
eMBB_active = True
uRLLC_active = True
mMTC_active = True
cea_eMBB = sum(self.eMBB_Request)
cea_uRLLC = sum(self.uRLLC_Request)
cea_mMTC = sum(self.mMTC_Request)
remain = No_RBs
while (eMBB_active|uRLLC_active|mMTC_active):
if eMBB_active:
cea_eMBB = cea_eMBB -1
if uRLLC_active:
cea_uRLLC = cea_uRLLC -1
if mMTC_active:
cea_mMTC = cea_mMTC -1
if cea_eMBB <= 0:
eMBB_active = False
if cea_uRLLC <=0:
uRLLC_active = False
if cea_mMTC <=0:
mMTC_active = False
if cea_eMBB + cea_uRLLC + cea_uRLLC <= No_RBs:
break
self.SLA_violation_CEL = 0
for i in range(self.No_eMBB):
if self.eMBB_RATE[i]*cea_eMBB/self.No_eMBB < R_eMBB_min:
self.SLA_violation_CEL += 1
for i in range(self.No_uRLLC):
if self.uRLLC_RATE[i]*cea_uRLLC/self.No_uRLLC < R_uRLLC_min:
self.SLA_violation_CEL += 1
for i in range(self.No_mMTC):
if self.mMTC_RATE[i]*cea_mMTC/self.No_mMTC < R_mMTC_min:
self.SLA_violation_CEL += 1
self.SLA_violation_CEL = self.SLA_violation_CEL/(self.No_eMBB+self.No_mMTC+self.No_uRLLC)
return cea_eMBB, cea_uRLLC, cea_mMTC
#### Contested Garment Consistent CGC Rule:
def CGC(self,No_RBs):
cgc_eMBB = 0
cgc_uRLLC = 0
cgc_mMTC = 0
if sum(self.eMBB_Request) + sum(self.uRLLC_Request) + sum(self.mMTC_Request)>= 2*No_RBs:
cgc_eMBB, cgc_uRLLC, cgc_mMTC = self.CEA(No_RBs)
else:
cgc_eMBB, cgc_uRLLC, cgc_mMTC = self.CEL(No_RBs)
self.SLA_violation_CGC = 0
for i in range(self.No_eMBB):
if self.eMBB_RATE[i]*cgc_eMBB/self.No_eMBB < R_eMBB_min:
self.SLA_violation_CGC += 1
for i in range(self.No_uRLLC):
if self.uRLLC_RATE[i]*cgc_uRLLC/self.No_uRLLC < R_uRLLC_min:
self.SLA_violation_CGC += 1
for i in range(self.No_mMTC):
if self.mMTC_RATE[i]*cgc_mMTC/self.No_mMTC < R_mMTC_min:
self.SLA_violation_CGC += 1
self.SLA_violation_CGC = self.SLA_violation_CGC/(self.No_eMBB+self.No_mMTC+self.No_uRLLC)
return cgc_eMBB, cgc_uRLLC, cgc_mMTC
def propor(self):
self.Sum_Request = sum(self.eMBB_Request ) + sum(self.uRLLC_Request) + sum(self.mMTC_Request)
eMBB_propor = sum(self.eMBB_Request)*self.No_RBs/self.Sum_Request
uRLLC_propor = sum(self.uRLLC_Request)*self.No_RBs/self.Sum_Request
mMTC_propor = sum(self.mMTC_Request)*self.No_RBs/self.Sum_Request
fair_prop = float((eMBB_propor+uRLLC_propor+mMTC_propor)**2/(3*((eMBB_propor)**2+(uRLLC_propor)**2+(mMTC_propor)**2)))
self.SLA_violation_propor = 0
for i in range(self.No_eMBB):
if self.eMBB_RATE[i]*eMBB_propor/self.No_eMBB < R_eMBB_min:
self.SLA_violation_propor += 1
for i in range(self.No_uRLLC):
if self.uRLLC_RATE[i]*uRLLC_propor/self.No_uRLLC < R_uRLLC_min:
self.SLA_violation_propor += 1
for i in range(self.No_mMTC):
if self.mMTC_RATE[i]*mMTC_propor/self.No_mMTC < R_mMTC_min:
self.SLA_violation_propor += 1
self.SLA_violation_propor = self.SLA_violation_propor/(self.No_eMBB+self.No_mMTC+self.No_uRLLC)
return fair_prop
network = Network()
print(network.reset(0.2, 0.2, 0.2) )
network.No_RBs = 100
print(network.propor())
print(network.shapley())
Editor is loading...