基站邻居的MATLAB代码记录:
调用方式:
M = 100; % BS总数, 要求: 4 9 16 25 36 49 64 81 100 ....
index_BS = 20;
neighbor = find_neighbor( index_BS , M ) ;
function neighbor = find_neighbor( index_BS , M )
% 本代码是为基站寻找邻居的代码。任意一个基站索引都可以找到其邻居节点(index_BS为基站索引)
% 注意,这里的索引是按行排列的,若有M=100,则为10*10的基站,每行10个,一共10行,索引号按行排列
sqrt_M = sqrt(M);
if floor( sqrt_M )^2 ~= M
disp(['本仿真中,BS数量必须是平方数']);
throw(exception);
end
line = mod ( index_BS-1 , sqrt_M ) + 1 ;
%disp(['当前仿真共有',num2str(M),'个基站,即:',num2str(sqrt_M),'×',num2str(sqrt_M),' 。当前基站索引号为',num2str(index_BS),',该基站位于第',num2str(line),'列']);
if mod( line , 2 ) == 0 % 位于偶数列还是奇数列
neighbor = [index_BS-sqrt_M-1 ; index_BS-sqrt_M ; index_BS-sqrt_M+1 ; index_BS-1 ; index_BS; index_BS+1 ; index_BS+sqrt_M ]; % 针对非边缘"偶数"节点
%disp(['备注:偶数列']);
neighbor( find ( neighbor<=0 | neighbor>sqrt_M*sqrt_M ) ) = []; % 处理上下边缘
if line == 1 %左边缘
%disp(['备注:偶数列的左边缘节点']);
neighbor ( find ( neighbor == index_BS-sqrt_M-1 | neighbor == index_BS-1 ) ) = [];
elseif line == sqrt_M & mod( sqrt_M , 2) ==0 %右边缘 且一行为偶数个BS
%disp(['备注:偶数列的右边缘节点']);
neighbor ( find ( neighbor == index_BS-sqrt_M+1 | neighbor == index_BS+1 ) ) = [];
elseif line == sqrt_M & mod( sqrt_M , 2) ==1 %右边缘 且一行为奇数个BS
disp(['备注:不存在这种可能']);
end
else
neighbor = [ index_BS-sqrt_M ; index_BS-1 ; index_BS; index_BS+1 ; index_BS+sqrt_M-1 ; index_BS+sqrt_M ; index_BS+sqrt_M+1 ]; % 针对非边缘"奇数"节点
%disp(['备注:奇数列']);
neighbor( find ( neighbor<=0 | neighbor>sqrt_M*sqrt_M )) = []; % 处理上下边缘
if line == 1 %左边缘
%disp(['备注:奇数列的左边缘节点']);
neighbor ( find ( neighbor == index_BS+sqrt_M-1 | neighbor == index_BS-1 ) ) = [];
elseif line == sqrt_M & mod( sqrt_M , 2) ==0 %右边缘 且一行为偶数个BS
disp(['备注:不存在这种可能']);
elseif line == sqrt_M & mod( sqrt_M , 2) ==1 %右边缘 且一行为奇数个BS
%disp(['备注:奇数列的右边缘节点']);
neighbor( find ( neighbor == index_BS+1 | neighbor == index_BS+sqrt_M+1 ) ) = [];
end
end
end
case1 运行结果:
基站索引编号如下图:
case 2 运行结果:
基站索引编号如下图:
任意两个基站之间跳数计算代码:
function [hop] = find_BS_distance( index_BS_1 , index_BS_2 , M )
% 本代码是为任意两个基站寻找最短跳数的代码
sqrt_M = sqrt(M);
line_1 = mod ( index_BS_1-1 , sqrt_M ) + 1 ;
line_2 = mod ( index_BS_2-1 , sqrt_M ) + 1 ;
flag_1 = mod( line_1 , 2 ); % flag = 1 则为下行; flag = 0 则为上行;
flag_2 = mod( line_2 , 2 ); % flag = 1 则为下行; flag = 0 则为上行;
row_1 = ceil( index_BS_1 / sqrt_M );
line_1 = mod ( index_BS_1-1 , sqrt_M ) + 1 ;
row_2 = ceil( index_BS_2 / sqrt_M );
line_2 = mod ( index_BS_2-1 , sqrt_M ) + 1 ;
line_dis = abs( line_1 - line_2 );
row_dis = abs( row_1 - row_2 );
if (row_1<row_2 & flag_1==0 & flag_2==1) | (row_2<row_1 & flag_2==0 & flag_1==1) | (row_2==row_1 & flag_1~=flag_2)
row_dis = row_dis + 1; % 由于行的上下位导致的多一跳
end
if mod( line_dis , 2 ) == 0 %列差为偶数
hop = row_dis + (line_dis / 2) ;
else
hop = row_dis + ( (line_dis-1) / 2) ;
end
end