模拟简单距离向量算法的更新——计算机网络作业
2016-06-12 19:21
555 查看
//2016.5.25 19:35 #include <algorithm> #include<iostream> #include<cstring> #include<stdio.h> using namespace std; struct rtpkt{ //no节点编号,a[i]为该节点的距离矢量 int no; int a[4]; }rtpkt0,rtpkt1,rtpkt2,rtpkt3; void rtinit0(); void rtinit1(); void rtinit2(); void rtinit3(); void rtupdate0(rtpkt rcvpkt); void rtupdate1(rtpkt rcvpkt); void rtupdate2(rtpkt rcvpkt); void rtupdate3(rtpkt rcvpkt); int main(){ rtinit0(); rtinit1(); rtinit2(); rtinit3(); rtupdate1(rtpkt0); //利用第一个节点的距离矢量更新其他三个节点的距离矢量 rtupdate2(rtpkt0); rtupdate3(rtpkt0); /* cout << rtpkt0.no << " " << rtpkt0.a[0] << rtpkt0.a[1] << rtpkt0.a[2] << rtpkt0.a[3] << endl; cout << rtpkt1.no << " " << rtpkt1.a[0] << rtpkt1.a[1] << rtpkt1.a[2] << rtpkt1.a[3] << endl; cout << rtpkt2.no << " " << rtpkt2.a[0] << rtpkt2.a[1] << rtpkt2.a[2] << rtpkt2.a[3] << endl; cout << rtpkt3.no << " " << rtpkt3.a[0] << rtpkt3.a[1] << rtpkt3.a[2] << rtpkt3.a[3] << endl; */ rtupdate0(rtpkt1); //利用第二个节点的距离矢量更新其他三个节点的距离矢量 rtupdate2(rtpkt1); rtupdate3(rtpkt1); /* cout << rtpkt0.no << " " << rtpkt0.a[0] << rtpkt0.a[1] << rtpkt0.a[2] << rtpkt0.a[3] << endl; cout << rtpkt1.no << " " << rtpkt1.a[0] << rtpkt1.a[1] << rtpkt1.a[2] << rtpkt1.a[3] << endl; cout << rtpkt2.no << " " << rtpkt2.a[0] << rtpkt2.a[1] << rtpkt2.a[2] << rtpkt2.a[3] << endl; cout << rtpkt3.no << " " << rtpkt3.a[0] << rtpkt3.a[1] << rtpkt3.a[2] << rtpkt3.a[3] << endl; */ rtupdate0(rtpkt2); //利用第三个节点的距离矢量更新其他三个节点的距离矢量 rtupdate1(rtpkt2); rtupdate3(rtpkt2); /* cout << rtpkt0.no << " " << rtpkt0.a[0] << rtpkt0.a[1] << rtpkt0.a[2] << rtpkt0.a[3] << endl; cout << rtpkt1.no << " " << rtpkt1.a[0] << rtpkt1.a[1] << rtpkt1.a[2] << rtpkt1.a[3] << endl; cout << rtpkt2.no << " " << rtpkt2.a[0] << rtpkt2.a[1] << rtpkt2.a[2] << rtpkt2.a[3] << endl; cout << rtpkt3.no << " " << rtpkt3.a[0] << rtpkt3.a[1] << rtpkt3.a[2] << rtpkt3.a[3] << endl; */ rtupdate0(rtpkt3); //利用第四个节点的距离矢量更新其他三个节点的距离矢量 rtupdate1(rtpkt3); rtupdate2(rtpkt3); //打印结果 cout << rtpkt0.no << " " << rtpkt0.a[0] << rtpkt0.a[1] << rtpkt0.a[2] << rtpkt0.a[3] << endl; cout << rtpkt1.no << " " << rtpkt1.a[0] << rtpkt1.a[1] << rtpkt1.a[2] << rtpkt1.a[3] << endl; cout << rtpkt2.no << " " << rtpkt2.a[0] << rtpkt2.a[1] << rtpkt2.a[2] << rtpkt2.a[3] << endl; cout << rtpkt3.no << " " << rtpkt3.a[0] << rtpkt3.a[1] << rtpkt3.a[2] << rtpkt3.a[3] << endl; return 0; } void rtinit0(){ //初始化第一个节点的距离矢量 rtpkt0.no = 0; rtpkt0.a[0] = 0; rtpkt0.a[1] = 1; rtpkt0.a[2] = 3; rtpkt0.a[3] = 7; } void rtinit1(){ //初始化第二个节点的距离矢量 rtpkt1.no = 1; rtpkt1.a[0] = 1; rtpkt1.a[1] = 0; rtpkt1.a[2] = 1; rtpkt1.a[3] = -1; } void rtinit2(){ //初始化第三个节点的距离矢量 rtpkt2.no = 2; rtpkt2.a[0] = 3; rtpkt2.a[1] = 1; rtpkt2.a[2] = 0; rtpkt2.a[3] = 2; } void rtinit3(){ //初始化第四个节点的距离矢量 rtpkt3.no = 3; rtpkt3.a[0] = 7; rtpkt3.a[1] = -1; rtpkt3.a[2] = 2; rtpkt3.a[3] = 0; } void rtupdate0(rtpkt rcvdpkt){ //rtupdate0为该节点,rcvdpkt为指定节点 if(rtpkt0.a[rcvdpkt.no] <= 0){ /*如果该节点到指定节点的距离为0(即相同的一点)或-1(不可达),则返回*/ return; } for(int i = 0; i < 4; i++){ if(rcvdpkt.a[i] < 0) { /*如果指定节点到目的节点不可达,则跳过一下步骤继续执行*/ continue; } else if(rtpkt0.a[i] < 0){ rtpkt0.a[i] = rcvdpkt.a[i] + rtpkt0.a[rcvdpkt.no]; /*如果该节点到目的节点不可达,则直接更新距离*/ } else { rtpkt0.a[i] = min(rtpkt0.a[i], rcvdpkt.a[i] + rtpkt0.a[rcvdpkt.no]); /*否则将距离更新为两者之间的较小值*/ } } } void rtupdate1(rtpkt rcvdpkt){ if(rtpkt1.a[rcvdpkt.no] <= 0){ return; } for(int i = 0; i < 4; i++){ if(rcvdpkt.a[i] < 0) { continue; } else if(rtpkt1.a[i] < 0){ rtpkt1.a[i] = rcvdpkt.a[i] + rtpkt1.a[rcvdpkt.no]; } else{ rtpkt1.a[i] = min(rtpkt1.a[i], rcvdpkt.a[i] + rtpkt1.a[rcvdpkt.no]); } } } void rtupdate2(rtpkt rcvdpkt){ if(rtpkt2.a[rcvdpkt.no] <= 0){ return; } for(int i = 0; i < 4; i++){ if(rcvdpkt.a[i] < 0) { continue; } else if(rtpkt2.a[i] < 0){ rtpkt2.a[i] = rcvdpkt.a[i] + rtpkt2.a[rcvdpkt.no]; } else{ rtpkt2.a[i] = min(rtpkt2.a[i], rcvdpkt.a[i] + rtpkt2.a[rcvdpkt.no]); } } } void rtupdate3(rtpkt rcvdpkt){ if(rtpkt3.a[rcvdpkt.no] <= 0){ return; } for(int i = 0; i < 4; i++){ if(rcvdpkt.a[i] < 0) { continue; } else if(rtpkt3.a[i] < 0){ rtpkt3.a[i] = rcvdpkt.a[i] + rtpkt3.a[rcvdpkt.no]; } else { rtpkt3.a[i] = min(rtpkt3.a[i], rcvdpkt.a[i] + rtpkt3.a[rcvdpkt.no]); } } }
相关文章推荐
- Android 视频播放器 VideoView 的使用,播放本地视频 和 网络 视频
- 常用网络结构
- Android加载网络图片
- JBWEB000065: HTTP Status 500 - Request processing failed; nested exception is javax.ejb.EJBException
- Linux抓包工具tcpdump详解
- 安卓发送Get、Post请求,解决参数乱码问题
- HttpWebRequest用法
- 配置内外网通信(虚拟机内网)
- memcached网络实现部分简介
- 理解LSTM网络
- Lab 8:网络LED矩阵显示器
- 深入理解 HTTP 协议 POST 与PUT 方法区别
- 机房4台服务器集群网络配置
- iOS应用架构谈 网络层设计方案
- Android下的两种http通信机制介绍
- 分布式系统和网络系统
- 网络的混杂模式
- HTTP请求头参数
- 深度卷积网络
- nginx使用SSL模块配置HTTPS支持