【源碼】移動邊緣計算卸載機制MEC Offloading Python(Matlab)仿真

之前看了一個移動邊緣計算的三級卸載方案,然後打算做一個仿真,論文名如下
《Energy-efficient Offloading for Mobile Edge Computing in 5G Heterogeneous Networks》
由於文中涉及的變量和公式過多,導致仿真異常難做
這裏整理出幾個問題和大家一起討論
已經做好的代碼見下文,歷時10天(中間有大大小小的事情)
由於本文的變量較多,而且目前在度娘和github也搜不到數據集
所以,所有的數據都是我假設出來的,通過隨機函數給出
分配信道的過程不好量化就省略了
本文出現的疑問將會持續更新。

1、任務是原子級的,不可進一步劃分
2、MEC服務器允許多個計算任務同時進行
3、回傳的功耗是忽略的,因爲回傳是與其他基礎設施共享的
4、SBS到底經不經過MBS,文中說的不經過(用的or),但是要回傳幹什麼
5、功率調節機制可參照參考文獻【36】
6、設備所需的總信道數應該小於MBS和SBS共有的信道數
7、選擇了SBS就不能選其他的,選擇本地和MBS和local也是同理
8、一個迭代階段,一個任務只能選擇一個信道傳輸至MBS
9.每個MBS信道的發射功率相同,不同的信道不同的只能是信道增益

僞代碼

#include<stdio.h>
#inlcude<math.h>
int main()
{
#定義大基站結構體MBS
int mbs[50];
int sbs[50];
int Pr=4//MEC服務器的計算能力是4GHZ/s
double Pl[i]=random(0.11//用戶的計算能力是0.1-1
int Rr=1//MEC服務器的能耗是1W/GHZ
float Fai=0.0001//回傳時延係數fa=0.0001秒/KB
int d[50]=random(300,800)
float c[50]=random(0.1,1)
float dead[50]=random(0.5,1)
int el[i];
#下面是假設的係數#
pm、gm//大基站的信道增益和傳輸功率未知-------------------思考一個問題:基站上的每個信道是否不同
ps、gs//小基站的信道增益和傳輸功率未知
rou=-100//背景噪聲功率dBm
I//彼此信道干擾
#臨時篩選用的數組#
GR[50]
GL[50]
GO[50]
/*class mbs:
    def __init__(self):
        self.rate = 0  # 傳輸速率
        self.than = 0  # 信噪比
        self.time = 0  # 時間
*/		
int Pr=1 #(fr)MEC的計算能力,是一個常數
mb = pm*gm/(I+rou*rou)#信噪比
mr = w*log(2,1+mt)#速率
mt = d[i]/mr+c[i]/Pr#傳輸時間
####同理可得####
sb
sr
st=d[i]/sr+c[i]/Pr+d[i]*Fai
########第一級卸載機制########
for(i=0,j=0,k=0,l=0;i<=49;i++{
tl[i]=c[i]/Pl
if(tl>dead[i])
GR[j++]=i;
else if(tl<=dead[i])
{
int nm=di/((dead[i]-ci/pl[i])*(wlong2,(1+pm*gm/(rou*rou))))	
int ns=di/((dead[i]-ci/pl[i]-d[i]*Fai)*(wlong2,(1+ps*gs/(rou*rou))))
int min=minimize(pm*nm,ps*ns)//缺少的數據:pm[i];gm[i];ps[i];gs[i];el[i]
if(e[i]<min)
Gl[k++]=i;
}	
else
{GO[l++]=i;
}
########第二級卸載機制########
int m;##係數m未知,大小需要假設出來
int G0[25];
int Ai,hm,hs
#每個任務計算mb sb
for(i=0;i<50;i++)
{
	for(k=0;k<50;k++){
	if(mb>=m)
		hm++;
	if(sb>=m)
		hs++;
	}
}
#每個任務計算h
for(i=0;i<50;i++){
if(hm>=hs)
{int h[i]=hm;
p[j]=h[i];
j=i;}
else
{h[i]=hs;
p[j]=h[i];
j=i;
}
}
for(i=0;i<=50;i++)
{
en=el[i]-c[i]*Rr
p[i]=t1*(dead[i]/sum(dead[i]))+t2*(h[i]/sum(h[i]))+t3*(sum(en)/en)	
}	
#排序p[i]
#
#WARNING:想要進行下一步動作,還得讓每一個i對應相應的設備i(用一步結構體)
#而且GR有最高的優先級,先選擇信道,剩下的信道再留給GO進行選擇
#
########第三級卸載機制########
for(i=0;i<50;i++{
if((pm/mr>=ps/sr)&&(e[i]<el))#還是先把ps pr規定好了
}

真正的代碼如下: 目前已做出來第一級卸載機制

當然目前也遇到了不少問題
問題:

1、回傳機制是啥樣的,爲什麼小基站傳大基站沒有能耗

2、ps gs pm gm大基站小基站傳輸的信道增益和信道功率未知

3、卸載機制二中,總傳輸速度是怎麼算的

4、信道分配問題,爲什麼二三級卸載機制只處理待處理集,那些在第一級已經確定的設備優先選擇信道嗎?(並行問題)

5、第三級卸載機制中,爲什麼p最小的先選信道

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 22 11:28:38 2019

@author: han
"""
import numpy as np
import matplotlib.pyplot as plt
from math import log
import operator
 
###正常情況無卸載機制###

el=np.random.randint(1,10,100) #一個cpu週期的本地的能耗
y=[]
cl=np.random.randint(1,10,100)#計算此任務所需的能力,能cpu週期規劃
d =np.random.randint(300,800,100)#每個計算任務的大小
x = np.linspace(10,100,10,dtype=int)#x個移動設備

print(x)
for i in x:
    print(i)
    sum=0
    for j in range(i):
        sum = sum+(2*cl[j]*el[j])/100
  #  print(sum)
    y.append(sum);
print(y)
plt.plot(x,y,color='blue',linestyle='-')
plt.title('Handsome Programmers picture')


###第一級卸載機制如下###
pl=np.random.randint(1,10,100)
tl=[]#本地計算任務消耗時間
GR=[]#傳給MEC服務器的設備集合
GL=[]#本地計算任務的集合
GO=[]#繼續篩選的集合
le=[]#單個任務本地消耗的能耗
ns=[]#在小基站計算的設備數目
nm=[]#在大基站計算的設備數目
L=[]

def findMin(alist):
    findMin = alist[0];
    for i in range(1,len(alist)):
        if alist[i] < findMin:
            findMin = alist[i]
    return findMin
tl = (cl*10.0)//pl############## deadline和tmax的精度不對
dead=np.random.randint(5,10,100)
print(x)
for k in x:
    if k==100:
        break;
    if tl[k] > dead[k]:
        print('success!!!')
        GR.append(k)
    elif tl[k]<=dead[k]:
        le = cl*el
        print('wonderful!!!')
        ns=d/((dead-cl/4)*log((1+40),2))#【【大基站和小基站的傳輸功率未知這裏統一成20W】】
        nm=d/((dead-cl/4)*log((1+80),2))#【【大基站和小基站的傳輸功率未知這裏統一成20W】】
        L=[ns[k],nm[k]]
        p=findMin(L)
        if el[k]<p:
            GL.append(k)
            print('1')
        else:
            GO.append(k)
            print('2')
print('next is the answer of first jih')
print(GR)
print(GL)
print(GO)

##第二級卸載機制##
            
##第三級卸載機制##

在這裏插入圖片描述

最後的結果,做出前兩級機制,並沒有考慮第三級信道的分配

大體圖已經畫出
由於信道不好量化就省略了第二級和第三級卸載機制
目前擬理解是分配信道的量化是通過速度來衡量,不同的信道速度不同

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 22 11:28:38 2019

@author: han
"""
import numpy as np
import matplotlib.pyplot as plt
from math import log

 
###正常情況無卸載機制###

el=np.random.randint(1,10,100) #一個cpu週期的本地的能耗
y=[]
cl=np.random.randint(1,10,100)#計算此任務所需的能力,能cpu週期規劃
d =np.random.randint(300,800,100)#每個計算任務的大小
x = np.linspace(10,100,10,dtype=int)#x個移動設備

print(x)
for i in x:
    print(i)
    sum=0
    for j in range(i):
        sum = sum+(2*cl[j]*el[j])/100#加了個2調整係數
  #  print(sum)
    y.append(sum);
print(y)
plt.plot(x,y,color='blue',linestyle='-')
plt.title('Handsome Programmers picture')




###########第一級卸載機制如下###############
pl=np.random.randint(1,10,100)#擴大了10倍,使用的時候請注意,本地功率
tl=[]#本地計算任務消耗時間
GR=[]#傳給MEC服務器的設備集合
GL=[]#本地計算任務的集合
GO=[]#繼續篩選的集合
le=[]#單個任務本地消耗的能耗
ns=[]#在小基站計算的設備數目
nm=[]#在大基站計算的設備數目
L=[]
p={}

def findMin(alist):
    findMin = alist[0];
    for i in range(1,len(alist)):
        if alist[i] < findMin:
            findMin = alist[i]
    return findMin
tl = (cl*10.0)//pl# deadline和tmax的精度不對,已修正
dead=np.random.randint(5,10,100)
print(x)

for i in range(0,99):
    print('this i is=====',i)
    if tl[i] > dead[i]:
        print('success!!!')
        GR.append(i)
    elif tl[i]<=dead[i]:
        le = cl*el
        print('wonderful!!!')
        ns=d/((dead-cl/4)*log((1+40*20/100),2))#{論文裏的公式}【【大基站和小基站的傳輸功率未知這裏統一成20W】】??背景噪聲功率
        nm=d/((dead-cl/4)*log((1+80*20/100),2))#{論文裏的公式}【【大基站和小基站的傳輸功率未知這裏統一成20W】】??背景噪聲功率
        L=[40*ns[i],80*nm[i]] #warning!40和80的單位,而且忘記乘10000
        c=findMin(L)
        p[i]=c/100#調整係數
        if el[i]<p[i]:
            GL.append(i)
            print('GL!')
        elif el[i]>=p[i]:
            GO.append(i)
            print('2')
print('next is the answer of first Offloading')
print('GR=',GR)
print('GL=',GL)
print('GO=',GO)
###########第二級卸載機制############
#圖中第二條線
len1=len(GR)
len2=len(GL)
len3=len(GO)
z=[]
v=[]
test=[]
sum1=0
sum2=0

for i in range(0,99):
    #sum1=0
    for j in range(len1):
        if GR[j]==i:
            r=log((1+40*20/100),2)
            sum1 = sum1+(d[i]/r+cl[i]*0.0001)/1500###warning 1500準備調節
            sum2 = sum2+(d[i]/r+cl[i]*0.0001)/1500###warning 1500準備調節
     #       print('ONE SUM',sum1)
            break;
    for j in range(len2):
        if GL[j]==i:
            r=log((1+80*20/100),2)
            sum1 = sum1+(2*cl[i]*el[i])/100 #加了個調節係數的2
            sum2 = sum2+(2*cl[i]*el[i])/100 #加了個調節係數的2
           # sum1 = sum1+(2*d[i]/r+cl[i]*0.0001)/1000###warning 1000準備調節,2是大基站的p
           #=print('TWO SUM',sum1)
            break;
    sum1 = sum1+(d[i]/r+cl[i]*0.0001)/800###warning 1500準備調節
    rm=log((1+80*20/100),2)
    rs=log((1+40*20/100),2)
    tm = d/rm+c/4
    ts = d/rs+d*0.0001+c/4
    if tm[i] < ts[i]:
        sum2 = sum2+(2*d[i]/rm+cl[i]*0.0001)/1500###warning 1000準備調節,2是大基站比小基站多的
    else:
        sum2 = sum2+(d[i]/rs+cl[i]*0.0001)/1500###warning 1000準備調節
           #         print('THREE SUM',sum1)
#print(sum)
    if i==0 or (i+1)%10==0:
        z.append(sum1);
        v.append(sum2);
print(z)
print(v)
plt.plot(x,z,color='red',linestyle='--')
plt.plot(x,v,color='green',linestyle=':')
###########第二級卸載機制############
###因爲不知道信道怎麼根據任務大小而分配,難道和信道增益有關?
##分配好了之後,再怎麼量化考慮?
###########信道數未考慮##########
#rm=[]#速率
#rs=[]#速率
#leng=len(GO)
#rm[i]=log((1+40),2)
#ct=2**(d[i]/dead[i]-rm[i])-1
#snr=#信噪比
##第三級卸載機制##
###########第三級卸載機制############
########第三條線#########

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191230163808279.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NDQ0MDM5,size_16,color_FFFFFF,t_70![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191230163819884.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NDQ0MDM5,size_16,color_FFFFFF,t_7
在這裏插入圖片描述

藍線是Computing without offloading

紅線是Offloading scheme without device priorities

綠線是EECO scheme

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章