大体思路明白一动手就不行了先贴代码 等明白了在我那分析吧
现在又有点乱了,因为A*不止一种思路,慢慢来吧
--------------------------------------------
思路明白了,Demo图如下,暂未添加最优解选择策略。
@ 由于运算量小,时间经常近似为0,所以加大棋盘为40*40;
@ 当时刷新的时候用的是repaint(),方法,但是画面有明显的闪烁,打算用J2ME里常用的双缓冲实现,
昨晚看了书想到了 repaint(ab,c,d)这个方法,试了试效果不错,无闪烁。
@ 关于线程的挂起、停止、继续,还未添加,或者说添加了为调试通过。待扩展。
=>相关源码 及演示程序下载<=
下是A*主要算法和实现步骤:
一 主要公式:f(n)=g(n)+h(n)
f(n) 是节点n从初始点到目标点的估价函数
g(n) 是在状态空间中从初始节点到n节点的实际代价
h(n) 是从n到目标节点最佳路径的估计代价。
二 主要步骤
创建两个表,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的大小,从最小路径的节点向下进行。
代码如下: