这周网络实验看着孩子们那么苦逼,我真是不忍心,不过还是有比较牛的孩子,老人家落后了啊。因为前几天比较忙,一直再搞论文的实验,所以也没亲自动手做一下,今天刚好有兴致,简单做一下吧,DV算法的简单模拟,没有动态加节点,还有一些问题没有考虑,代码略乱,仅供参考。
/*========================================================================
# FileName: DV.cpp
# Author: daweibalong
# Email: daweibalong@gmail.com
# HomePage:
# LastChange: 2012-11-25 18:50:27
# 编译环境:GCC
========================================================================*/
#include <iostream>
using namespace std;
#define Item_Max 20
#define Router_Max 20
//定义弧
struct ArcNode
{
int adjex;//相邻节点标号
int weight;
struct ArcNode *nextArc;
};
//定义路由表
typedef struct Router
{
int destination;
int cost;
int next_hop;
}RouterItem, RouterTable[Item_Max];
//定义路由节点
struct RouterNode
{
int num;//节点标号
int reachable_num;//可达节点的数目
ArcNode *first;
RouterTable rtable;
};
RouterNode rlist[Router_Max];//路由节点列表
RouterNode rlist_temp[Router_Max];//缓存状态,模拟并发
int router_num;//路由节点数量
//*****函数列表**********
void initRouters();//初始化路由节点及其路由表
int reachable(int, int);//考察第一个节点是否可达第二个节点, 与当前路由表状态有关
bool exchange(int);//制定标号的路由节点获取相邻路由的路由表信息,并根据情况进行路由表的修改
void DV();//循环执行所有路由的信息交换,直至收敛
void printRouterTable(int);//打印路由表
//***********************
//初始化路由节点及路由表
void initRouters()
{
cout << "Please input the number of the routers:";
cin >> router_num;
int i, j;
for (i =0; i < router_num; ++i)
{
rlist[i].num = i;
rlist[i].reachable_num = 0;
rlist[i].first = NULL;
}
int neighbors_num;
cout << "now, tell each node of their neighbors and distance between them:" << endl;
for (i = 0; i < router_num; ++i)
{
cout << "Router(" << i << "):" << endl;
cout << "--the number of neighbors:";
cin >> neighbors_num;
cout << "----neighbor lable and distance:" << endl;
for (j = 0; j < neighbors_num; ++j)
{
ArcNode *arc = new ArcNode;
cout << "------neighbor" << j << ":" << endl;
cout << "--------label:";
cin >> arc->adjex;
cout << "--------weight:";
cin >> arc->weight;
arc->nextArc = rlist[i].first;
rlist[i].first = arc;
rlist[i].rtable[j].destination = arc->adjex;
rlist[i].rtable[j].cost = arc->weight;
rlist[i].rtable[j].next_hop = arc->adjex;
}
rlist[i].reachable_num = neighbors_num;
}
}
//判断node1号路由在目前路由表的情况下是否可达node2号路由
//不可达返回-1
//可达返回cost
int reachable(int node1, int node2)
{
for (int i = 0 ; i < rlist[node1].reachable_num; ++i)
{
if (rlist[node1].rtable[i].destination == node2)
return rlist[node1].rtable[i].cost;
}
return -1;
}
//第num个路由获取邻居节点的路由表并进行更新
bool exchange(int num)
{
ArcNode *arc = rlist[num].first;
bool change = false;
while (arc != NULL)
{
int i;
//get neighbor rtable
for (i = 0; i < rlist[arc->adjex].reachable_num; ++i)
{
//遇见不可达节点,加入路由表
if (num != rlist[arc->adjex].rtable[i].destination && reachable(num, rlist[arc->adjex].rtable[i].destination) == -1)
{
RouterItem item;
item.destination = rlist[arc->adjex].rtable[i].destination;
item.cost =rlist[arc->adjex].rtable[i].cost + arc->weight;
item.next_hop = arc->adjex;
rlist_temp[num].rtable[rlist[num].reachable_num] = item;
rlist_temp[num].reachable_num ++;
change = true;
}
else if (num != rlist[arc->adjex].rtable[i].destination)//遇见可达节点 比较距离 看是否更新路由表
{
if (rlist[num].rtable[i].cost >rlist[arc->adjex].rtable[i].cost + arc->weight)
{
rlist_temp[num].rtable[i].cost =rlist[arc->adjex].rtable[i].cost + arc->weight;
rlist_temp[num].rtable[i].next_hop = arc->adjex;
change = true;
}
}
}
arc = arc->nextArc;
}
return change;
}
//打印单个路由的路由表
void printRouterTable (int num)
{
cout << endl;
cout << "--------Router:" << num << "---------" << endl;
cout << "reachable_num:" << rlist[num].reachable_num << endl;
cout << "des | next | cost" << endl;
for (int i = 0; i < rlist[num].reachable_num; ++i)
{
cout << rlist[num].rtable[i].destination << " | " << rlist[num].rtable[i].next_hop << " | " << rlist[num].rtable[i].cost << endl;
}
}
//DV算法,循环更新,直到收敛
void DV()
{
int i, j = 0;
while (true)
{
bool change = false;
for (i = 0; i < router_num; ++i)
{
rlist_temp[i] = rlist[i];
}
for (i = 0; i < router_num; ++i)
{
change |= exchange(i);
}
if (change == false)
{
cout << "+++++++Converged!++++++++" << endl;
break;
}
for (i = 0; i < router_num; ++i)
{
rlist[i] = rlist_temp[i];
}
cout << endl << "++++++Round " << ++j << "++++++++" << endl;
for (i = 0; i < router_num; i++)
printRouterTable(i);
}
}
int main()
{
initRouters();
DV();
return 0;
}
分享到:
相关推荐
该软件实现了路由选择中的DV算法。带有图形界面的DV算法模拟器
来自university of Massachusetts的网络作业 框架是node0.c DVsim.h DVsim.c,其中有两个函数需要自己补充,根据自己具体的拓扑图要修改一些数据结构。
用java语言编写的dv路由描述,通过Socket进行路由表传输,由文件设定主机位置与传输内容
简单的一个dv路由交换算法,供学习参考
DV算法对坏消息传的慢 计算机网络安全基础
DV Hop算法,可以生成随机矩阵和误差分析。
DV-hop定位算法matlab实现程序供大家共同学习参考
易语言百度DV算法开源源码 解压密码:www.sanye.cx
基于DV算法的路由器模拟设计与实现实验报告.doc
提出了一种改进的DV-Hop 定位算法, 通过对DV-Hop算法的局部优化, 减小了定位计算量, 并使得改进的DV-Hop算法对不规则形状的节点分布网络具有较强的适应性, 克服了原算法只适用于各向同性网络的不足。仿真结果...
原始DVHOP算法源程序,有详细的注释,算法简洁,运行速度快。
简单的讲解了Dv和Ls算法的区别,是以论文形式进行文档书写的
matlab代码: 基于麻雀搜索算法改进的DV-HOP算法 内容概要:利用麻雀算法寻找未知节点到信标节点的实际距离与估计距离之间的最小误差,从而达到对未知节点位置的估计。 适合人群:对无线传感器网络(WSN)定位相关...
DV路由选择算法实现样例using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows....
关于计算机网络中的算法,路由协议RIP中的dv算法c语言实现,静态路由选择
无线传感器网络定位DV_HOP算法的实现(MATLAB)
基于DV-Hop的无线传感网络定位算法的matlab仿真代码。研究定位误差与锚节点密度的关系。设定在100*100的区域内,总节点数为200,分别计算出通信半径为15,锚节点个数为5,8,10,12,15,20时,定位误差变化情况。...
无线传感器网络中dv-hop定位算法的Matlab程序
改进的DV-Hop定位算法matlab仿真程序代码