Salama网络拓扑随机生成算法Matlab源码
matlab拓扑优化99行代码
matlab拓扑优化99行代码以下是一份 MATLAB 拓扑优化的代码,该代码共99行,带有注释,共计1000字左右。
%% MATLAB 拓扑优化代码% 该代码实现了一种基于拓扑优化的算法,用于最小化结构体积并满足力学约束% 本代码适用于 MATLAB (版本 R2020a 或以上)。
使用前请确保已安装优化工具箱(Optimization Toolbox)。
% 作者:[作者姓名]% 时间:[编写时间]%% 1. 定义初始构型% 定义结构参数L = 1.0; % 长度H = 0.2; % 高度W = 0.01; % 宽度n_x = 30; % 网格数目(x-方向)n_y = 10; % 网格数目(y-方向)% 定义初始密度变量 rho(所有单元的密度都相等)rho_min = 1e-3; % 最小密度(设定为一个小值,以避免矩阵不可逆)rho = ones(n_x * n_y, 1) * 0.5; % 初始密度变量 rhorho(1:n_y) = 1.0; % 左侧固定边界rho((n_x-1)*n_y+1:n_x*n_y) = 1.0; % 右侧固定边界% 将 rho 转化为二维数组rho = reshape(rho, n_y, n_x)';rho = rho(:);% 定义单元尺寸变量 x 和 ydx = L / n_x;dy = H / n_y;x = repmat([0:dx:L]', n_y+1, 1);y = repmat([0:dy:H], n_x+1, 1)';% 绘制初始构型figurepcolor(x, y, reshape(rho, n_y, n_x))axis equalshading interpcolormap(gray)title('Initial Topology')%% 2. 定义边界和 FEA 参数% 定义边界和 FEA 网格xmin = 0; ymin = 0;xmax = L; ymax = H;nelx = n_x-1; nely = n_y-1;[xx,yy] = meshgrid(linspace(xmin,xmax,nx),linspace(ymin,ymax,ny));[II,JJ] = meshgrid(1:nelx,1:nely);% 定义单元编号矩阵(每个单元有8个节点)ind = reshape(1:(n_x+1)*(n_y+1), n_x+1, n_y+1);ind = ind(1:end-1, 1:end-1);eleInd = kron(ind, ones(8,1)) + kron(ones(size(ind)), [0 1 (n_x+1)*[1 1]+[0 1] (n_x+1)*(n_y+1)+[0 1] -n_x-1 -n_x]);%% 3. 定义拓扑优化参数% 定义拓扑优化参数volfrac = 0.45; % 允许的最大材料体积分数penal = 3; % Sigmoid 惩罚因子% 定义 Sigmoid 函数H = @(x, a) 1.0 ./ (1.0 + exp(-a .* x));% 定义材料与空气的弹性模量Emin = 1e-9; % 材料弹性模量E = H(rho, penal) * (E0-Emin) + Emin; % 节点弹性模量 % 定义 Sigmoid 求导矩阵H1rho = spdiags(H1(rho, penal), 0, dof, dof);% 定义全局刚度矩阵K = sparse(dof, dof);for el = 1:size(eleInd, 1)% 获取当前单元的节点编号nodes = eleInd(el,:);% 获取当前单元的节点坐标X = xy(nodes,:);% 计算单元刚度矩阵[Ke,~] = elestiff(X,E(nodes),nu);% 将单元刚度矩阵加入全局刚度矩阵K(nodes,nodes) = K(nodes,nodes) + Ke;end% 定义移动限制矩阵(仅移动 rho < 1 的节点)fixeddofs = union(zetax,zetay(:));freedofs = setdiff(1:dof,fixeddofs);% 定义循环参数iter = 1;change = 1.0;tol = 1e-6;maxIter = 100;rho0 = zeros(dof, 1);rho0(freedofs) = 1; % 初始密度为 1ksym = symrcm(K); % 使用对称逆消结构进行前置处理[L,U] = ilu(K(ksym,ksym)); % 使用不完全 LU 分解进行矩阵逆求解前置处理 while change > tol && iter <= maxIter% 保存当前的 rhorho_last = rho;% 使用 Sigmoud 函数更新单元弹性模量E = H(rho, penal) * (E0-Emin) + Emin;% 更新全局刚度矩阵K = sparse(dof, dof);for el = 1:size(eleInd, 1)% 获取当前单元的节点编号nodes = eleInd(el,:);% 获取当前单元的节点坐标X = xy(nodes,:);% 计算单元刚度矩阵[Ke,~] = elestiff(X,E(nodes),nu);% 将单元刚度矩阵加入全局刚度矩阵K(nodes,nodes) = K(nodes,nodes) + Ke;end% 移动节点[v,d] = eigs(K(freedofs,freedofs), 1, 'sm',struct('tol',1e-8,'maxit',500,'P',L(freedofs,freedofs),'D',U(freedofs,freedofs )));rho0(freedofs) = rho(freedofs) + v;rho = min(max(rho0, 0), 1);% 更新拓扑结构rho = update(rho, volfrac, x, y, n_x, n_y, H, H1, H1rho, Emin, penal);% 绘制拓扑结构figure(3)pcolor(reshape(rho, n_y, n_x)')shading interpaxis equaltitle(['Iteration: ', num2str(iter)])% 计算变化量change = norm(rho_last - rho);% 更新迭代计数器iter = iter + 1;end% 输出结果fprintf('Volume fraction: %f\n', sum(rho) / numel(rho)) fprintf('Compliance: %f\n', F' * full(K) * F)。
智能控制MALAB神经网络BP算法
智能控制MALAB神经网络BP算法智能控制MALAB神经网络BP算法是一种基于MATLAB平台的智能控制算法,用于神经网络的训练和优化。
BP算法,即反向传播算法,是一种常用的神经网络训练算法,通过不断调整网络权值和阈值,使得网络的输出与期望输出之间的误差最小化。
在MATLAB中,可以利用自带的神经网络工具箱来实现BP算法。
具体步骤如下:一、数据准备数据准备是智能控制MALAB神经网络BP算法的第一步,它涉及到准备训练数据集和测试数据集。
以下是数据准备的详细步骤:1.收集和整理数据:首先,需要收集与问题相关的数据,并将其整理成适合神经网络输入的格式。
数据可以来自实验、观测、模拟等途径。
2.数据预处理:对收集到的原始数据进行预处理,以便更好地适应神经网络的训练和优化。
预处理步骤可能包括数据清洗、去噪、归一化、标准化等。
这些步骤有助于提高数据的质量和可靠性。
3.数据划分:将整个数据集划分为训练数据集和测试数据集。
通常,大部分数据用于训练神经网络,而少部分数据用于测试网络的泛化能力。
常见的划分方法包括随机划分、交叉验证等。
4.数据编码:对于非数值型数据,需要进行编码转换成数值型数据。
例如,可以使用独热编码将分类变量转换为二进制向量。
5.数据特征选择:根据问题的需求和特征的相关性,选择合适的特征子集。
这有助于减少数据维度,提高训练效率和模型性能。
6.数据平衡:对于不平衡的数据集,可以采取一些方法来平衡正负样本的比例,例如过采样、欠采样、SMOTE等。
数据准备是神经网络训练的重要环节,对于获得良好的训练结果和模型性能至关重要。
通过合理的数据准备步骤,可以提高神经网络的训练效率和泛化能力,从而实现智能控制任务的优化。
二、网络创建使用MATLAB的神经网络工具箱,可以创建一个BP神经网络模型。
可以选择网络的拓扑结构,包括输入层、隐藏层和输出层的节点数目,以及激活函数等参数。
以下是网络创建的详细步骤:1.确定网络的拓扑结构:首先,需要确定网络的拓扑结构,包括输入层、隐藏层和输出层的节点数目。
复杂网络聚类系数和平均路径长度计算的MATLAB源代码
复杂网络聚类系数和平均路径长度计算的MA TLAB源代码申明:文章来自百度用户carrot_hy复杂网络的代码总共是三个m文件,复制如下:第一个文件,CCM_ClusteringCoef.mfunction [Cp_Global, Cp_Nodal] = CCM_ClusteringCoef(gMatrix, Types)% CCM_ClusteringCoef calculates clustering coefficients.% Input:% gMatrix adjacency matrix% Types type of graph:'binary','weighted','directed','all'(default). % Usage:% [Cp_Global, Cp_Nodal] = CCM_ClusteringCoef(gMatrix, Types)returns% clustering coefficients for all nodes "Cp_Nodal" and average clustering% coefficient of network "Cp_Global".% Example:% G = CCM_testGraph1('nograph');% [Cp_Global, Cp_Nodal] = CCM_ClusteringCoef(G);% Note:% 1) one node have vaule 0, while which only has a neighbour or none.% 2) The dircted network termed triplets that fulfill the follow condition % as non-vacuous: j->i->k and k->i-j,if don't satisfy with that as% vacuous, just like: j->i,k->i and i->j,i->k. and the closed triplets% only j->i->k == j->k and k->i->j == k->j.% 3) 'ALL' type network code from Mika Rubinov's BCT toolkit.% Refer:% [1] Barrat et al. (2004) The architecture of the complex weighted networks. % [2] Wasserman,S.,Faust,K.(1994) Social Network Analysis: Methods and% Applications.% [3] Tore Opsahl and Pietro Panzarasa (2009). "Clustering in Weighted% Networks". Social Networks31(2).% See also CCM_Transitivity% Written by Yong Liu, Oct,2007% Center for Computational Medicine (CCM),% National Laboratory of Pattern Recognition (NLPR),% Institute of Automation,Chinese Academy of Sciences (IACAS), China.% Revise by Hu Yong, Nov, 2010% E-mail:% based on Matlab 2006a% $Revision: 1.0, Copywrite (c) 2007error(nargchk(1,2,nargin,'struct'));if(nargin < 2), Types = 'all'; endN = length(gMatrix);gMatrix(1:(N+1):end) = 0;%Clear self-edgesCp_Nodal = zeros(N,1); %Preallocateswitch(upper(Types))case 'BINARY'%Binary networkgMatrix = double(gMatrix > 0);%Ensure binary networkfor i = 1:Nneighbor = (gMatrix(i,:) > 0);Num = sum(neighbor);%number of neighbor nodestemp = gMatrix(neighbor, neighbor);if(Num > 1), Cp_Nodal(i) = sum(temp(:))/Num/(Num-1); end endcase 'WEIGHTED'% Weighted network -- arithmetic meanfor i = 1:Nneighbor = (gMatrix(i,:) > 0);n_weight = gMatrix(i,neighbor);Si = sum(n_weight);Num = sum(neighbor);if(Num > 1),n_weight = ones(Num,1)*n_weight;n_weight = n_weight + n_weight';n_weight = n_weight.*(gMatrix(neighbor, neighbor) > 0); Cp_Nodal(i) = sum(n_weight(:))/(2*Si*(Num-1));endend%case 'WEIGHTED'% Weighted network -- geometric mean% A = (gMatrix~= 0);% G3 = diag((gMatrix.^(1/3) )^3);)% A(A == 0) = inf; %close-triplet no exist,let CpNode=0 (A=inf)% CpNode = G3./(A.*(A-1));case 'DIRECTED', % Directed networkfor i = 1:Ninset = (gMatrix(:,i) > 0); %in-nodes setoutset = (gMatrix(i,:) > 0)'; %out-nodes setif(any(inset & outset))allset = and(inset, outset);% Ensure aji*aik > 0,j belongs to inset,and k belongs to outset total = sum(inset)*sum(outset) - sum(allset);tri = sum(sum(gMatrix(inset, outset)));Cp_Nodal(i) = tri./total;endend%case 'DIRECTED', % Directed network -- clarity format (from Mika Rubinov, UNSW) % G = gMatrix + gMatrix'; %symmetrized% D = sum(G,2); %total degree% g3 = diag(G^3)/2; %number of triplet% D(g3 == 0) = inf; %3-cycles no exist,let Cp=0% c3 = D.*(D-1) - 2*diag(gMatrix^2); %number of all possible 3-cycles% Cp_Nodal = g3./c3;%Note: Directed & weighted network (from Mika Rubinov)case 'ALL',%All typeA = (gMatrix~= 0); %adjacency matrixG = gMatrix.^(1/3) + (gMatrix.').^(1/3);D = sum(A + A.',2); %total degreeg3 = diag(G^3)/2; %number of tripletD(g3 == 0) = inf; %3-cycles no exist,let Cp=0c3 = D.*(D-1) - 2*diag(A^2);Cp_Nodal = g3./c3;otherwise,%Eorr Msgerror('Type only four: "Binary","Weighted","Directed",and "All"');endCp_Global =sum(Cp_Nodal)/N;%%第二个文件:CCM_AvgShortestPath.mfunction [D_Global, D_Nodal] = CCM_AvgShortestPath(gMatrix, s, t)% CCM_AvgShortestPath generates the shortest distance matrix of source nodes % indice s to the target nodes indice t.% Input:% gMatrix symmetry binary connect matrix or weighted connect matrix % s source nodes, default is 1:N% t target nodes, default is 1:N% Usage:% [D_Global, D_Nodal] = CCM_AvgShortestPath(gMatrix) returns the mean% shortest-path length of whole network D_Global,and the mean shortest-path % length of each node in the network% Example:% G = CCM_TestGraph1('nograph');% [D_Global, D_Nodal] = CCM_AvgShortestPath(G);% See also dijk, MEAN, SUM% Written by Yong Liu, Oct,2007% Modified by Hu Yong, Nov 2010% Center for Computational Medicine (CCM),% Based on Matlab 2008a% $Revision: 1.0, Copywrite (c) 2007% ###### Input check #########error(nargchk(1,3,nargin,'struct'));N = length(gMatrix);if(nargin < 2 | isempty(s)), s = (1:N)';else s = s(:); endif(nargin < 3 | isempty(t)), t = (1:N)';else t = t(:); end% Calculate the shortest-path from s to all nodeD = dijk(gMatrix,s);%D(isinf(D)) = 0;D = D(:,t); %To target nodesD_Nodal = (sum(D,2)./sum(D>0,2));% D_Nodal(isnan(D_Nodal)) = [];D_Global = mean(D_Nodal);第三个文件: dijk.mfunction D = dijk(A,s,t)%DIJK Shortest paths from nodes 's' to nodes 't' using Dijkstra algorithm.% D = dijk(A,s,t)% A = n x n node-node weighted adjacency matrix of arc lengths% (Note: A(i,j) = 0 => Arc (i,j) does not exist;% A(i,j) = NaN => Arc (i,j) exists with 0 weight)% s = FROM node indices% = [] (default), paths from all nodes% t = TO node indices% = [] (default), paths to all nodes% D = |s| x |t| matrix of shortest path distances from 's' to 't' % = [D(i,j)], where D(i,j) = distance from node 'i' to node 'j'%% (If A is a triangular matrix, then computationally intensive node% selection step not needed since graph is acyclic (triangularityis a% sufficient, but not a necessary, condition for a graph to be acyclic)% and A can have non-negative elements)%% (If |s| >> |t|, then DIJK is faster if DIJK(A',t,s) used, where D is now% transposed and P now represents successor indices)%% (Based on Fig. 4.6 in Ahuja, Magnanti, and Orlin, Network Flows,% Prentice-Hall, 1993, p. 109.)% Copyright (c) 1998-2000 by Michael G. Kay% Matlog Version 1.3 29-Aug-2000%% Modified by JBT, Dec 2000, to delete paths% Input Error Checking******************************************************error(nargchk(1,3,nargin,'struct'));[n,cA] = size(A);if nargin < 2 | isempty(s), s = (1:n)'; else s = s(:); end if nargin < 3 | isempty(t), t = (1:n)'; else t = t(:); end if ~any(any(tril(A) ~= 0)) % A is upper triangularisAcyclic = 1;elseif ~any(any(triu(A) ~= 0)) % A is lower triangularisAcyclic = 2;else % Graph may not be acyclicisAcyclic = 0;endif n ~= cAerror('A must be a square matrix');elseif ~isAcyclic & any(any(A < 0))error('A must be non-negative');elseif any(s < 1 | s > n)error(['''s'' must be an integer between 1 and ',num2str(n)]);elseif any(t < 1 | t > n)error(['''t'' must be an integer between 1 and ',num2str(n)]);end% End (Input Error Checking)************************************************ A = A'; % Use transpose to speed-up FIND for sparse AD = zeros(length(s),length(t));P = zeros(length(s),n);for i = 1:length(s)j = s(i);Di = Inf*ones(n,1); Di(j) = 0;isLab = logical(zeros(length(t),1)); if isAcyclic == 1nLab = j - 1;elseif isAcyclic == 2nLab = n - j;elsenLab = 0;UnLab = 1:n;isUnLab = logical(ones(n,1));endwhile nLab < n & ~all(isLab)if isAcyclicDj = Di(j);else % Node selection[Dj,jj] = min(Di(isUnLab));j = UnLab(jj);UnLab(jj) = [];isUnLab(j) = 0;endnLab = nLab + 1;if length(t) < n, isLab = isLab | (j == t); end[jA,kA,Aj] = find(A(:,j));Aj(isnan(Aj)) = 0;if isempty(Aj), Dk = Inf; else Dk = Dj + Aj; endP(i,jA(Dk < Di(jA))) = j;Di(jA) = min(Di(jA),Dk);if isAcyclic == 1 % Increment node index for upper triangular Aj = j + 1;elseif isAcyclic == 2 % Decrement node index for lower triangular A j = j - 1;end%disp( num2str( nLab ));endD(i,:) = Di(t)';end。
matlab中随机数生成 -回复
matlab中随机数生成-回复如何在MATLAB中生成随机数随机数在MATLAB中被广泛应用于各种科学和工程领域,包括模拟实验、统计分析、数据生成和算法测试等。
本文将一步一步介绍如何在MATLAB 中生成随机数。
步骤一:了解随机数的种类在MATLAB中,有两种类型的随机数:均匀分布随机数和正态分布随机数。
均匀分布随机数是指在一定范围内,每个值出现的概率相等。
正态分布随机数是指符合正态分布概率密度函数的随机数。
步骤二:生成均匀分布随机数在MATLAB中,可以使用rand函数生成均匀分布随机数。
该函数返回一个0到1之间的随机数;如果需要生成某个范围内的随机数,可以通过线性变换实现。
以下是生成0到10之间均匀分布随机数的代码示例:matlabrandom_number = 10 * rand();若需要生成整个矩阵的随机值:matlabrandom_matrix = 10 * rand(m, n);其中m和n分别表示矩阵的行数和列数。
步骤三:生成指定范围的均匀分布随机数如果需要生成一个指定范围内的均匀分布随机数,可以通过线性变换实现。
以下是生成-5到5之间的均匀分布随机数的代码示例:matlabrandom_number = (b - a) * rand() + a;其中a和b分别表示指定范围的起始和结束值。
步骤四:生成正态分布随机数在MATLAB中,可以使用randn函数生成符合标准正态分布的随机数。
标准正态分布随机数的均值为0,方差为1。
以下是生成标准正态分布随机数的代码示例:matlabrandom_number = randn();若需要生成整个矩阵的随机值:matlabrandom_matrix = randn(m, n);步骤五:生成指定均值和方差的正态分布随机数如果需要生成一组具有指定均值和方差的正态分布随机数,可以通过线性变换和标准正态分布随机数实现。
以下是生成具有均值mu和方差sigma 的正态分布随机数的代码示例:matlabrandom_number = sigma * randn() + mu;其中mu和sigma分别表示指定的均值和方差。
matlab 普里姆算法
matlab 普里姆算法普里姆算法是一种最小生成树算法,用于求解给定图的最小生成树。
该算法基于贪心策略,每次选择当前已选中的点集到未选中的顶点集中距离最近的一条边,将该边所连接的点加入到已选中的点集中。
在实现普里姆算法时,我们需要使用一个优先队列用于存储当前已选中的点集到未选中的顶点集中的边,以及每个顶点到已选中的点集中最小距离。
在每次选取最小距离的边时,我们将该边所连接的点加入到已选中的点集中,并将该点与未选中的点集中的所有点之间的距离加入到优先队列中,同时更新已选中的点集到未选中的顶点集中的最小距离。
该过程重复进行,直到所有的顶点都已经被加入到已选中点集中,最终得到的图就是原图的最小生成树。
下面是使用matlab实现普里姆算法的示例代码:function MST = prim_algorithm(graph)% graph为邻接矩阵,MST为最小生成树的邻接矩阵表示n = size(graph, 1); % 获取图中节点数key = Inf(1,n); % 存储每个顶点与已选中点集的最小距离mst = zeros(n, n); % 存储最小生成树的邻接矩阵表示visited = false(1,n); % 存储每个顶点是否已加入到已选中点集中pq = PriorityQueue(n); % 创建优先队列start = 1; % 从任意一个顶点开始寻找最小生成树key(start) = 0; % 起始点距离已选中点集的最小距离为0pq.insert(start, 0); % 将起始点加入到优先队列中while ~pq.isempty() % 当优先队列非空时进行迭代[u, cost] = pq.deleteMin(); % 选取距离已选中点集最近的边visited(u) = true; % 将选中的顶点加入到已选中点集中if u ~= start % 将当前边加入到最小生成树的邻接矩阵中mst(parent(u), u) = cost;mst(u, parent(u)) = cost;endfor v = 1:n % 更新与已选点集中每个顶点的最小距离if ~visited(v) && graph(u,v) < key(v)parent(v) = u;key(v) = graph(u,v);if pq.contains(v)pq.updatePriority(v, key(v));elsepq.insert(v, key(v));endendendendMST = mst;end该代码中借助matlab的优先队列类PriorityQueue实现了优先队列的功能,其中包括了队列插入、队列删除、队列是否为空、队列中是否包含某元素以及队列中某元素优先级的更新等方法。
复杂网络主要拓扑参数的matlab实现
function [DeD,aver_DeD]=Degree_Distribution(A)%% 求网络图中各节点的度及度的分布曲线%% 求解算法:求解每个节点的度,再按发生频率即为概率,求P(k)%A————————网络图的邻接矩阵%DeD————————网络图各节点的度分布%aver_DeD———————网络图的平均度N=size(A,2);DeD=zeros(1,N);for i=1:N% DeD(i)=length(find((A(i,:)==1)));DeD(i)=sum(A(i,:));endaver_DeD=mean(DeD);if sum(DeD)==0disp('该网络图只是由一些孤立点组成');return;elsefigure;bar([1:N],DeD);xlabel('节点编号n');ylabel('各节点的度数K');title('网络图中各节点的度的大小分布图');endfigure;M=max(DeD);for i=1:M+1; %网络图中节点的度数最大为M,但要同时考虑到度为0的节点的存在性N_DeD(i)=length(find(DeD==i-1));% DeD=[2 2 2 2 2 2]endP_DeD=zeros(1,M+1);P_DeD(:)=N_DeD(:)./sum(N_DeD);bar([0:M],P_DeD,'r');xlabel('节点的度K');ylabel('节点度为K的概率P(K)');title('网络图中节点度的概率分布图');function[C,aver_C]=Clustering_Coefficient(A)%% 求网络图中各节点的聚类系数及整个网络的聚类系数%% 求解算法:求解每个节点的聚类系数,找某节点的所有邻居,这些邻居节点构成一个子图%% 从A中抽出该子图的邻接矩阵,计算子图的边数,再根据聚类系数的定义,即可算出该节点的聚类系数%A————————网络图的邻接矩阵%C————————网络图各节点的聚类系数%aver———————整个网络图的聚类系数N=size(A,2);C=zeros(1,N);for i=1:Naa=find(A(i,:)==1); %寻找子图的邻居节点if isempty(aa)disp(['节点',int2str(i),'为孤立节点,其聚类系数赋值为0']);C(i)=0;elsem=length(aa);if m==1disp(['节点',int2str(i),'只有一个邻居节点,其聚类系数赋值为0']);C(i)=0;elseB=A(aa,aa) % 抽取子图的邻接矩阵C(i)=length(find(B==1))/(m*(m-1));endendendaver_C=mean(C)function [D,aver_D]=Aver_Path_Length(A)%% 求复杂网络中两节点的距离以及平均路径长度%% 求解算法:首先利用Floyd算法求解出任意两节点的距离,再求距离的平均值得平均路径长度% A————————网络图的邻接矩阵% D————————返回值:网络图的距离矩阵% aver_D———————返回值:网络图的平均路径长度N=size(A,2);D=A;D(find(D==0))=inf; %将邻接矩阵变为邻接距离矩阵,两点无边相连时赋值为inf,自身到自身的距离为0.for i=1:ND(i,i)=0;endfor k=1:N %Floyd算法求解任意两点的最短距离for i=1:Nfor j=1:Nif D(i,j)>D(i,k)+D(k,j)D(i,j)=D(i,k)+D(k,j);endendendendaver_D=sum(sum(D))/(N*(N-1)) %平均路径长度if aver_D==infdisp('该网络图不是连通图');end%% 算法2:用时间量级O(MN)的广度优先算法求解一个含N个节点和M条边的网络图的平均路径长度可以求出复杂网络中两节点间的距离以及平均路径长度,各节点的度及度的分布曲线,以及节点的聚类系数。
网络拓扑知识:基于网络拓扑的伪随机数生成算法
网络拓扑知识:基于网络拓扑的伪随机数生成算法伪随机数生成算法是一种在计算机程序设计中广泛应用的算法。
它可以生成看似随机的数列,但实际上是由一定的规则和算法生成,并不具有真正的随机性。
在伪随机数生成算法中,网络拓扑是一个非常重要的概念,因为网络拓扑的组织结构可以为生成高质量的伪随机数提供有效的支持。
网络拓扑是计算机网络中最基本的组成部分之一,它描述了网络节点之间的物理连接关系和逻辑结构。
在现代计算机网络中,常见的网络拓扑有星型、总线型、环型、树型、网格型、混合型等。
不同类型的网络拓扑适用于不同的应用场景,例如星型拓扑适用于小型网络,树型拓扑适用于中型网络,而网格型拓扑则适用于大型分布式系统。
在伪随机数生成算法中,网络拓扑可以使用来生成高质量的伪随机数。
在这种情况下,网络拓扑被视为一种特殊的随机数生成器,它可以生成一系列随机的拓扑结构,然后在这些结构上执行特定的算法,以生成高质量的伪随机数序列。
一种基于网络拓扑的伪随机数生成算法是著名的广义反馈移位寄存器(Generalized Feedback Shift Register,GFSR)算法。
该算法依据一个初始值和一组存储器单元,以及一个特定的多项式,通过移位和异或操作不断更新存储器单元中的值,最终生成一个高质量的伪随机数序列。
在这个算法中,网络拓扑被用来构建存储器单元之间的连接关系。
这些连接形成了一个形式化的图形结构,可以通过遍历整个拓扑结构来调整存储器单元中的值。
每个存储器单元的值都是根据其所有相邻单元的值以及特定的多项式生成的,因此这个算法可以生成高质量的随机数序列。
除了GFSR算法之外,还有其他基于网络拓扑的伪随机数生成算法,例如循环冗余校验码(Cyclic Redundancy Check,CRC)算法、扩散函数、chaos映射等。
这些算法都是通过在不同的网络拓扑中执行特定的算法来生成高质量的伪随机数序列。
总的来说,基于网络拓扑的伪随机数生成算法是一种非常有效的算法,可以在众多应用场景中发挥作用。
Matlab中的随机数生成方法与应用案例
Matlab中的随机数生成方法与应用案例引言:随机数在数学、统计学和计算机科学等领域中具有重要的应用价值。
在大数据分析、模拟实验以及密码学等领域,随机数生成方法的选择和应用至关重要。
Matlab作为一种常用的科学计算软件,提供了多种随机数生成方法和函数。
本文将介绍Matlab中常用的随机数生成方法,以及如何在实际应用中选择合适的方法来满足需求。
一、Matlab中的随机数生成方法1. 均匀分布随机数生成方法Matlab中的`rand`函数可以生成一个0到1之间的均匀分布的随机数。
该函数返回的随机数是一个矩阵,可以通过设定参数来控制矩阵的大小。
```matlabx = rand(1, 100); % 生成一个1行100列的矩阵,每个元素在0到1之间```2. 高斯分布随机数生成方法Matlab中的`randn`函数可以生成服从均值为0,方差为1的标准正态分布的随机数。
该函数返回的随机数也是一个矩阵,大小也可以通过参数进行控制。
```matlabx = randn(1, 100); % 生成一个1行100列的矩阵,每个元素满足标准正态分布```3. 二项分布随机数生成方法Matlab中的`binornd`函数可以生成二项分布的随机数。
该函数需要指定实验次数和成功概率,并返回符合二项分布的随机数。
```matlabx = binornd(10, 0.5); % 进行10次实验,每次成功的概率为0.5,返回符合二项分布的随机数```4. 泊松分布随机数生成方法Matlab中的`poissrnd`函数可以生成泊松分布的随机数。
该函数需要指定均值,并返回符合泊松分布的随机数。
```matlabx = poissrnd(5); % 均值为5的泊松分布随机数```5. 均匀整数分布随机数生成方法Matlab中的`randi`函数可以生成指定范围内的均匀分布的整数随机数。
该函数需要指定随机数的范围和生成的矩阵大小。
Waxman-Salama模型网络拓扑生成算法设计与实现
De i n a d I plm e t0 n o t r sg n m e n fRa d m Ne wo k
To o o y Usng W a m a ・a a a M o e p lg i x n— l m d l s
ZH0U ng Li
( p rme t f mp trS in e F s a ie s y F s a 2 0 0 Chn ) De at n o Co ue ce c , o h nUnv ri , o h n5 8 0 , ia t
否存 在一 条直 接相 连 的链路 :
( ) ep = x () 1
其中, 参数 l , ) U V 间的几何距离, ( v u 为 与 之 £为拓扑图中所有结点距离的最大值. , 是调节网络特性的 a
W a m a — aa d l wa nr d c d i h a e isl.T e h d a t g s a d d s d a tg s we e d s u s d a d t e x n S lma mo e s i t u e n t e p p r f t o r y h n te a v na e n ia v na e r ic s e n h c n e t n p ro m a c fl k g si r v d T ek y tc n q e r o ae b u mp e n h l o i m. i g v s a o n ci e f r n e o n a e wa mp o e . h e e h i u swe e l c td a o ti lme t e a g r h o i t t Usn iu l
smu ae n t en t r p l g . i l td o ewo k t o o y h o Ke r s n t r d e ; o o o y; l o i m e i n smu ai n ywo d : ewo k mo l t p l g a g rt d sg ; i l t h o
Salama网络拓扑随机生成算法Matlab源码
Salama网络拓扑随机生成算法Matlab源码(2007-03-06 10:19:00)%Salama博士的网络拓扑随机生成算法%Border_length----正方形区域的边长,单位:km%Node_amount------网络节点的个数%Alpha------------网络特征参数,Alpha越大,短边相对长边的比例越大%Beta-------------网络特征参数,Beta越大,边的密度越大%Sxy--------------用于存储节点的序号,横坐标,纵坐标的矩阵%Cost-------------用于存储边的费用的邻接矩阵,费用在[2,10]之间随机选取,无边的取无穷大%Delay------------用于存储边的时延的邻接矩阵,时延等于边的距离除以三分之二光速,无边的取无穷大function [Sxy,Cost,Delay]=Net_Create(Border_length,Node_amount,Alpha,Beta)%参数初始化Sxy=zeros(3,Node_amount);Cost=zeros(Node_amount,Node_amount);Delay=Cost;%在正方形区域内随机均匀选取Node_amount个节点for i=1:Node_amountSxy(2,i)=Border_length*rand;Sxy(3,i)=Border_length*rand;end%按横坐标由小到大的顺序重新为每一个节点编号temp=Sxy;Sxy2=Sxy(2,:);Sxy2_sort=sort(Sxy2);for i=1:Node_amountpos=find(Sxy2==Sxy2_sort(i));if length(pos)>1error('仿真故障,请重试!');endtemp(1,i)=i;temp(2,i)=Sxy(2,pos);temp(3,i)=Sxy(3,pos);endSxy=temp;%在节点间随机产生边,并构造延时矩阵和费用矩阵for i=1:(Node_amount-1)for j=(i+1):Node_amountDistance=((Sxy(2,i)-Sxy(2,j))^2+(Sxy(3,i)-Sxy(3,j))^2)^0.5; P=Beta*exp(-Distance/(Alpha*Border_length));if P>randDelay(i,j)=0.5*Distance/100000;Delay(j,i)=Delay(i,j);Cost(i,j)=2+8*rand;Cost(j,i)=Cost(i,j);elseDelay(i,j)=inf;Delay(j,i)=inf;Cost(i,j)=inf;Cost(j,i)=inf;endendendNet_plot(Border_length,Node_amount,Sxy,Cost,Delay)%用于绘制网络拓扑的函数function Net_plot(Border_length,Node_amount,Sxy,Cost,Delay)%画节点plot(Sxy(2,:),Sxy(3,:),'k.')%设置图形显示范围xlim([0,Border_length]);ylim([0,Border_length]);hold on%为节点标序号for i=1:Node_amountStr=int2str(i);text(Sxy(2,i),Sxy(3,i),Str);hold onend%画边,并给边标注费用和延时for i=1:(Node_amount-1)for j=(i+1):Node_amountif isinf(Cost(i,j))==0plot([Sxy(2,i),Sxy(2,j)],[Sxy(3,i),Sxy(3,j)]);xx=0.5*(Sxy(2,i)+Sxy(3,i));yy=0.5*(Sxy(2,j)+Sxy(3,j)); Str1=num2str(Cost(i,j));Str2=num2str(Delay(i,j));Str1=Str1(1:3);Str2=Str2(1:3);%text(xx,yy,[Str1,',',Str2]) hold onendendend。
三维拓扑优化matlab代码
三维拓扑优化matlab代码
三维拓扑优化是一种复杂的工程问题,涉及到材料、结构和优
化算法等多个领域。
在MATLAB中进行三维拓扑优化需要使用一些专
门的工具和算法。
下面我将从几个方面来介绍三维拓扑优化的MATLAB代码。
首先,三维拓扑优化通常涉及有限元分析和优化算法。
在MATLAB中,有限元分析常常使用COMSOL Multiphysics或者FEATool Multiphysics等工具箱来实现。
这些工具箱提供了丰富的
有限元分析功能,可以用来建立三维结构的模型,并进行应力分析、变形分析等。
在进行拓扑优化时,可以将有限元分析的结果作为优
化算法的输入。
其次,对于优化算法,MATLAB提供了优化工具箱,包括fmincon、ga等优化函数,可以用来实现拓扑优化算法。
在进行三
维拓扑优化时,可以将结构的密度分布作为设计变量,通过优化算
法来调整密度分布,以实现结构的最优设计。
另外,在进行三维拓扑优化时,还需要考虑到约束条件的处理。
MATLAB的优化工具箱提供了丰富的约束处理功能,可以用来处理各
种约束条件,包括几何约束、材料约束等。
最后,三维拓扑优化的MATLAB代码通常需要结合自定义的函数
和脚本来实现。
这些函数和脚本可以用来处理特定的优化问题,比
如定义目标函数、约束条件等。
综上所述,进行三维拓扑优化的MATLAB代码涉及到有限元分析、优化算法、约束条件处理以及自定义函数和脚本等多个方面。
在实
际编写代码时,需要结合具体的优化问题来选择合适的工具和算法,并进行适当的定制化。
希望这些信息能够对你有所帮助。
matlab伪随机数生成算法
matlab伪随机数生成算法
Matlab中的伪随机数生成算法是基于梅森旋转算法(Mersenne Twister)的。
梅森旋转算法是一种高质量的伪随机数生成器,具有较长的周期和良好的统计性质。
在Matlab中,可以使用rand函数生成伪随机数。
该函数返回一个0到1之间的均匀分布的伪随机数。
具体来说,Matlab使用了叫做梅森旋转算法的算法来生成这些伪随机数。
梅森旋转算法是一种递归算法,它使用一个624维的状态向量来生成伪随机数。
每次调用rand函数时,梅森旋转算法会根据状态向量中的值计算出一个新的伪随机数,并更新状态向量的值。
当状态向量的值用尽后,梅森旋转算法会重新计算一组新的状态向量。
由于梅森旋转算法具有较长的周期,因此在Matlab中生成的伪随机数具有较好的随机性和统计性质。
但需要注意的是,由于是伪随机数生成算法,因此生成的随机数序列是确定性的,即给定相同的种子,生成的随机数序列是相同的。
如果需要更高质量的伪随机数生成算法,可以使用Matlab中的randn函数生成服从标准正态分布的伪随机数,或使用其他高级随机数生成函数如randperm、randi等。
matlab生成随机数函数
matlab生成随机数函数1. MA TLAB 函数 rand产生在区间 (0, 1)的均匀随机数,它是平均分布在 (0,1)之间。
一个称为seed的值则是用来控制产生随机数的次数。
均匀随机数函数的语法为rand(n),rand(m,n),其结果分别产生一矩阵含n×n个随机数和一矩阵含m×n的随机数。
注意每次产生随机数的值都不会一样,这些值代表的是随机且不可预期的,这正是我们用随机数的目的。
我们可利用这些随机数代入算式中,来表示某段讯号的不规则振幅或是某个事件出现的机率。
均匀随机数其值平均的分布于一区间的特性可以从其统计密度函数(probabilitydensity function, PDF)说明。
从其PDF分布类似长条图的分布,可以看出其每一个随机数值出现的机率皆相同,所以它被称为均匀随机数。
见以下的例子:>> rand(1,6) % 第一次使用随机数产生器ans =0.2190 0.0470 0.6789 0.6793 0.9347 0.3835>>hist(ans) % 看看长条图的长相>>plot(ans) % 比较上个图与这个图有何差异?何者能代表不规则数据的分布>> rand(1,6) % 第二次使用随机数产生器,注意每次产生的随机数值皆不同ans =0.5194 0.8310 0.0346 0.0535 0.5297 0.6711因为每次随机数产生的值皆不同,如果因为验证算式需要确定所使用的随机数值是相同的,可以利用seed这个选项,用以设定使用计算随机数产生器的起始值,其语法为rand('seed',n),n的规定是。
其中n=0有特别意义是使用第一次产生随机数值的起始值(=931316785),其它的n值即是所使用起始值。
如果使用相同的起始值,则随机数值会一样,因为随机数的计算是依据起始值。
请看以下的例子:>> rand('seed',0) % 将随机数值的起始值重设,相当于是第一次产生随机数值>>rand('seed') % 显示现在使用的 seed 值=931316785ans =931316785>> rand(2,3) % 注意随机数值的上下限介于 [0,1] 区间ans =0.2190 0.6789 0.93470.0470 0.6793 0.3835>> rand('seed') % 显示再产生随机数值所用的seed=412659990ans =412659990>> rand('seed',0)>> rand(1,6)ans =0.2190 0.0470 0.6789 0.6793 0.9347 0.3835>> rand('seed',100) % 设定随机数值的起始值=100>> rand('seed')ans =100>> rand(2,5)ans =0.2909 0.0395 0.3671 0.5968 0.92530.0484 0.5046 0.9235 0.8085 0.3628如果需要产生随机数值不是介于[0,1]区间,可以采用以下步骤将随机数值从[0,1]区间转换到其它区间。
产生任意点数的随机拓扑图matlab代码
%这个函数可以产生任意点数的随机拓扑图以及对应的连接矩%阵,需要输入的参数是点数numfunction [L]=connectionM(num)%产生数组A用来存放表示两点之间权值的矩阵A,也就是临接矩阵,那么两点之间权值不为零元素的个数即为该点的度数DEF=num; %设定一个东东方便改变随机点的个数L=rand(DEF);%产生DEF*DEF的随机矩阵for i=1:DEFL(i,i)=0;%将对角线上的数置为0endL=10*L;L=floor(L);%向下去整L=mod(L,2);for i=1:DEFfor j=1:iL(j,i)=L(i,j);%将A矩阵变为一个上三角或者下三角矩阵endendx=100*rand(1,DEF);y=100*rand(1,DEF);%产生10个随机的点plot(x,y,'r+');for i=1:DEFa=find(L(i,:)>0);%将A矩阵每行大于0的数的在该行的地址找出来放在a中for j=1:length(a)c=num2str(L(i,j)); %将A中的权值转化为字符型hold on;line([x(i) x(a(j))],[y(i) y(a(j))]);%连线endendtitle('随机拓扑图');e=num2str(DEF);legend(e);%左上角显示节点的个数for m=1:DEFf=num2str(m);hold on;text((x(m)+x(m))/2,(y(m)+y(m))/2,f,'Fontsize',18);%将权值显示在两点连线中间endhold off。
最新版改进Salam网络拓扑随机生成算法通用MATLAB源
最新版改进Salam网络拓扑随机生成算法通用MATLAB源(2008-11-15 10:00:47)标签:杂谈题目:最新版改进Salam网络拓扑随机生成算法通用MATLAB源码本程序为最新版源码,源码无删减,能绘出漂亮的网络拓扑图片,算法改进说明如下:1.使用K均值聚类控制节点分布的疏密,使得产生的网络拓扑连通性和均匀性更好2.产生的网络拓扑数据丰富,包括:链路的费用、时延、带宽,节点的费用、时延、时延抖动、丢包率3.链路时延等于节点距离除以三分之二光速,更加符合实际情况本源码由GreenSim团队原创,转载请注明,有意购买源码或代写相关程序,请与GreenSim 团队联系(主页)。
function[Sxy,AM,EdgeCost,EdgeDelay,EdgeBandWide,VertexCost,VertexDelay,VertexDelayJitte r,VertexPacketLoss]=NetCreate...(BorderLength,NodeAmount,Alpha,Beta,PlotIf,EdgeCostDUB,EdgeBan dWideDUB,VertexCostDUB,VertexDelayDUB,VertexDelayJitterDUB,VertexPacketLossDUB) %% 改进的Salama网络拓扑随机生成算法% GreenSim团队原创作品,转载请注明% Email:greensim@% GreenSim团队主页:% [color=red]欢迎访问GreenSim——算法仿真团队→ 1.使用K均值聚类控制节点分布的疏密,使得产生的网络拓扑连通性和均匀性更好% 2.产生的网络拓扑数据丰富,包括:链路的费用、时延、带宽,节点的费用、时延、时延抖动、丢包率% 3.链路时延等于节点距离除以三分之二光速,更加符合实际情况%% 输入参数列表% BorderLength------------正方形区域的边长,单位: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----------------------01存储的邻接矩阵,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:NNSSxy(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:NodeAmountpos=find(Sxy2==Sxy2_sort(i));if length(pos)>1error('仿真故障,请重试!');endtemp(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):NodeAmountDistance=((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>randAM(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);elseEdgeDelay(i,j)=inf;EdgeDelay(j,i)=inf;EdgeCost(i,j)=inf;EdgeCost(j,i)=inf;EdgeBandWide(i,j)=inf;EdgeBandWide(j,i)=inf;endendendfor i=1:NodeAmountVertexCost(i)=VertexCostDUB(1)+(VertexCostDUB(2)-VertexCostDUB(1))*rand;VertexDelay(i)=VertexDelayDUB(1)+(VertexDelayDUB(2)-VertexDelayDUB(1))*r and;VertexDelayJitter(i)=VertexDelayJitterDUB(1)+(VertexDelayJitterDUB(2)-Ve rtexDelayJitterDUB(1))*rand;VertexPacketLoss(i)=VertexPacketLossDUB(1)+(VertexPacketLossDUB(2)-Verte xPacketLossDUB(1))*rand;endNet_plot(BorderLength,NodeAmount,Sxy,EdgeCost,PlotIf);%用于绘制网络拓扑的函数function Net_plot(BorderLength,NodeAmount,Sxy,EdgeCost,PlotIf)%画节点if PlotIf==1plot(Sxy(2,:),Sxy(3,:),'ko','MarkerEdgeColor','b','MarkerFaceColor','g', 'MarkerSize',5)%设置图形显示范围xlim([0,BorderLength]);ylim([0,BorderLength]);hold on%为节点标序号for i=1:NodeAmountStr=int2str(i);text(Sxy(2,i)+BorderLength/100,Sxy(3,i)+BorderLength/100,Str,'Fo ntName','Times New Roman','FontSize',12);hold onendend%画边if PlotIf==1for i=1:(NodeAmount-1)for j=(i+1):NodeAmountif isinf(EdgeCost(i,j))==0plot([Sxy(2,i),Sxy(2,j)],[Sxy(3,i),Sxy(3,j)]);hold onendendendendif PlotIf==1xlabel('x (km)','FontName','Times New Roman','FontSize',12);ylabel('y (km)','FontName','Times New Roman','FontSize',12);end欢迎访问GreenSim团队主页:[color=red]欢迎访问GreenSim——算法仿真团队→。
随机覆盖法matlab实现
随机覆盖法matlab实现
随机覆盖法是一种常用的随机化算法,常用于实验设计、抽样调查等领域。
在MATLAB中,可以使用randperm函数实现随机覆盖法。
randperm函数的语法如下:
p = randperm(n,k)
其中,n表示生成随机排列的范围,k表示生成的随机排列的长度。
该函数会生成一个长度为k的随机排列p,其中每个元素都是1到n之间的整数,并且每个元素只会出现一次。
例如,要生成一个1到10之间的随机排列,可以使用如下代码:
p = randperm(10)
生成的结果可能是:
p = [8 1 5 2 10 7 3 9 4 6]
这个排列中,每个数字都只出现了一次,且顺序是随机的。
如果要使用随机覆盖法生成一个样本,可以先生成一个包含所有样本的列表,然后使用randperm函数生成一个随机排列,再取前k个元素作为样本。
例如,假设有一个包含100个样本的列表,要从中随机抽取10个样本,可以使用如下代码:
all_samples = 1:100; % 生成包含所有样本的列表
random_perm = randperm(100); % 生成一个1到100的随机排列sample = all_samples(random_perm(1:10)); % 取前10个元素作为样本
这样就可以使用随机覆盖法生成一个包含10个样本的随机样本了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Salama网络拓扑随机生成算法Matlab源码(2007-03-0610:19:00)
%Salama博士的网络拓扑随机生成算法
%Border_length----正方形区域的边长,单位:km
%Node_amount------网络节点的个数
%Alpha------------网络特征参数,Alpha越大,短边相对长边的比例越大
%Beta-------------网络特征参数,Beta越大,边的密度越大
%Sxy--------------用于存储节点的序号,横坐标,纵坐标的矩阵
%Cost-------------用于存储边的费用的邻接矩阵,费用在[2,10]之间随机选取,无边的取无穷大
%Delay------------用于存储边的时延的邻接矩阵,时延等于边的距离除以三分之二光速,无边的取无穷大
function[Sxy,Cost,Delay]=Net_Create(Border_length,Node_amount,Alpha,Beta)
%参数初始化
Sxy=zeros(3,Node_amount);
Cost=zeros(Node_amount,Node_amount);
Delay=Cost;
%在正方形区域内随机均匀选取Node_amount个节点
for i=1:Node_amount
Sxy(2,i)=Border_length*rand;
Sxy(3,i)=Border_length*rand;
end
%按横坐标由小到大的顺序重新为每一个节点编号
temp=Sxy;
Sxy2=Sxy(2,:);
Sxy2_sort=sort(Sxy2);
for i=1:Node_amount
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);
end
Sxy=temp;
%在节点间随机产生边,并构造延时矩阵和费用矩阵
for i=1:(Node_amount-1)
for j=(i+1):Node_amount
Distance=((Sxy(2,i)-Sxy(2,j))^2+(Sxy(3,i)-Sxy(3,j))^2)^0.5;
P=Beta*exp(-Distance/(Alpha*Border_length));
if P>rand
Delay(i,j)=0.5*Distance/100000;
Delay(j,i)=Delay(i,j);
Cost(i,j)=2+8*rand;
Cost(j,i)=Cost(i,j);
else
Delay(i,j)=inf;
Delay(j,i)=inf;
Cost(i,j)=inf;
Cost(j,i)=inf;
end
end
end
Net_plot(Border_length,Node_amount,Sxy,Cost,Delay)
%用于绘制网络拓扑的函数
function Net_plot(Border_length,Node_amount,Sxy,Cost,Delay)
%画节点
plot(Sxy(2,:),Sxy(3,:),'k.')
%设置图形显示范围
xlim([0,Border_length]);
ylim([0,Border_length]);
hold on
%为节点标序号
for i=1:Node_amount
Str=int2str(i);
text(Sxy(2,i),Sxy(3,i),Str);
hold on
end
%画边,并给边标注费用和延时
for i=1:(Node_amount-1)
for j=(i+1):Node_amount
if isinf(Cost(i,j))==0
plot([Sxy(2,i),Sxy(2,j)],[Sxy(3,i),Sxy(3,j)]);
xx=0.5*(Sxy(2,i)+Sxy(3,i));
yy=0.5*(Sxy(2,j)+Sxy(3,j));
Str1=num2str(Cost(i,j));
Str2=num2str(Delay(i,j));
Str1=Str1(1:3);
Str2=Str2(1:3);
%text(xx,yy,[Str1,',',Str2])
hold on
end
end
end。