Matlab绘制网络——顺便学习了Matlab写函数

来源:互联网 发布:郑州大学网络服务中心 编辑:程序博客网 时间:2024/04/28 12:34

本来,是要研究网络拓扑的,因此,想最简简单的用Matlab画出来,以便得到直观的图形,找到网上一篇代码,如下:

%最新版改进Salam网络拓扑随机生成算法通用MATLAB源码%{本程序为最新版源码,源码无删减,能绘出漂亮的网络拓扑图片,算法改进说明如下:1.使用K均值聚类控制节点分布的疏密,使得产生的网络拓扑连通性和均匀性更好2.产生的网络拓扑数据丰富,包括:链路的费用、时延、带宽,节点的费用、时延、时延抖动、丢包率3.链路时延等于节点距离除以三分之二光速,更加符合实际情况%}function [Sxy,AM,EdgeCost,EdgeDelay,EdgeBandWide,VertexCost,VertexDelay,VertexDelayJitter,VertexPacketLoss]=SalamNet_NetCreate(BorderLength,NodeAmount, ...,    Alpha,Beta,PlotIf,EdgeCostDUB,EdgeBandWideDUB,VertexCostDUB,VertexDelayDUB,VertexDelayJitterDUB,VertexPacketLossDUB)%%改进的 Salama网络拓扑随机生成算法%%算法说明 %? 1.使用K均值聚类控制节点分布的疏密,使得产生的网络拓扑连通性和均匀性更好%? 2.产生的网络拓扑数据丰富,包括:链路的费用、时延、带宽,节点的费用、时延、时延抖动、丢包率%? 3.链路时延等于节点距离除以三分之二光速,更加符合实际情况%% 输入参数列表%BorderLenght————正方形区域的边长,单位:km%NodeAmount————网络节点的个数%Alpha————网络特征参数,Alpha越大,短边相对长边的比例越大%Beta————网络特征参数,Beta越大,边的密度越大%PlotIf————是否画网络拓扑图,如果为1,则画图,否则不画图%EdgeCostDUB————链路费用的控制参数,1*2,存储链路费用的下界和上界%EdgeBandWideDUB————链路带宽的控制参数,1*2,存储下界和上界%VertexCostDUB————节点费用的控制参数,1*2,存储节点费用的下界和上界%VertexDelayDUB————节点时延的控制参数,1*2,节储节点时延的下界和上界%VertexDelayJitterDUB————节点时延抖动的控制参数,1*2,存储节点时延抖动的下界和上界%VertexPacketLossDUB————节点丢包率的控制参数,1*2,存储节点丢包率的下界%%输出参数%Sxy————3*N的矩阵,各列分别用于存储节点的序号,横坐标,纵坐标的矩阵%AM————0 1存储矩阵,AM(i,j)=1表示存在由i到j的有向边,N*N%EdgeCost————链路费用矩阵,N*N%EdgeDelay————链路时延矩阵,N*N%EdgeBandWide————链路带宽矩阵,N*N%VertexCost————节点费用向量,1*N%VertexDelay————节点时延向量,1*N%VertexDelayJitter————节点时延抖动向量,1*N%VertexPacketLoss————节点丢包率向量,1*N%%推荐的输入参数设置 %BorderLength=1000;NodeAmount=25;Alpha=100000000;Beta=200000000000;%PlotIf=1;EdgeCostDUB=[2,5];EdgeBandWideDUB=[30,1000];VertexCostDUB=[2,4];%VertexDelayDUB=1e-4*[5,20];VertexDelayJitterDUB=1e-4*[3,8];%VertexPacketLossDUB=1e-4*[0,500]%%%参数初始化NN = 10*NodeAmount;SSxy = zeros(NN,2);%在正方形区域内随机均匀选取NN个节点for i = 1:NN    SSxy(i,1) = BorderLength*rand;    SSxy(i,2) = BorderLength*rand;end[IDX,C] = kmeans(SSxy,NodeAmount);Sxy = [[1:NodeAmount]',C]';%按横坐标由小到大的顺序重新为每一个节点编号temp = Sxy;Sxy2 = Sxy(2,:);Sxy2_sort = sort(Sxy2);for i = 1:NodeAmount    pos = find(Sxy2==Sxy2_sort(i));    if length(pos)>1        error('仿真故障,请重试!');    end    temp(1,i) = i;    temp(2,i) = Sxy(2,pos);    temp(3,i) = Sxy(3,pos);endSxy = temp;%输出参数初始化AM = zeros(NodeAmount,NodeAmount);EdgeCost = zeros(NodeAmount,NodeAmount);EdgeDelay = zeros(NodeAmount,NodeAmount);EdgeBandWide = zeros(NodeAmount,NodeAmount);VertexCost  = zeros(1,NodeAmount);VertexDelay = zeros(1,NodeAmount);VertexDelayJitter = zeros(1,NodeAmount);VertexPacketLoss  = zeros(1,NodeAmount);for i = 1:(NodeAmount-1)    for j = (i+1):NodeAmount        Distance =( (Sxy(2,i)-Sxy(2,j))^2+(Sxy(3,i)-Sxy(3,j))^2)^0.5;        P = Beta*exp(-Distance^5/(Alpha*BorderLength));        if P>rand            AM(i,j) = 1;            AM(j,i) = 1;            EdgeDelay(i,j) = 0.5*Distance/100000;            EdgeDelay(j,i) = EdgeDelay(i,j);            EdgeCost(i,j) = EdgeCostDUB(1)+(EdgeCostDUB(2)-EdgeCostDUB(1))*rand;            EdgeCost(j,i)=EdgeCost(i,j);            EdgeBandWide(i,j) = EdgeBandWideDUB(1)+(EdgeBandWideDUB(2)-EdgeBandWideDUB(1))*rand;            EdgeBandWide(j,i)=EdgeBandWide(i,j);        else            EdgeDelay(i,j) = inf;            EdgeDelay(j,i) = inf;            EdgeCost(i,j) = inf;            EdgeCost(j,i) = inf;            EdgeBandWide(i,j) = inf;            EdgeBandWide(j,i) = inf;        end    endendfor i = 1:NodeAmount    VertexCost(i) = VertexCostDUB(1)+(VertexCostDUB(2)-VertexCostDUB(1))*rand;    VertexDelay(i) = VertexDelayDUB(1)+(VertexDelayDUB(2)-VertexDelayDUB(1))*rand;    VertexDelayJitter(i) = VertexDelayJitterDUB(1)+(VertexDelayJitterDUB(2)-VertexDelayJitterDUB(1))*rand;    VertexPacketLoss(i) = VertexPacketLossDUB(1)+(VertexPacketLossDUB(2)-VertexPacketLossDUB(1))*rand;endNet_plot(BorderLength,NodeAmount,Sxy,EdgeCost,PlotIf);end%用于绘制网络拓扑的函数function Net_plot(BorderLength,NodeAmount,Sxy,EdgeCost,PlotIf)%画节点if PlotIf == 1    plot(Sxy(2,:),Sxy(3,:),'ko','MarkerEdgeColor','b','MarkerFaceColor','g','MarkerSize',5);    %设置图形显示范围    xlim([0,BorderLength]);    ylim([0,BorderLength]);    hold on;    %节点标序号    for i = 1:NodeAmount        Str = int2str(i);        text(Sxy(2,i)+BorderLength/100,Sxy(3,i)+BorderLength/100,Str,'FontName','Times New Roman','FontSize',12);        hold on;    endend%画边if PlotIf == 1    for i = 1:(NodeAmount-1)        for j = (i+1):NodeAmount            if isinf(EdgeCost(i,j)) == 0                plot([Sxy(2,i),Sxy(2,j)],[Sxy(3,i),Sxy(3,j)]);                hold on;            end        end    endendif PlotIf == 1    xlabel('x (km)','FontName','Times New Roman','FontSize',12);    ylabel('y (km)','FontName','Times New Roman','FontSize',12);endend

上述代码片在https://code.csdn.net/snippets/306505

写Matlab函数有三种,一种是M文件函数,如上面代码SalamNet_NetCreate.m,调用就是[Sxy,AM,EdgeCost,EdgeDelay,EdgeWide,VertexCost,VertexDelay,VertexDelayJitter,VertexPacketLoss]=SalamNet_NetCreate(1000,25,100000000,200000000000,1,[2,5],[30,1000],[2,4],1e-4*[5,20],1e-4*[3,8],1e-4*[0,500]),函数中function告诉这是一个Matlab函数,

一种是在线函数,inline()

f=inline('x+y','x','y')
创建了二元函数f(x,y)=x+y,工作区输入f(2,3)计算2+3,等同于feval_r(f,2,3)。


第三种是匿名函数

函数句柄=@(变量名) 函数表达式

上述文件函数运行得到的图如下:

SalamNet


0 0
原创粉丝点击