認知無線電切換演算法,基於排隊論原始碼
clear
clc
rand('twister',1);
blockpu=[];
blocksu=[];
for N=3:2:7
block=[];
for lambdap =0.01:0.05:0.5
%*****************************************
%假設 1. CR網路和主網路(授權網路)共同存在於同一區域,並且使用同一頻段。假設該頻段共有N個通道,每個主使用者或CR使用者每次接入只佔用一個通道。
% 若所有通道均被主使用者佔用,此時CR使用者到達就被阻塞。若CR使用者正在使用的通道有主使用者出現,此時CR使用者被迫中斷,並進入快取區排隊等待
% 空閒可用通道以繼續剛被中斷的通訊,若等待超過一定時限,則判定CR使用者強制中斷退離快取區。
% 故共有三個佇列,分別表示如下:
% X佇列——主使用者佇列,搶佔優先,優先順序最高
% Y佇列——次使用者佇列,優先順序最低
% Z佇列——次使用者切換佇列,優先順序次高,若在時延Tao內,則較次使用者佇列優先接入可用通道
% 2. 主使用者和次使用者的到達服從泊松分佈,引數分別為lambdap和lambdas,平均服務時間服從引數為mup和mus的負指數分佈
% 3. 對次使用者而言,主使用者搶佔優先。總共有N個通道,也就是最多可以有N個主使用者搶佔所有通道,
% 故Z佇列的長度不會超過N,這裡給定Z佇列長度為N。
% 4. 假設初始狀態所有N個通道均空閒,次使用者理想感知,感知延時為0.005
%*****************************************
%吳呈瑜 2009年10月12日 10月25日
%*****************************************
%初始化
%*****************************************
a = 100; %主使用者數量
b = 100; %次使用者數量
%N =3 %Z佇列最大長度/總的通道數
%Tao=5;%切換時延門限Tao
A = [ ]; %某主使用者到達時刻佔用通道序號的集合
B = [ ]; %某次使用者到達時刻佔用通道序號的集合
C = [ ]; %切換使用者佔用的當前所有通道序號集合
D = [ ]; %某次使用者到達時刻主使用者佔用通道集合
member = [ ];
member_CR = [ ];
j1=1;
%主使用者引數*****************************************
%lambdap = 0.3;
mup =0.4; %主使用者到達率與服務率
arr_meanp = 1/lambdap;
ser_meanp = 1/mup;%主使用者平均到達時間與平均服務時間
arr_nump = a; %round(Total_time*lambdap*2);
tp = zeros(6,arr_nump);
tp(1,:) = exprnd(arr_meanp,1,arr_nump); %按負指數分佈產生各主使用者到達時間間隔
tp(1,:) = cumsum(tp(1,:)); %各主使用者的到達時刻等於時間間隔的累積和
tp(2,:) = exprnd(ser_meanp,1,arr_nump); %按負指數分佈產生各主使用者服務時間
%次使用者引數*****************************************
lambdas =0.4;
mus =0.6; %次使用者到達率與服務率
arr_means = 1/lambdas;
ser_means = 1/mus; %次使用者平均到達時間與平均服務時間
arr_nums = b;
ts = zeros(6,arr_nums);
ts(1,:) = exprnd(arr_means,1,arr_nums); %按負指數分佈產生各次使用者達到時間間隔
ts(1,:) = cumsum(ts(1,:)); %各次使用者的到達時刻等於時間間隔的累積和
ts(2,:) = exprnd(ser_means,1,arr_nums); %按負指數分佈產生各次使用者服務時間
%切換使用者引數*****************************************待計算lambdah和muh
arr_numh = 10; %切換使用者排隊長度設定
th = zeros(6,arr_numh);
tsh=[];
%*****************************************
%計算第1個主使用者的資訊
%*****************************************
if arr_nump>=1
tp(3,1) = 0; %第1個主使用者進入系統後直接接受服務,無需等待
n = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
tp(4,1) = tp(1,1)+tp(2,1); %其離開時刻等於其到達時刻與服務時間之和
tp(5,1) = 1; %其肯定被系統接納,此時系統內共有1個主使用者,故標誌位置1
tp(6,1) = n; %依次記錄主使用者佔用通道的序號
A=[A n];
member = [1]; %其進入系統後,系統內已有成員序號為1
else
!echo No Primary Users!!!!
end
%*****************************************
if arr_nums>=1
if arr_nump>=1
k1 = sum(ts(1,:) < tp(1,1));
if k1~=0
for i =1:k1
if i==1
ts(3,i) = 0.005; %其等待時間為 0
ts(4,i) = ts(1,i)+ts(2,i)+ts(3,i); %其離開時刻等於到達時刻與服務時間之和
ts(5,i) = 1; %其標誌位置 1 ,即次使用者在用當前通道
m = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
ts(6,i) = m; %依次記錄次使用者佔用通道的序號
B=[B m];
member_CR =[1];
handoff1=find(tp(1,:)>ts(1,i));
handoff2=find(tp(1,:)<ts(4,i));
if isempty(handoff1)==0&&isempty(handoff2)==0
handoff3=setdiff(handoff1,handoff2);%當前次使用者通訊期間(時間段)到達的主使用者
handoff=setdiff(handoff1,handoff3);
handoff4=[];
for puid=1:length(handoff)
if tp(6,handoff(puid))==ts(6,i)
handoff4=[handoff4,handoff(puid)];
break;
end
end
if isempty(handoff4)==0
if j1<=arr_numh
th(1,j1)=tp(1,handoff4(1));
th(2,j1)=ts(4,i)-tp(1,handoff4(1));
ts(4,i)=tp(1,handoff4(1));
tsh=ts(:,i);
%切換到其他可用通道
num_arrivep=find(tp(1,:)<=th(1,j1));
num_leavep=find(tp(4,:)>=th(1,j1));
num_present1=setdiff(num_arrivep,num_leavep);
num_present2=setdiff(num_arrivep,num_present1);%當前在的主使用者
num_arrives=find(ts(1,:)<th(1,j1));
num_leaves=find(ts(4,:)>th(1,j1));
num_present3=setdiff(num_arrives,num_leaves);
num_present4=setdiff(num_arrives,num_present3);%當前在的次使用者
num_present6=[];
wait=0;
if j1>1
j2=1:j1-1;
num_arriveh=find(th(1,j2)<th(1,j1));
num_leaveh=find(th(4,j2)>th(1,j1));
num_present5=setdiff(num_arriveh,num_leaveh);
num_present6=setdiff(num_arriveh,num_present5);%當前在的切換使用者
for j3=1:length(num_present6)
wait=wait+th(3,num_present6(j3));
end
th(3,j1)=wait;%切換使用者排隊等待時間
end
if length(num_present2)==N
wait1=tp(4,num_present2(1));
for k=1:length(num_present2)
wait1=min(tp(4,num_present2(k)),wait1);
end
for k=1:length(num_present2)
if wait1==tp(4,num_present2(k))
wait2=num_present2(k);
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=tp(6,wait2);
tsh=[tsh,th(:,j1)];
elseif isempty(num_present2)&&length(num_present4)==N
wait1=ts(4,num_present4(1));
for k=1:length(num_present4)
wait1=min(ts(4,num_present4(k)),wait1);
end
for k=1:length(num_present4)
if wait1==ts(4,num_present4(k))
wait3=num_present4(k);
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=ts(6,wait3);
tsh=[tsh,th(:,j1)];
elseif length(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(num_present4)==0
wait1=tp(4,num_present2(1));
for k=1:length(num_present2)
wait1=min(tp(4,num_present2(k)),wait1);
end
for k=1:length(num_present4)
wait1=min(ts(4,num_present4(k)),wait1);
end
tps=[tp(:,num_present2),ts(:,num_present4)];
for k=1:length(tps)
if wait1==tps(4,k)
wait4=k;
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=tps(6,wait4);
tsh=[tsh,th(:,j1)];
elseif length(num_present2)+length(num_present4)<N
channel1=[tp(6,num_present2),ts(6,num_present4)];
channel=setdiff([1:N],channel1);
th(3,j1)=0.006+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=channel(1);
tsh=[tsh,th(:,j1)];
end
j1=j1+1;
end
end
end
elseif i >= 2
j=1:i-1;
number_CR = find(ts(4,j) > ts(1,i)); %當前佔用通道的次使用者個數
[th1,th2]=find(th==0);
th(:,th2)=[];
if isempty(number_CR)&&isempty(th)
m = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
ts(3,i) = 0.005;
ts(4,i) = ts(1,i)+ts(2,i)+ts(3,i); %其離開時刻等於到達時刻與服務時間之和
ts(5,i) = 1; %其標誌位置 1 ,即次使用者在用當前通道
ts(6,i) = m; %依次記錄次使用者佔用通道的序號
B=[B m];
member_CR = [member_CR,i];
handoff1=find(tp(1,:)>ts(1,i));
handoff2=find(tp(1,:)<ts(4,i));
if isempty(handoff1)==0&&isempty(handoff2)==0
handoff3=setdiff(handoff1,handoff2);%當前次使用者通訊期間(時間段)到達的主使用者
handoff=setdiff(handoff1,handoff3);
handoff4=[];
for puid=1:length(handoff)
if tp(6,handoff(puid))==ts(6,i)
handoff4=[handoff4,handoff(puid)];
break;
end
end
if isempty(handoff4)==0
if j1<=arr_numh
th(1,j1)=tp(1,handoff4(1));
th(2,j1)=ts(4,i)-tp(1,handoff4(1));
ts(4,i)=tp(1,handoff4(1));
tsh=[tsh,ts(:,i)];
%切換到其他可用通道
num_arrivep=find(tp(1,:)<=th(1,j1));
num_leavep=find(tp(4,:)>=th(1,j1));
num_present1=setdiff(num_arrivep,num_leavep);
num_present2=setdiff(num_arrivep,num_present1);%當前在的主使用者
num_arrives=find(ts(1,:)<th(1,j1));
num_leaves=find(ts(4,:)>th(1,j1));
num_present3=setdiff(num_arrives,num_leaves);
num_present4=setdiff(num_arrives,num_present3);%當前在的次使用者
num_present6=[];
wait=0;
if j1>1
j2=1:j1-1;
num_arriveh=find(th(1,j2)<th(1,j1));
num_leaveh=find(th(4,j2)>th(1,j1));
num_present5=setdiff(num_arriveh,num_leaveh);
num_present6=setdiff(num_arriveh,num_present5);%當前在的切換使用者
for j3=1:length(num_present6)
wait=wait+th(3,num_present6(j3));
end
th(3,j1)=wait;%切換使用者排隊等待時間
end
if length(num_present2)==N
wait1=tp(4,num_present2(1));
for k=1:length(num_present2)
wait1=min(tp(4,num_present2(k)),wait1);
end
for k=1:length(num_present2)
if wait1==tp(4,num_present2(k))
wait2=num_present2(k);
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=tp(6,wait2);
tsh=[tsh,th(:,j1)];
elseif isempty(num_present2)&&length(num_present4)==N
wait1=ts(4,num_present4(1));
for k=1:length(num_present4)
wait1=min(ts(4,num_present4(k)),wait1);
end
for k=1:length(num_present4)
if wait1==ts(4,num_present4(k))
wait3=num_present4(k);
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=ts(6,wait3);
tsh=[tsh,th(:,j1)];
elseif length(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(num_present4)==0
wait1=tp(4,num_present2(1));
for k=1:length(num_present2)
wait1=min(tp(4,num_present2(k)),wait1);
end
for k=1:length(num_present4)
wait1=min(ts(4,num_present4(k)),wait1);
end
tps=[tp(:,num_present2),ts(:,num_present4)];
for k=1:length(tps)
if wait1==tps(4,k)
wait4=k;
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=tps(6,wait4);
tsh=[tsh,th(:,j1)];
elseif length(num_present2)+length(num_present4)<N
channel1=[tp(6,num_present2),ts(6,num_present4)];
channel=setdiff([1:N],channel1);
th(3,j1)=0.006+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=channel(1);
tsh=[tsh,th(:,j1)];
end
j1=j1+1;
end
end
end
elseif length(number_CR)+length(th(1,:))>0&&length(number_CR)+length(th(1,:))<N
m = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
while any(m == ts(6,number_CR))&&any(m == th(6,:))
m = ceil(rand*N);
end
ts(3,i) = 0.005;
ts(4,i) = ts(1,i)+ts(2,i)+ts(3,i); %其離開時刻等於到達時刻與服務時間之和
ts(5,i) = 1; %其標誌位置 1 ,即次使用者在用當前通道
ts(6,i) = m; %依次記錄次使用者佔用通道的序號
B=[B m];
member_CR = [member_CR,i]; %如果系統有次使用者正在接受服務,且系統等待佇列未滿,則第i個次使用者進入系統
handoff1=find(tp(1,:)>ts(1,i));
handoff2=find(tp(1,:)<ts(4,i));
if isempty(handoff1)==0&&isempty(handoff2)==0
handoff3=setdiff(handoff1,handoff2);%當前次使用者通訊期間(時間段)到達的主使用者
handoff=setdiff(handoff1,handoff3);
handoff4=[];
for puid=1:length(handoff)
if tp(6,handoff(puid))==ts(6,i)
handoff4=[handoff4,handoff(puid)];
break;
end
end
if isempty(handoff4)==0
if j1<=arr_numh
th(1,j1)=tp(1,handoff4(1));
th(2,j1)=ts(4,i)-tp(1,handoff4(1));
ts(4,i)=tp(1,handoff4(1));
tsh=[tsh,ts(:,i)];
%切換到其他可用通道
num_arrivep=find(tp(1,:)<=th(1,j1));
num_leavep=find(tp(4,:)>=th(1,j1));
num_present1=setdiff(num_arrivep,num_leavep);
num_present2=setdiff(num_arrivep,num_present1);%當前在的主使用者
num_arrives=find(ts(1,:)<th(1,j1));
num_leaves=find(ts(4,:)>th(1,j1));
num_present3=setdiff(num_arrives,num_leaves);
num_present4=setdiff(num_arrives,num_present3);%當前在的次使用者
num_present6=[];
wait=0;
if j1>1
j2=1:j1-1;
num_arriveh=find(th(1,j2)<th(1,j1));
num_leaveh=find(th(4,j2)>th(1,j1));
num_present5=setdiff(num_arriveh,num_leaveh);
num_present6=setdiff(num_arriveh,num_present5);%當前在的切換使用者
for j3=1:length(num_present6)
wait=wait+th(3,num_present6(j3));
end
th(3,j1)=wait;%切換使用者排隊等待時間
end
if length(num_present2)==N
wait1=tp(4,num_present2(1));
for k=1:length(num_present2)
wait1=min(tp(4,num_present2(k)),wait1);
end
for k=1:length(num_present2)
if wait1==tp(4,num_present2(k))
wait2=num_present2(k);
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=tp(6,wait2);
tsh=[tsh,th(:,j1)];
elseif isempty(num_present2)&&length(num_present4)==N
wait1=ts(4,num_present4(1));
for k=1:length(num_present4)
wait1=min(ts(4,num_present4(k)),wait1);
end
for k=1:length(num_present4)
if wait1==ts(4,num_present4(k))
wait3=num_present4(k);
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=ts(6,wait3);
tsh=[tsh,th(:,j1)];
elseif length(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(num_present4)==0
wait1=tp(4,num_present2(1));
for k=1:length(num_present2)
wait1=min(tp(4,num_present2(k)),wait1);
end
for k=1:length(num_present4)
wait1=min(ts(4,num_present4(k)),wait1);
end
tps=[tp(:,num_present2),ts(:,num_present4)];
for k=1:length(tps)
if wait1==tps(4,k)
wait4=k;
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=tps(6,wait4);
tsh=[tsh,th(:,j1)];
elseif length(num_present2)+length(num_present4)<N
channel1=[tp(6,num_present2),ts(6,num_present4)];
channel=setdiff([1:N],channel1);
th(3,j1)=0.006+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=channel(1);
tsh=[tsh,th(:,j1)];
end
j1=j1+1;
end
end
end
elseif number_CR+length(th(1,:)) >= N %如果系統已滿,則系統拒絕第i個次使用者,其標誌位置 0 //次使用者阻塞
ts(5,i) = 0; %其標誌位置 0 ,即次使用者在用當前通道
end
end
end
end
else
%***********************第一個次使用者到達資訊
ts(3,1) = 0.005; %其等待時間為 0
ts(4,1) = ts(1,1)+ts(2,1)+ts(3,1); %其離開時刻等於到達時刻與服務時間之和
ts(5,1) = 1; %其標誌位置 1 ,即次使用者在用當前通道
m = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
ts(6,1) = m; %依次記錄次使用者佔用通道的序號
B=[B m];
member_CR =[1];
%************************第一個之後的次使用者到達資訊
for i = 2:arr_nums
number = find(ts(4,:) > ts(1,i)); %當前佔用通道的主使用者個數
if isempty(number) %如果系統為空,則第i個主使用者直接接受服務
m = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
ts(3,i)=0.005;
ts(4,i)=ts(1,i)+ts(2,i)+ts(3,1); %其離開時刻等於到達時刻與服務時間之和
ts(5,i) = 1; %其標誌位置 1
ts(6,i) = m; %依次記錄主使用者佔用通道的序號
B=[B m];
member_CR = [member_CR,i]; %如果系統有主使用者正在接受服務,且系統等待佇列未滿,則第i個主使用者進入系統
elseif isempty(number)==0&&length(number)<N
m = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
while any(m==ts(6,number))
m = ceil(rand*N);
end
ts(3,i)=0.005;
ts(4,i)=ts(1,i)+ts(2,i)+ts(3,1); %其離開時刻等於到達時刻與服務時間之和
ts(5,i) = 1; %其標誌位置 1
ts(6,i) = m; %依次記錄主使用者佔用通道的序號
B=[B m];
member_CR = [member_CR,i]; %如果系統有主使用者正在接受服務,且系統等待佇列未滿,則第i個主使用者進入系統
elseif length(number) >= N %如果系統已滿,則系統拒絕第i個主使用者,其標誌位置 0 //主使用者阻塞
ts(5,i) = 1; %其標誌位置 1 ,即主使用者在用當前通道
end
end
end
else
!echo No Cognitive Radio Users!!!!
end
%*****************************************以上是第一個主使用者到達時刻之前可能到達的次使用者資訊 OK 10月26日
%*****************************************以下是第一個主使用者之後到達的主使用者資訊
if arr_nump>=1
for i = 2:arr_nump
number = find(tp(4,:) > tp(1,i)); %當前佔用通道的主使用者個數
if isempty(number)==1 %如果系統為空,則第i個主使用者直接接受服務
n = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
tp(3,i)=0;
tp(4,i)=tp(1,i)+tp(2,i); %其離開時刻等於到達時刻與服務時間之和
tp(5,i) = 1; %其標誌位置 1
tp(6,i) = n; %依次記錄主使用者佔用通道的序號
A=[A n];
member = [member,i]; %如果系統有主使用者正在接受服務,且系統等待佇列未滿,則第i個主使用者進入系統
elseif isempty(number)==0&&length(number)<N
n = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
while any(n==tp(6,number))
n = ceil(rand*N);
end
tp(3,i)=0;
tp(4,i)=tp(1,i)+tp(2,i); %其離開時刻等於到達時刻與服務時間之和
tp(5,i) = 1; %其標誌位置 1
tp(6,i) = n; %依次記錄主使用者佔用通道的序號
A=[A n];
member = [member,i]; %如果系統有主使用者正在接受服務,且系統等待佇列未滿,則第i個主使用者進入系統
elseif length(number) >= N %如果系統已滿,則系統拒絕第i個主使用者,其標誌位置 0 //主使用者阻塞
tp(5,i) = 0; %其標誌位置 1 ,即主使用者在用當前通道
end
end
end
if arr_nump>=1&&arr_nums>=1
if tp(4,end)>=ts(1,end)
arr_numss=arr_nums;
else
xxx=find(ts(1,:)<=tp(1,end));
arr_numss=xxx(end);
end
if k1<arr_nums
j = k1+1;
for i=2:arr_nump
num_arrive=find(tp(1,:)<ts(1,j));
num_leave=find(tp(4,:)>ts(1,j));
num_P=[];
num_S=[];
for num=1:length(num_arrive)
if any(num_arrive(num)==num_leave)
num_P=[num_P,num_arrive(num)];
end
end
if k1~=0
y=1:j-1;
num_S=find(ts(4,y) > ts(1,j)); %當前ts(1,p)時刻佔用通道的次使用者個數
end
[th1,th2]=find(th==0);
th(:,th2)=[];
if isempty(num_S)&&isempty(num_P)&&isempty(th)
m = ceil(rand*N); %產生一個在N範圍內的隨機數作為接入的通道序號
ts(3,j) = 0.005;
ts(4,j) = ts(1,j)+ts(2,j)+ts(3,j); %其離開時刻等於到達時刻與服務時間之和
ts(5,j) = 1; %其標誌位置 1
ts(6,j) = m; %依次記錄次使用者佔用通道的序號
B=[B m];
member_CR = [member_CR,j]; %如果系統有次使用者正在接受服務,且系統等待佇列未滿,則第c個次使用者進入系統
handoff1=find(tp(1,:)>ts(1,j));
handoff2=find(tp(1,:)<ts(4,j));
if isempty(handoff1)==0&&isempty(handoff2)==0
handoff3=setdiff(handoff1,handoff2);%當前次使用者通訊期間(時間段)到達的主使用者
handoff=setdiff(handoff1,handoff3);
handoff4=[];
for puid=1:length(handoff)
if tp(6,handoff(puid))==ts(6,j)
handoff4=[handoff4,handoff(puid)];
break;
end
end
if isempty(handoff4)==0
if j1<=arr_numh
th(1,j1)=tp(1,handoff4(1));
th(2,j1)=ts(4,j)-tp(1,handoff4(1));
ts(4,j)=tp(1,handoff4(1));
tsh=[tsh,ts(:,i)];
%切換到其他可用通道
num_arrivep=find(tp(1,:)<=th(1,j1));
num_leavep=find(tp(4,:)>=th(1,j1));
num_present1=setdiff(num_arrivep,num_leavep);
num_present2=setdiff(num_arrivep,num_present1);%當前在的主使用者
num_arrives=find(ts(1,:)<th(1,j1));
num_leaves=find(ts(4,:)>th(1,j1));
num_present3=setdiff(num_arrives,num_leaves);
num_present4=setdiff(num_arrives,num_present3);%當前在的次使用者
num_present6=[];
wait=0;
if j1>1
j2=1:j1-1;
num_arriveh=find(th(1,j2)<th(1,j1));
num_leaveh=find(th(4,j2)>th(1,j1));
num_present5=setdiff(num_arriveh,num_leaveh);
num_present6=setdiff(num_arriveh,num_present5);%當前在的切換使用者
for j3=1:length(num_present6)
wait=wait+th(3,num_present6(j3));
end
th(3,j1)=wait;%切換使用者排隊等待時間
end
if length(num_present2)==N
wait1=tp(4,num_present2(1));
for k=1:length(num_present2)
wait1=min(tp(4,num_present2(k)),wait1);
end
for k=1:length(num_present2)
if wait1==tp(4,num_present2(k))
wait2=num_present2(k);
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=tp(6,wait2);
tsh=[tsh,th(:,j1)];
elseif isempty(num_present2)&&length(num_present4)==N
wait1=ts(4,num_present4(1));
for k=1:length(num_present4)
wait1=min(ts(4,num_present4(k)),wait1);
end
for k=1:length(num_present4)
if wait1==ts(4,num_present4(k))
wait3=num_present4(k);
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=ts(6,wait3);
tsh=[tsh,th(:,j1)];
elseif length(num_present2)+length(num_present4)==N&&isempty(num_present2)==0&&isempty(num_present4)==0
wait1=tp(4,num_present2(1));
for k=1:length(num_present2)
wait1=min(tp(4,num_present2(k)),wait1);
end
for k=1:length(num_present4)
wait1=min(ts(4,num_present4(k)),wait1);
end
tps=[tp(:,num_present2),ts(:,num_present4)];
for k=1:length(tps)
if wait1==tps(4,k)
wait4=k;
break;
end
end
th(3,j1)=wait1-th(1,j1)+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=tps(6,wait4);
tsh=[tsh,th(:,j1)];
elseif length(num_present2)+length(num_present4)<N
channel1=[tp(6,num_present2),ts(6,num_present4)];
channel=setdiff([1:N],channel1);
th(3,j1)=0.006+th(3,j1);
th(4,j1)=th(1,j1)+th(2,j1)+th(3,j1);
th(5,j1)=1;
th(6,j1)=channel(1);
tsh=[tsh,th(:,j1)];
end
j1=j1+1;
end
end
end
elseif length(num_S)+length(num_P)+length(th(1,:))>0&&length(num_S)+length(num_P)+length(th(1,:))< N
m = ceil(rand*N);
while any(m == tp(6,num_P))&&any(m == ts(6,num_S))&&any(m == th(6,:))
m = ceil(rand*N);
end
ts(3,j) = 0.005;
ts(4,j) = ts(1,j)+ts(2,j)+ts(3,j); %其離開時刻等於到達時刻與服務時間之和
ts(5,j) = 1; %其標誌位置 1
ts(6,j) = m; %依次記錄次使用者佔用通道的序號
B=[B m];
member_CR = [member_CR,j];
handoff1=find(tp(1,:)>ts(1,j));
handoff2=find(tp(1,:)<ts(4,j));
if isempty(handoff1)==0&&isempty(handoff2)==0
handoff3=setdiff(handoff1,handoff2);%當前次使用者通訊期間(時間段)到達的主使用者
handoff=setdiff(handoff1,handoff3);
handoff4=[];
for puid=1:length(handoff)
if tp(6,handoff(puid))==ts(6,j)
handoff4=[handoff4,handoff(puid)];
break;
end
end
if isempty(handoff4)==0
if j1<=arr_numh
th(1,j1)=tp(1,handoff4(1));
th(2,j1)=ts(4,j)-tp(1,handoff4(1));
ts(4,j)=tp(1,handoff4(1));
tsh=[tsh,ts(:,i)];
%切換到其他可用通道
num_arrivep=find(tp(1,:)<=th(1,j1));
num_leavep=find(tp(4,:)>=th(1,j1));
num_present1=setdiff(num_arrivep,num_leavep);
num_present2=setdiff(num_arrivep,num_present1);%當前在的主使用者
num_arrives=find(ts(1,:)<th(1,j1));
num_leaves=find(ts(4,:)>th(1,j1));
num_present3=setdiff(num_arrives,num_leaves);
num_present4=setdiff(num_arrives,num_present3);%當前在的次使用者
num_present6=[];
相關文章
- 基於AOP的動態資料來源切換(附原始碼)原始碼
- 排隊論演算法的matlab實現演算法Matlab
- [原始碼分析] 定時任務排程框架 Quartz 之 故障切換原始碼框架quartz
- 線上直播原始碼,npm設定映象的方法 可切換原始碼NPM
- 基於單機的DataGuard切換文件
- 【原始碼】基於IEEE 14匯流排標準的複合微電網SIMULINK模型原始碼模型
- 成品直播原始碼,輪播圖無縫切換以及自動懸停原始碼
- 排隊免單系統原始碼架構分析原始碼架構
- 基於多種場景DataGuard切換方案
- 認知謬論:什麼是舍基原則?
- 手機直播原始碼,文字上下滾動切換 用於公告訊息提示原始碼
- 影片直播原始碼,AndroidStudio登入頁面的切換原始碼Android
- 成品直播原始碼,點選滑動切換效果原始碼
- 運籌優化(十六)--排隊論基礎及其最優化求解優化
- 基於JSP小區物業管理系統(論文+原始碼)JS原始碼
- Rxjava 2.x 原始碼系列 - 執行緒切換 (下)RxJava原始碼執行緒
- Rxjava 2.x 原始碼系列 - 執行緒切換 (上)RxJava原始碼執行緒
- antd原始碼解析——線上換膚功能原始碼
- 電磁感應 電磁場的相對論變換 知識梳理
- 【EMNLP 2023】基於大語言模型的複雜任務認知推理演算法CogTree模型演算法
- 關於大搜車「無線開發中心」團隊
- 基於Redis實現一套支援排隊等待的限流器Redis
- nvm for windows切換node版本無效Windows
- 雙buffer實現無鎖切換
- 電腦如何切換螢幕_電腦怎麼切換另一個介面快捷鍵
- 關於PHP的切換版本PHP
- PriorityQueue原理分析——基於原始碼原始碼
- wifi無線認證WiFi
- 知識付費系統原始碼基於PHP開源的網站內容付費原始碼原始碼PHP網站
- vue切換元件基礎模板Vue元件
- 認知謬論:什麼是弗雷德金悖論
- 基於react-intl實現手動國際化切換React
- 基於AI排序演算法的指數增強策略【附原始碼】AI排序演算法原始碼
- 小米遊戲滑鼠釋出:支援有線/無線雙模切換 售價249元!遊戲
- 基於交換論證的 Johnson 法則證明
- 團隊動力之社會認同理論
- 電腦鍵盤怎麼切換中文 電腦鍵盤切換中英文教程
- 原始碼解讀·RT-Thread多工排程演算法原始碼thread演算法