OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2514|回复: 0

多跳传感器网络最短路径

[复制链接]

12

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2015-12-26
在线时间
115 小时
发表于 2016-11-17 21:20:20 | 显示全部楼层 |阅读模式
这个算法不知道有没有错

//路由表格式
//节点地址  路径
//        30                45        56        78        99
//        33                68        99
//        55                45        82        99

//30是本节点父级;
//99是30节点父级
//78是99节点父级
//56是78节点父级
//45是56节点父级;45是源节点

//如当前节点(32)发送数据到节点30和节点45

//发送数据到节点30
//32-->30路径最短 直接发送
//发送数据到节点45
//路径1
//32-->30-->99-->78-->56-->45路径最远 经过4跳
//路径2
//32-->55-->99-->82-->45路径近 经过3跳

u8 Pro_FindNodePath(u8 node)//查找节点最短路径
{
        PathTable path_table[MAX_NODE_NUM];
        u8 i,j,k,n,min,addr;

        Pro_MemSet((BYTE *)&path_table,0,sizeof(PathTable)*MAX_NODE_NUM);
        for(i=0; i<MAX_NODE_NUM; i++)//遍历节点列表
        {
                if(route_table[i].node_state==VALID)
                {
                        if(route_table[i].node_addr==node)
                        {
                                return route_table[i].node_addr;//32-->30路径最短 立即返回
                        }
                        else
                        {
                                for(j=0; j<MAX_PATH_NUM; j++)//遍历路径表
                                {
                                        if(route_table[i].path[j]==node)//在路径表找到地址
                                        {
                                                n=0;
                                                for(k=j; k<MAX_PATH_NUM; k++)//遍历路径表
                                                {
                                                        if(route_table[i].path[j])//有地址
                                                        {
                                                                n++;//(路径1)32-->45路径最远 索引=3 (路径2)32-->45 索引=2
                                                        }
                                                }
                                                for(k=0; k<MAX_NODE_NUM; k++)//遍历路径索引表
                                                {
                                                        if(!path_table[k].addr)//找到空位
                                                        {
                                                                path_table[k].idx=n;//保存路径索引 (路径1)32-->45路径最远 索引=3 (路径2)32-->45路径最远 索引=2
                                                                path_table[k].addr=route_table[i].node_addr;//保存节点地址
                                                                break;
                                                        }
                                                }
                                                break;       
                                        }
                                }
                        }
                }
        }
        for(i=0; i<MAX_NODE_NUM; i++)//遍历路径索引表
        {
                if(path_table[i].addr)//有节点地址
                {
                        min=path_table[i].idx;
                        addr=path_table[i].addr;
                        break;
                }
        }
        if(MAX_NODE_NUM==i)//没有节点地址
                return 0xFF;
       
        for(i=0; i<MAX_NODE_NUM; i++)//遍历路径索引表
        {
                if(path_table[i].addr)//有节点地址
                {
                        if(path_table[i].idx<min)//查找最小索引号
                        {
                                min=path_table[i].idx;
                                addr=path_table[i].addr;
                        }
                }
        }
        return addr;//返回节点地址(下一跳地址)55 //32-->55-->99-->82-->45路径近
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 08:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表