⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_dv.m

📁 best routing protocol
💻 M
字号:
function  [res,dv,dv2] = test_dv(fn, n_beacons, failure_nodes)verify_correctness = 0;if isstr(fn)  S = load(fn);else  topology_generator('tmp.mat',fn, 5.12, 0,0,0);  S = load('tmp.mat');end%D = sparse([0 1 0 1;1 0 1 0; 0 1 0 1; 1 0 1 0]);%!!%n_nodes = 4;%!!neighbor_dist = S.D;tmp = randperm(S.n_nodes);pre_landmarks = tmp(1:n_beacons)%pre_landmarks = [1 ]%!!%pre_landmarks = [113   143    19]if nargin<3  failure_nodes = [1];endfailure_nodestmp = failure_nodes;n = length(neighbor_dist);failure_vector = zeros(n,1);failure_vector(tmp) = ones(length(tmp),1);if n<=100  %visualize(S.D, S.coord, pre_landmarks, failure_nodes, 1,1 );enddebug = 1;debug_route = 0; %this will generate a lot of debug informationif ~issparse(neighbor_dist)  neighbor_dist = dist_full2sparse(neighbor_dist);endn = length(neighbor_dist);%fprintf('calculating best path...');%[delta optimal_nexthop] = floyd_warshall(neighbor_dist);%[delta optimal_nexthop] = allpair_dijkstra(neighbor_dist);%fprintf('done\n');%%%select landmarksW = 1:n;if nargin<2  pre_landmarks = []; endif nargin<3  tmp1 = repmat(1:n,n,1);  tmp2 = tmp1';  rest_pairs = [tmp1(:) tmp2(:)];endout_degree = full(sum(neighbor_dist>0,2));%C = zeros(n,n); %C(w,v)==1 means v \in C(w)%routing_table(w,v)=nexthop, if v \in C(w)routing_table = sparse([]);routing_table(n,n) = 0;%direct_dist = routing_table; %should be sync with routing_table:                             %direct_dist(w,v)=shortest_dist bwteen w&vfor i=1:n  tmp = find(neighbor_dist(:,i));  routing_table(tmp,i)=repmat(i,length(tmp),1);end%routing_tabledirect_dist = neighbor_dist;%nexthop2bcn(i,b) = nexthop(i,b) where b is the relative beacon iddeltaA = zeros(1,n); % deltaA(v) == \delta(A,v)%cent(u), the closest landmark to each node, relative index to AA = [];s = sqrt(n*log(n)/log(2));A = sort(pre_landmarks);ordinary_nodes = setdiff(1:n, A);isbeacon = zeros(n,1);isbeacon(A) = 1:length(A);%every landmark floods the networklm_broadcast_snd = broadcast_overhead(neighbor_dist, A);%lm_broadcast_rcv = length(A)*sum(out_degree);if debug  fprintf('# broadcast packets sent: %d\n', lm_broadcast_snd);  %fprintf('# broadcast packets received: %d\n', lm_broadcast_rcv);end[beacon_vectors, nexthop2bcn] = allpair_dijkstra(neighbor_dist, A);[deltaA, cent] = min(beacon_vectors,[],2);%plot_cumu_matrix(deltaA);%!!!!if debug  fprintf('mean and max deltaA:%.1f, %.1f\n', mean(deltaA), ...	  max(deltaA));endif debug & n<=50  deltaA'end    %now sort out the clusters for ordinary nodes%%C = delta < repmat(deltaA,n,1);%%C = delta <= repmat(deltaA,n,1); %!!!change from the algorithm%%C(:,A) = zeros(n, length(A));%%C(A,:) = zeros(length(A),n);%ok. distance vector modefprintf('simulating scoped distance vector..\n');[dv, dv_packets, dv_entries] = distance_vector(neighbor_dist, deltaA);%update routing_table and direct_dist according to dv%rt = full(routing_table);%for i=1:n%  dests = find(dv{i}(:,1)>0);%  rt(i,dests) = dv{i}(dests,1)';%  rt(i,i) = 0;%end%routing_table = sparse(rt);%clear rt;routing_table = dv2rt(dv, routing_table);%print_dv(dv)if verify_correctness  verify_DV(neighbor_dist, dv, deltaA)endfprintf('................................\n');D_after_fail = neighbor_dist;failure_nodesD_after_fail(failure_nodes,:) = zeros(length(failure_nodes), n);D_after_fail(:, failure_nodes) = zeros(n, length(failure_nodes));[beacon_vectors_f, nexthop2bcn_f] = allpair_dijkstra(D_after_fail, A);[deltaA_f, cent_f] = min(beacon_vectors_f,[],2);if debug  fprintf('mean and max deltaA_f:%.1f, %.1f\n', mean(deltaA_f), ...	  max(deltaA_f));end%deltaA-deltaA_f[dv2, dv_packets, dv_entries] = distance_vector(D_after_fail, ...						deltaA,failure_vector, ...						dv, deltaA_f);%[dv3, dv_packets, dv_entries] = distance_vector(D_after_fail, ...%						deltaA);%cell_equal(dv,dv2)%cell_equal(dv,dv)%cell_equal(dv3,dv2)%print_dv(dv)res = 1;if verify_correctness  res = verify_DV(D_after_fail, dv2, deltaA_f, failure_vector)end%print_dv(dv2)%print_dv(dv,76)%print_dv(dv2,76)%resfunction b = cell_equal(c1, c2)b = 0;if length(c1)~=length(c2)  returnendfor i=1:length(c1)  if c1{i}==c2{i}    continue  end  returnendb = 1;returnfunction b = verify_DV(D, dv, deltaA, failure_vector)% make sure that everything is contained in the routing table, MAX_DISTANCE=100;n = length(D);[delta optimal_nexthop] = allpair_dijkstra(D);b = 1;if nargin<4  failure_vector = zeros(n,1);endfor i=1:n  if failure_vector(i)    continue  end  if deltaA(i)>=MAX_DISTANCE %e.g. inf    nodes_in_range = find(delta(i,:)<=MAX_DISTANCE); %!!classic is <  else    nodes_in_range = find(delta(i,:)<=deltaA(i)); %!!classic is <  end  for j=nodes_in_range    nexthop = dv{j}(i,1);    dist = dv{j}(i,2);    range = dv{j}(i,3);    if nexthop==0      fprintf('missing DV in %d, dest %d\n',j,i);      b = 0;    elseif dist~=delta(i,j)      fprintf('wrong DV in %d, dest %d, dist should be %d, but is %d\n',...	      j,i,delta(i,j), dist);      b = 0;    elseif dist+range~=deltaA(i)      fprintf('wrong DV in %d, dest %d, range should be %d, but is %d\n',...	      j,i,deltaA(i)-dist, range);      b = 0;    %elseif dv{nexthop}(i,2)+D(j,nexthop)~=dist    elseif delta(nexthop,i)+D(j,nexthop)~=delta(j,i)      fprintf('invalid nexthop %d selection in %d, dest %d\n',nexthop, ...	      j,i);      b = 0;    end      end    end  %make sure everything in DV is necessary% and everything in the DV is correctfor i=1:length(dv)  if failure_vector(i)    continue  end  dests = find(dv{i}(:,1));  for j=1:length(dests)    k=dests(j);    nexthop =dv{i}(k,1);    dist = dv{i}(k,2);    range = dv{i}(k,3);    if dv{i}(k,2)>deltaA(k)      fprintf('uneccssary dv in %d, dest=%d,dist=%d, deltaA=%d,nexthop=%d\n',i,k,...	      dist, deltaA(k), nexthop);    end      if dist~=delta(k,i)       if dist<MAX_DISTANCE | delta(k,i)<MAX_DISTANCE	fprintf('in %d, dest=%d,** wrong dist should be %d, but is %d\n'...		,i,k,delta(k, i),dist);	b=0;      end    end    if dist+range~=deltaA(k)            fprintf('in %d,next %d dest=%d **wrong range: should be %d, but is %d\n',...	      i,nexthop,k,deltaA(k)-delta(k,i), range);      b=0;    end    if delta(nexthop,k)+D(i,nexthop)~=delta(k,i)      fprintf('in %d, dest=%d ** invalid nexthop: %d\n', i,k,nexthop);      b=0;    end        endend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -