【数据结构】拓扑网络(AOE算法举例+源码)

简介: 【数据结构】拓扑网络(AOE算法举例+源码)

一、拓扑网络定义

拓扑网络是计算机网络中的一个重要概念,指的是连接在一起的网络设备之间的物理或逻辑结构。拓扑结构决定了网络中各个节点之间的连接方式,对网络的性能、可靠性和扩展性都有重要影响。

1. 什么是拓扑网络?

拓扑网络描述了计算机网络中设备之间的连接方式,包括它们之间的物理布局或逻辑结构。这种结构定义了网络中数据流动的路径,以及各个节点之间的关系。拓扑网络的选择直接影响了网络的性能、可靠性和维护难度。

2. 常见的拓扑结构

2.1 星型拓扑

星型拓扑所有设备都连接到一个中心节点(如交换机或集线器)。这种结构简单易于维护,但如果中心节点故障,整个网络可能受到影响。

2.2 总线拓扑

总线拓扑中,所有设备都连接到一根共享的传输介质,如一根电缆。数据通过总线传输,但当设备数量增加时,总线可能成为瓶颈。

2.3 环形拓扑

环形拓扑中,设备通过连接成一个环形。数据沿着环路传输,但如果某个设备出现故障,可能会导致整个网络中断。

2.4 网状拓扑

网状拓扑中,每个设备都连接到网络中的其他设备,形成多条路径。这种结构具有高度的冗余和可靠性,但是布线复杂,成本较高。

2.5 混合拓扑

混合拓扑是以上拓扑的组合形式,可以根据网络的需求和规模选择不同的结构。

二、拓扑网络的应用

拓扑网络广泛应用于各种领域,包括企业网络、数据中心、云计算等。在实际应用中,需要根据具体情况权衡各种因素,选择最合适的拓扑结构来构建网络。

三、AOE算法

AOE(Activity On Edge)算法是一种用于求解工程网络中最早开始时间和最晚开始时间的算法。工程网络是一种用图表示的项目计划,其中节点表示活动,有向边表示活动之间的依赖关系。AOE算法通常用于项目管理,帮助确定项目中各个活动的最早和最晚开始时间,以及关键路径。

以下是AOE算法的主要步骤:

  1. 绘制工程网络图: 根据项目计划,绘制工程网络图,其中节点表示活动,有向边表示活动之间的依赖关系。
  2. 确定活动持续时间: 为每个活动确定其持续时间,并将这些信息标记在相应的节点上。
  3. 确定事件的最早开始时间(ES): 从网络的起始节点开始,按照拓扑排序的顺序,计算每个事件(节点)的最早开始时间。对于每个活动,最早开始时间等于其所有前驱活动的最早完成时间的最大值。
  4. 确定活动的最早开始时间和最早完成时间(EF): 根据最早开始时间,计算每个活动的最早开始时间和最早完成时间。最早完成时间等于最早开始时间加上活动持续时间。
  5. 确定事件的最晚完成时间(LF): 从网络的终点节点开始,按照逆拓扑排序的顺序,计算每个事件的最晚完成时间。对于每个活动,最晚完成时间等于其所有后继活动的最晚开始时间的最小值。
  6. 确定活动的最晚开始时间和最晚完成时间(LS): 根据最晚完成时间,计算每个活动的最晚开始时间和最晚完成时间。最晚开始时间等于最晚完成时间减去活动持续时间。
  7. 计算活动的浮动时间: 活动的浮动时间是指活动可以推迟的时间,而不影响整个项目的完成时间。浮动时间等于最晚开始时间减去最早开始时间。
  8. 找到关键路径: 关键路径是指总浮动时间为零的路径,即对整个项目的完成时间有最大影响的路径。关键路径上的活动是项目的关键活动。

 

#include<iostream>
#include<string.h> 
using namespace std;
 
#define pointMax 100
 
struct VtNode                 //权值信息
{
  VtNode *nextVt;           //入度链表下一个结点
  int peace;                //入度下一顶点的值
 
  VtNode *nextVtt;          //出度链表下一个结点
  int peaceE;               //出度下一顶点的值
 
  int len;
};
struct PoNode                  //顶点信息
{
  char data;
  VtNode *firstPo;          //入度
  VtNode *Out;              //出度
};
 
