您的位置:首页 > 理论基础 > 计算机网络

模拟简单距离向量算法的更新——计算机网络作业

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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: