节点寻址算法
‘壹’ 梦幻西游自动寻路的寻路算法怎么算
A*寻路算法 A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。
公式表示为: f(n)=g(n)+h(n),
其中f(n) 是节点n从初始点到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n)是从n到目标节点最佳路径的估计代价。
保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:
估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
如果 估价值>实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
估价值与实际值越接近,估价函数取得就越好。
例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。
conditions of heuristic
Optimistic (must be less than or equal to the real cost)
As close to the real cost as possible
主要搜索过程:
创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,->算X的估价值->
While(OPEN!=NULL)
{
从OPEN表中取估价值f最小的节点n;
if(n节点==目标节点) break;
else
{
if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于OPEN表的估价值 )
更新OPEN表中的估价值; //取最小路径的估价值
if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于CLOSE表的估价值 )
更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值
if(X not in both)
求X的估价值;
并将X插入OPEN表中; //还没有排序
}
将n节点插入CLOSE表中;
按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
启发式搜索其实有很多的算法,比如:局部择优搜索法、最好优先搜索法等等。当然A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。象局部择优搜索法,就是在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍弃了其他的节点,可能也把最好的
节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。最好优先就聪明多了,他在搜索时,便没有舍弃节点(除非该节点是死节点),在每一步的估价
中都把当前的节点和以前的节点的估价值比较得到一个“最佳的节点”。这样可以有效的防止“最佳节点”的丢失。那么A*算法又是一种什么样的算法呢?其实A*算法也是一种最
好优先的算法。只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求解问题,A*就是干这种事情的!
我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:
f'(n) = g'(n) + h'(n)
这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值,h'(n)是n到目标的最断路经的启发值。由于这个f'(n)其实是无法预先知道的,所以我们用前面的估价函数f(n)做
近似。g(n)代替g'(n),但 g(n)>=g'(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h'(n),但h(n)<=h'(n)才可(这一点特别的重要)。可以证明应用这样的估价
函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A*算法。哈。你懂了吗?肯定没懂。接着看。
举一个例子,其实广度优先算法就是A*算法的特例。其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h'(n),所以由前述可知广度优先算法是一种可采纳的。实际也是
。当然它是一种最臭的A*算法。
再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除的节点就越多,估价函
数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。但在游戏开发中由于实时性的问题,h(n)的信息越多,它的计
算量就越大,耗费的时间就越多。就应该适当的减小h(n)的信息,即减小约束条件。但算法的准确性就差了,这里就有一个平衡的问题。
}
‘贰’ 衡量无线传感网络节点定位算法的性能指标有哪些
定位精准度:空间实体位置信息与真实位置之间的接近程度。
有效定位范围:定位系统所能定位的有效范围
节点密度:播撒的传感器节点的疏密程度
信标节点密度:信标节点在整个WSN中所占比例
容错性与自适应性
安全性:指系统对合法用户的响应以及对非法请求的抗拒
功耗:低
代价与成本:包括时间代价,空间代价,资金代价都要尽可能低
‘叁’ 无线传感器网络移动节点定位算法有哪些比较新的理论方法
大致有这几种种算法:信号强度、收信角度、收信时间和收信时间差。还有特殊一点的位置指纹算法。
1、信号强度是指距离和信号强度之间有一定的函数关系,通过接收到的信号强度可以推算出距离。这种方法受到的干扰太大,误差非常大。
2、收信角度是指两个蜂窝状接收装置可以分辨出信号的来源,做两条射线,交点即为位置。精度一般。
3、收信时间法是指从发送到接收是有时间差的,发送的时候信号中包含时间信息,接收的时候对照接收时间,做差即可。由于电磁波速度快,所以对于时间校准的要求很高。
4、收信时间差法是指移动点接收来自两个基站的不同信号,可以测量前后两次接收到信号的时间差。根据双曲线定义:到两定点距离差为定值的点在双曲线上。那么再来两个基站,所做双曲线的交点,就是所求点的距离。这种方法是上述几种精度最高的。
5、位置指纹算法。是指在待测区域内布置指纹状一层层的节点,这样在这样的网中放置一个待测节点,那么待测节点的位置可以通过插值法计算出。精度也比较高,不过需要布置比较节点。(摘自中国物联网校企联盟第二十一期线上活动)
希望有所帮助! 求采纳~
-中国物联网校企联盟技术部
‘肆’ 关节点的求解算法
利用深度优先搜索便可以求的图的关节点,本由此可判别图是否重连通。
从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点为邻接点。由深度优先生成树可得出两类关节点的特性:
(1)若生成树的根有两棵或两棵以上的子树,则此根顶点必为关节点。因为图中不存在连接不同子树顶点的边,若删除此节点,则树便成为森林。
(2)若生成树中某个非叶子节点V,其某棵子树与V的祖先节点无连接,则V为关节点。因为删去v,则其子树和图的其它部分被分割开来 low[v] 设对连通图G=(V,E)进行先深搜索的先深编号为dnf[v],产生的先深生成树为S=(V,T),B试回退边之集。对每个顶点v,low[v]定义如下
low[v]=Min{dfn[v],Min{low[w]|w是v的一个子女},Min{dfn[x]|(v,x)是一条回边}}//dfn数组记录顶点的深度优先数
算法: 求无向图的双连通分量
输入:连通的无向图G=( V, E )。L[v]表示关于v的邻接表
输出:G的所有双连通分量,每个连通分量由一序列的边组成。 1.计算先深编号:对图进行先深搜索,计算每个结点v的先深编号dnf[v],形成先深生成树S=(V,T)。
2.计算low[v]:在先深生成树上按后根顺序进行计算每个顶点v的 low[v], low[v]取下述三个结点中的最小者:
(1) dfn[v];
(2) dfn[w],凡是有回退边(v,w)的任何结点w;
(3) low[y],对v的任何儿子y。
3.求关节点:
(1)树根是关节点,当且仅当它有两个或两个以上的儿子(第一类关节点);
(2)非树根结点v是关节点当且仅当v有某个儿子y,使low[y]≥dnf[v](第二类关节点)。
求双连通分量的算法――同先深搜索算法(略)
‘伍’ Hashmap 与 jdk1.8中对hash算法和寻址算法是如何优化的
数组+最简单的原理
[<张三,32岁>,<李四,54岁>] —>数组
对key计算出一个hash值,根据这个hash值对数组进行取模,也就是index,定位到数组里的元素中去
map.get(“张三“) —> hash值 —> 对数组长度进行取模 —> return array[1]
Array[1]= <李四,54岁>
1、hash值进行右移 16位,把2进制往右边推16位,把高16位推到低16位上来,前面用0来补齐,然后原来的hash值 与 右移出来的hash值 进行异或 异或出来的hash值包含了高16位与低16位hash值得特征。使高低16位都参与了运算
异或出来的 hash值 就是一个32位的 int值
异或 两个一样 是0; 两个不一样 是1
如 1 0
1 1
0 1
数组—> hash值对数组长度取模,定位到数组的一个位置
2、优化地方,寻址算法优化
(n-1)& hash —> 数组里的一个位置
取模运算,他是性能比较差,为了优化这个数组寻址的过程
(n-1)& hash —>效果要跟hash对n取模,效果是一样的,但是与运算的性能要比hash对n取模要高很多
总结jdk1.8中对hash算法和寻址算法是如何优化的?
1、hash算法的优化:对每个hash值,在他的低16位中,让高低16位进行异或,让他的低16位同时保持了高低16位的特征,尽量避免一些hash值后续出现冲突,大家可能会进入数组的同一个位置。
2、寻址算法的优化:用与运算替代取模,提升性能。
map.put 和 map.get —> hash算法优化(避免hash冲突),寻址性能优化
算出key 的hash值,到数组中寻址,找到一个位置,把key-value对放进数组,或从数组里取出来
两个key 多个key ,他们算出来的hash值,与n-1 ,与运算后,发现定位出来的数组的位置还是一样的,hash碰撞,hash冲突
会在这位置挂一个链表,这个链表里放入多个元素,让多个key-value 对,同时放在数组的一个位置离
get,如果定位到这个数组里发现这个位置挂了一个链表,此时遍历链表,找到你要的key-value对就可以了
假设这个链表很长,可能会导致遍历链表,性能会比较差 O(n)
优化,如果链表的长度达到了一定的长度之后,其实会把链表转换为红黑树,遍历一颗红黑树找到一个元素,此时O(logn),性能会比链表高一些
‘陆’ 数学建模中,给出非常多的节点,求这些节点的最短路径(类似一条线的路径),应该用什么算法好
下面是我自己编写的一段代码,用来求过包含两千多个点的最短路,速度很快,比遗传、蚁群快而且最短路更短。你可以试试看,有问题再问我。
function [S,len]=short(P)
% 此程序用来求相同类型点间的最短路
% P表示某一类型的点的坐标矩阵
% p是最短路径
% d是路径权值和
%建立权值矩阵
n=length(P);%求该类型点的数量
W=zeros(n,n);
for i=1:n %计算权值并填充权值矩阵,由于各点联通,此权值矩阵就是该图的最短路矩阵
for j=(i+1):n
W(i,j)=sqrt((P(i,1)-P(j,1))^2+(P(i,2)-P(j,2))^2);
end
end
for i=2:n
for j=1:(i-1)
W(i,j)=W(j,i);
end
end
%求通过所有点的最短路
%先求从i点至j点,必须通过指定其他n-2个点的最短路,选出其中的的最短路
S=zeros(1,n);
S(1)=1; %先插入1,2点,以此为基准,每次插进一个新点
S(2)=2;
d1=2*W(1,2);
for i=3:n %新加入的点的标号
d1i=zeros(1,i); %插入第i个点,有i中可能的距离,其中最小值将为该轮的d1
for j=1:i %新加入点的位置,插入第i个点是有i个空位可供选择
if j==1 %在第一个空位插入
d1i(j)=d1+W(i,S(1))+W(i,S(i-1))-W(S(1),S(i-1)); %插入点在首端时,距离为原距离与第i点与上一次插入后的第1位置的点之间距离之和
end
if j>1 & j<i %在中间的空位插入
d1i(j)=d1+W(S(j-1),i)+W(i,S(j))-W(S(j-1),S(j));
end
if j==i
d1i(j)=d1+W(S(i-1),i)+W(S(1),i)-W(S(1),S(i-1));
end
end
[d1,I]=min(d1i);
S((I+1):i)=S(I:(i-1)); %将第I位后面的点后移一位
S(I)=i;%将第i点插入在I位置
end
len=d1;
下面这段代码是我用来把上面的结果保存到txt文件中的代码,如果你需要,可以用用。代码是我上次用过的没有改,你自己按照需要自己改吧。
clear
close all
clc
loaddata
X=[C;E;I;J];
[S,len]=short(X);
DrawPath(S,X);
print(1,'-dpng','cmeiju3.png');
% 将结果保存至txt文件
fid=fopen('cmeijulujin.txt','wt'); %创建alunjin.txt文件
fprintf(fid,'c号刀具\n');
fprintf(fid,'%d %d\n',X(S));
save('cmeijus','S');
save('cmeijulen','len');