struct ATgroup
{
  PoNode vertices[pointMax];     //每一个verticse代表一个顶点
  int point, vert;               //point顶点数,vert弧数
};
 
struct Node
{
  int data;
  Node *next;
};
 
struct SqStack          //栈
{
  Node *base;          //栈底
  Node *top;           //栈顶
  int data;
};
 
void Push(SqStack &S, int i)       //入栈
{
  Node *m = new Node;
  m->data = i;
  m->next = S.top;             //入栈过程
  S.top = m;
}
 
int Pop(SqStack &S)              //出栈
{
  int n = S.top->data;
  S.top = S.top->next;         //出栈过程
  return n;
}
 
 
int ATlocate(ATgroup A, char x)             //找到位置
{
  for (int i = 0; i < A.point; i++)       //依次遍历点的信息
  {
    if (A.vertices[i].data == x)        //找到x的位置
    {
      return i;
    }
  }
}
 
void show(ATgroup &A)                      //显示当前所有点入度出度的顶点
{
  //cout << endl;
  for (int i = 0; i < A.point; i++)
  {
    //cout << i;
    if (A.vertices[i].firstPo != NULL)          //入度位置
    {
    //  cout << "    " << A.vertices[i].firstPo->peace << "   ";
    }
    //else
    //  cout << "    -1" << "    ";
 
    if (A.vertices[i].Out != NULL)             //出度位置
    {
    //  cout << A.vertices[i].Out->peaceE << endl;
    }
    //else
    //  cout << "    -1" << endl;
  }
}
 
void CreatAT(ATgroup &A)
{
  cout << "输入邻接矩阵顶点数:";
  cin >> A.point;
  cout << "输入邻接矩阵边数:";
  cin >> A.vert;
  getchar();
  char q[100];
  cout << "输入顶点信息:";
  gets(q);
//  这里作了一个修改 
  for (int i = 0; i < A.point; i++)
  {
    A.vertices[i].data = q[i];               //输入顶点值
    A.vertices[i].firstPo = NULL;            //初始化头结点为空
    A.vertices[i].Out = NULL;
  }
  char v1, v2; int m, n; int len;
  for (int i = 0; i < A.vert; i++)            //输入各边,构造邻接表
  {
    cout << "输入第" << i << "条边的依附的两个顶点:";
    int Q;
    cin >> v1 >> v2 >> Q;
    m = ATlocate(A, v1);                  //确定位置
    n = ATlocate(A, v2);
    //第一个
    VtNode *p1 = new VtNode;
    VtNode *p2 = new VtNode;
    p1->peace = m;                             //入度
    p1->nextVt = A.vertices[n].firstPo;
    A.vertices[n].firstPo = p1;
 
    p2->peaceE = n;                            //出度
    p2->nextVtt = A.vertices[m].Out;
    p2->len = Q;
    A.vertices[m].Out = p2;
  }
  //show(A);
}
 
void FindIn(ATgroup *A, int *in)           //统计所有点的入度数并存入到in数组中
{
  int n = 0;
  for (int i = 0; i < A->point; i++)     //遍历每一个点
  {
    VtNode *p = new VtNode;
    p = A->vertices[i].firstPo;
    while (p != NULL)                  //将入度链表进行遍历
    {
      n++;
      p = p->nextVt;          //下一结点
    }
    in[i] = n;          //存入in数组
    n = 0;
  }
}
 
void SHOW(int *a, ATgroup *A)           //显示当前所有顶点入度数量还有几个
{
  for (int i = 0; i < A->point; i++)
  {
    //cout << a[i] << "  ";
  }
  //cout << endl;
}
 
int M[pointMax] = { 0 };
int topo[pointMax];           //拓扑遍历存入
 
