目次
1.アルゴリズムシミュレーション効果
matlab2022a のシミュレーション結果は次のとおりです。
2. アルゴリズムには理論的知識の概要が含まれます
負の環の定義: 負の環とは、重みの合計が負の環を指します。負のサイクルはグラフの最短経路の計算を無限ループに陥らせるため、負のサイクルを持つグラフには最短経路はありません。
負のリングの計算方法:
負のリングには 2 つの計算方法があり、どちらも Bellman-Ford アルゴリズムまたは SPFA アルゴリズムに基づいています。
最初のアルゴリズムは次のとおりです: 各ポイントのエンキューの数をカウントします. ポイントが n 回以上エンキューする場合, 負のリングがあることを意味します. 2 番目のアルゴリズムは: 最短パスが到達するポイントの数をカウントします
.ある点が通過する数、n点を通過する場合、負のサイクルがあることを意味します。
(一般的には 2 番目のアルゴリズムを使用します)
負のループが存在する場合、SPFA は無限ループに陥り、n は非無限ループの最悪のケースであるためです。したがって、上記の 2 つのアルゴリズムは正しいです。
ネガティブ リング アルゴリズムのプログラミング実装では、
最初にすべてのポイントの距離を 0 に割り当て
、次にすべてのポイントをキューに入れます。
100m×100m に12 個のノードをランダムに構築し、ノード間を30m以内で有向線で接続し、独立して1000サイクルのシミュレーションを実行します。このうち、N_j は500 ~ 1000 個の乱数を設定できます。
N アルゴリズムを使用して解決する特定のNアルゴリズム プロセスは、主に111.pdfの2部分と3部分のシミュレーション、つまり、シングル ユーザー、優先度の高いマルチユーザー、および優先度のないマルチユーザーのシミュレーションのために、この記事で紹介されています。multi-user の場合、ソース ノードと宛先ノードは次のように設定できます: s_1=1,d_1=12;s_2=2,d_2=10;s_3=3,d_3=9;s_4=5,d_5 =11。
3. MATLAB コア プログラム
........................................................
USER = [2,3,5];
for jks = 1:length(USER);
Traffic_VolumeS = [20];
SR = [10:10:60];
Es3 = [];
for jjj = 1:length(SR)
Traffic_Volume = Traffic_VolumeS;
Loop = 9;
Es = zeros(MTKL,Loop);
rng(5*jjj);
for i = 1:MTKL
i
%随机12个节点
X = SCALE*rand(1,Note);
Y = SCALE*rand(1,Note);
%30以内有相线相连接
xk_ij = zeros(Note,Note);
w_ij = zeros(Note,Note);
b_ij = zeros(Note,Note);
for j1 = 1:Note
for j2 = 1:Note
dist = sqrt((X(j1)-X(j2))^2 + (Y(j1)-Y(j2))^2);
if dist <= Dis_R & j1~=j2
%Select a feasible route with f = fij,这里构造一个连接矩阵,将相互连接的用1表示
xk_ij(j1,j2) = 1;
%随机分配cost
b_ij(j1,j2) = 50*randn-30;
end
end
end
EZ = 0;
for js2 = 1:USER(jks)
%初始值
fij = (1+rand/5)*Traffic_Volume + 2*randn(Note,Note);
fijmax0 = max(max(fij));
%选择一个路径
[f,flag] = func_sel_route(xk_ij,X,Y,fij,b_ij,Dis_R);
%开始迭代
E_1 = zeros(1,Loop);
for j = 1:Loop
if flag == 1
%补图
Nj = 500 + 500*rand;
Ys = func_complementary_graph(xk_ij,f);
[R,C] = size(Ys);
a = randperm(10);
SR_(jjj) = SR(jjj);%模拟in的Rate
Ri_in = 1e6*SR_(jjj);%转换为M,
Ri_out = 1e6*SR(jjj);%转换为M,
if j == 1
E_1(1,j) = Traffic_Volume;%初始值
else
Ej_proc = Nj/2*ECMP_max + ECMP_min;
Ei_out = frp(Ri_out) * (MOEC_min+(MOEC_max-MOEC_min)*rand);
Ej_in = frp(Ri_in) * (MIEC_min+(MIEC_max-MIEC_min)*rand);
E_1(1,j) = Ei_out + Ej_in + Ej_proc;
end
for k1 = 1:R
for k2 = 1:C
E(k1,k2) =E_1(1,j)*(1+randn/5);
end
end
%再将M除掉
E=E/1e6;
fijmax_ = zeros(R,C);
for k1 = 1:R
for k2 = 1:C
if Ys(k1,k2) == 1
fijmax_(k1,k2) = fijmax0 - fij(k1,k2);
fij(k2,k1) = fijmax_(k1,k2);
E_(k1,k2) = E(k1,k2);
E(k2,k1) = -E_(k1,k2);
end
end
end
E_=-E;
E = 7*E/sqrt(SR(jjj));
%negative cost cycle
[flags2] = func_negative_cost_cycle(Ys,xk_ij,X,Y,fij,Dis_R,E,E_,f);
if flags2 == 1%算法结束
break;
end
f_=f.*E;
for k1 = 1:R
for k2 = 1:C
tmps = fijmax0 - fij;
[xc,yc] = find(tmps==0);
tmps(xc,yc)=fijmax0;
delta = min([min(min(tmps)),min(min(fij))]);
if E_(k1,k2) > 0
fij(k2,k1) = fij(k2,k1)+delta;
else
fij(k2,k1) = fij(k2,k1)-delta;
end
end
end
E_1(1,j) = sum(sum(f_.*fij));
else
E_1(1,j) = 0;
end
end
EZ = EZ + E_1(end);
end
Es(i,:) = EZ;
end
%对1000迭代进行平均
Es2 = [];
for i = 1:Loop
tmps = Es(:,i);
index= find(tmps==0);
tmps(index)=[];
Es2 = [Es2,mean(tmps)];
end
Es3 = [Es3,Es2(end)];
end
if jks == 1
Eas = Es3;
save R1.mat Eas SR
end
if jks == 2
Ebs = Es3;
save R2.mat Ebs SR
end
if jks == 3
Ecs = Es3;
save R3.mat Ecs SR
end
end
12_028_m
4. 完全なアルゴリズム コード ファイル
Ⅴ