DV算法模拟,仅供参考

这周网络实验看着孩子们那么苦逼,我真是不忍心,不过还是有比较牛的孩子,老人家落后了啊。因为前几天比较忙,一直再搞论文的实验,所以也没亲自动手做一下,今天刚好有兴致,简单做一下吧,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;
}
 
### 如何用Matlab实现光伏电池主动追光系统的仿真模拟 #### 构建光伏电池模型 为了构建光伏电池的模型,首先需要定义其电气特性。这可以通过查阅制造商的数据手册来获取标准测试条件下的参数。通常这些参数包括开路电压\(V_{oc}\),短路电流\(I_{sc}\),填充因子(FF)等。 在MATLAB/Simulink环境中创建光伏电池模块时,可以利用内置函数`pvarray()`或者自定义S-Function来描述光伏组件的行为[^1]。对于更复杂的场景,则可能涉及到温度和光照强度的影响因素,此时应考虑引入相应的修正系数以提高模型精度。 ```matlab % 定义光伏电池基本参数 Voc = 37; % 开路电压 (Volts) Isc = 8.12; % 短路电流 (Amps) FF = 0.75; % 填充因子 Tcell = 25 + 273.15; % 细胞温度(Kelvin) % 计算最大功率点(MPP) Vmpp = Voc * FF; Impp = Isc * FF; disp(['Maximum Power Point Voltage: ', num2str(Vmpp), ' Volts']); disp(['Maximum Power Point Current :', num2str(Impp), ' Amps']); ``` #### 设计追踪算法 针对主动追光系统而言,核心在于开发有效的太阳位置预测与跟踪策略。常见的方法有固定角度倾斜安装、双轴跟踪等方式;而在软件层面则可通过编写特定逻辑判断当前时刻最佳朝向并调整面板姿态完成优化采光目的。这里推荐采用扰动观察法(Perturb and Observe, P&O)作为基础思路之一: 当检测到输出功率增加时继续沿同一方向改变输入变量直到不再增长为止;反之亦然——即每当测量结果显示下降趋势就立即反转搜索路径尝试寻找新的峰值区域。此过程中需注意避免因外界干扰造成误判而陷入局部极值陷阱内循环往复无法收敛至全局最优解处。 ```matlab function dV = perturb_and_observe(dV_prev,V,I,P_last) global delta_V if isnan(P_last)||isempty(P_last) P_last=0; end P_current = I*V; if P_current>P_last sign_change=false; dV=dV_prev+delta_V; elseif P_current<P_last && abs(dV)>delta_V sign_change=true; dV=-dV/2; else sign_change=false; dV=dV-delta_V; end end ``` #### 实施环境影响评估 考虑到实际应用场合中不可避免会遇到诸如天气变化等因素带来的不确定性挑战,因此有必要加入动态响应机制以便及时适应新情况作出合理决策。比如通过监测实时气象数据流更新内部工作模式切换阈值范围从而确保全天候稳定运行效率最大化。此外还可以借助于历史记录积累经验教训进一步完善控制流程减少不必要的能量损耗提升整体效益水平。 根据文献报道,在光照突变情况下不同类型的MPPT算法表现出各异的特点:传统P&O容易产生较大超调量且恢复时间较长约需0.15秒;相比之下基于模糊逻辑控制器能够显著缩短调节周期仅耗费大约千分之二秒左右同时具备良好抗噪能力维持较小波动幅度利于长期可靠作业[^3]。 #### 集成与验证 最终将上述各部分有机结合形成完整的闭环控制系统架构,并导入Simulink平台开展全面的功能性和性能指标评测活动。期间务必仔细校准各项设定参数力求贴近现实状况获得最接近理论预期的理想成果展示给用户参考借鉴价值较高的解决方案实例供后续深入探讨交流学习使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值