void TPsort(ATgroup *A, SqStack &S)           //拓扑排序过程
{
  int Indegree[pointMax];
  FindIn(A, Indegree);             //将入度赋值给数组
 
  for (int i = 0; i < A->point; i++)
  {
    if (Indegree[i] == 0)         //将所有入度等于0的入栈
    {
      //cout << "Push=" << i << endl;
      Push(S, i);
    }
  }
 
  int m = 0;                //统计入度的顶点数
  int n, k;
 
  while (S.base != S.top)       //判断是否遍历完
  {
    //cout << endl;
    n = Pop(S);         //栈顶出栈
    //cout << "Pop=" << n << endl;
    topo[m] = n;        //存入topo
    m++;
    VtNode* p = new VtNode;
    p = A->vertices[n].Out;             //出度链表的结点
    while (p != NULL)            //遍历出度链表
    {
      k = p->peaceE;          //某结点的位置
      //cout << "出度下一结点k=" << k << endl;
      Indegree[k]--;          //将该结点顶点位置入度减一
      //SHOW(Indegree, A);       //显示当前所有点的入度
      if (Indegree[k] == 0)      //当等于0时,入栈
      {
        //cout << "Push=" << k << endl;
        Push(S, k);
      }
      p = p->nextVtt;     //下一个
    }
  }
}
 
 
 
int ve[pointMax];      //最早发生时间
int vl[pointMax];      //最晚发生时间
 
void CritPath(ATgroup *A)
{
  int n = A->point;          //n为顶点个数
  for (int i = 0; i < n; i++)        //将每个事件的最早事件为0
    ve[i] = 0;
 
  //---按拓扑次序求每个事件的最早发生时间---//
  int k, j;
  for (int i = 0; i < n; i++)
  {
    k = topo[i];                 //取的拓扑排序中的顶点序号
    cout <<"K=F"<< k << "  "<<endl;
    VtNode *p = A->vertices[k].Out;     //指向K的第一个邻接结点
    while (p != NULL)
    {
      j = p->peaceE;
      if (ve[j] < ve[k] + p->len)
      {
        ve[j] = ve[k] + p->len;
        cout << ve[j] << "  " << ve[k] << "   " << p->len << endl;
      }
      p = p->nextVtt;
    }
    cout << ve[j] << endl;
  }
  for (int i = 0; i < A->point; i++)
  {
    cout << ve[i] << "   ";
  }
  cout << endl;
  cout << endl;
 
  for (int i = 0; i < n; i++)       //初始化
  {
    vl[i] = ve[topo[n - 1]];
  }
  //---按逆拓扑排序求每个事件的最迟发生时间----//
  for (int i = n - 1; i >= 0; i--)
  {
    k = topo[i];                 //取的拓扑排序中的顶点序号
    VtNode *p = A->vertices[k].Out;     //指向K的第一个邻接结点
    //cout << k << endl;
    while (p != NULL)
    {
      j = p->peaceE;
      if (vl[k] > vl[j] - p->len)
      {
        vl[k] = vl[j] - p->len;
        //cout << vl[k] << "  " << vl[j] << "   " << p->len << endl;
      }
      p = p->nextVtt;
    }
    //cout << vl[j] << endl;
  }
 
  for (int i = 0; i < A->point; i++)
  {
    cout << vl[i] << "   ";
  }
  cout << endl;
  cout << endl;
 
  //----判断每一活动是否为关键活动-----//
  int e, l;
  for (int i = 0; i < n; i++)
  {
    VtNode *p = A->vertices[i].Out;
    while (p != NULL)
    {
      j = p->peaceE;
      e = ve[i];
      l = vl[j] - p->len;
      if (e == l)
      {
        cout << A->vertices[i].data << "   " << A->vertices[j].data << endl;
      }
      p = p->nextVtt;
    }
  }
}
 
int main()
{
  ATgroup *A = new ATgroup;
  SqStack *S = new SqStack;
  S->top = S->base;
  S->data = pointMax;
  CreatAT(*A);
  TPsort(A, *S);
  CritPath(A);
  system("pause");
}

 


相关文章
|
22天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
229 55
|
13天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
1天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
3天前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
24 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
15天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
50 20
|
7天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
9天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
7天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
19天前
|
JSON 算法 Java
Nettyの网络聊天室&扩展序列化算法
通过本文的介绍,我们详细讲解了如何使用Netty构建一个简单的网络聊天室,并扩展序列化算法以提高数据传输效率。Netty的高性能和灵活性使其成为实现各种网络应用的理想选择。希望本文能帮助您更好地理解和使用Netty进行网络编程。
36 12
|
19天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
61 3