golang实现关键路径算法

这篇具有很好参考价值的文章主要介绍了golang实现关键路径算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关键路径算法(Critical Path Method,简称CPM)是一种用于项目管理的技术,主要用于计算项目中的关键路径和关键活动。关键路径是指项目中的最长路径,决定了项目的最短完成时间。关键活动是指在关键路径上的活动,必须按时完成才能确保项目按计划完成。

关键路径算法通常包含如下步骤:一是确定项目的所有活动和它们之间的先后关系,建立活动网络图。需要注意的是活动网络图必须是有向无环图。二是计算每个活动的最早开始时间和最晚结束时间。三是根据活动的持续时间和先后关系,计算活动的总浮动时间和自由浮动时间。四是根据活动的最早开始时间和最迟开始时间,确定关键路径和关键活动,计算项目的总时间。

以下是用go语言实现的关键路径算法:

首先定义任务结构体:

type Task struct {
  id             string  // 任务ID
  duration       int     // 任务持续时间
  dependencies   []*Task // 前置任务列表
  successors     []*Task // 后继任务列表
  earliestStart  int     // 最早开始时间
  latestStart    int     // 最晚开始时间
}

其次是对当前任务序列进行拓扑排序,并检查是否是有向无环图。

func topologicalSort(tasks []*Task) ([]*Task,bool) {
  n := len(tasks)
  visited := make(map[*Task]int)  //记录每个任务的访问状态,0表示没有访问过,1表示已经访问过了,2表示访问完成
  order := make([]*Task,n) //排序结果
​
  index := n - 1
  cycle := false
  var dfs func(node *Task) //遍历函数
  dfs = func(node *Task) {
    visited[node] = 1
    for _, neighbor := range node.successors {
      if visited[neighbor] == 0 {
        dfs(neighbor)
      } else if visited[neighbor] == 1 {
        cycle = true
        return
      }
    }
    visited[node] = 2
    order[index] = node
    index--
  }
​
  for _,task := range tasks {
    if visited[task] == 0 {
      dfs(task)
      if cycle {
        return nil, false
      }
    }
  }
​
  return order, true
}

排序函数将一组活动列表作为参数传入,然后递归遍历所有活动结点,将排序结果作为第一个返回值返回,第二个返回值为布尔类型,true表示是有向无环图,false表示当前活动网络图有环。

然后计算每个活动的最早开始时间和最晚开始时间:

func (s *Schedule)calculateEarlyStart(task *Task) int {
  // -1为默认值,如果最早开始时间不为-1表示已经设置过最早开始时间了
  if task.earliestStart != -1 {
    return task.earliestStart
  }
  maxEarlyStart := 0
  //计算所有前置任务的最晚结束时间
  for _, predecessor := range task.dependencies {
    earlyStart := s.calculateEarlyStart(predecessor) + predecessor.duration
    if earlyStart > maxEarlyStart {
      maxEarlyStart = earlyStart
    }
  }
  //前置任务的的最晚结束时间即当前活动的最早开始时间
  task.earliestStart = maxEarlyStart
  return maxEarlyStart
}
​
func (s *Schedule)calculateLateStart(task *Task,projectDuration int) int {
  if task.latestStart != -1 {
    return task.latestStart
  }
  //如果当前活动没有后置任务,当前任务的最晚开始时间设置为项目结束时间减去当前任务的持续时间
  if len(task.successors) == 0 {
    task.latestStart = projectDuration - task.duration
    return task.latestStart
  }
  //计算后置任务的最早开始时间
  minLateStart := projectDuration
  for _,successor := range task.successors {
    lateStart := s.calculateLateStart(successor, projectDuration) - task.duration
    if lateStart < minLateStart {
      minLateStart = lateStart
    }
  }
  task.latestStart = minLateStart
  return minLateStart
}

计算完每个任务的最早开始时间和最晚开始减后,根据关键活动的定义找出关键路径。

func (s *Schedule)CriticalPath() ([]*Task,int) {
  criticalPath := make([]*Task,0)
  projectDuration := 0
  // 计算任务的最早开始时间,确定项目的最早结束时间
  for _,task := range s.tasks {
    task.earliestStart = -1
    task.latestStart = -1
    earlyStart := s.calculateEarlyStart(task)
    if earlyStart + task.duration > projectDuration {
      projectDuration = earlyStart + task.duration
    }
  }
  // 计算任务的最晚开始时间,如果任务的最早开始时间等于最晚开始时间则为关键活动
  for _,task := range s.tasks {
    s.calculateLateStart(task, projectDuration)
    if task.earliestStart == task.latestStart {
      criticalPath = append(criticalPath, task)
    }
  }
  return criticalPath,projectDuration
}

以上就是用golang实现的关键路径算法,Schedule是项目排期结构体,由项目的活动序列组成。关键路径算法可以帮助项目管理者合理安排项目计划和资源分配,以确保项目按计划完成,并能及时发现和解决可能导致项目延误的问题。它被广泛应用于建筑、制造、软件开发等众多行业中。文章来源地址https://www.toymoban.com/news/detail-437601.html

到了这里,关于golang实现关键路径算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【路径规划】全局路径规划算法——蚁群算法(含python实现)

    路径规划与轨迹跟踪系列算法 蚁群算法原理及其实现 蚁群算法详解(含例程) 图说蚁群算法(ACO)附源码 蚁群算法Python实现 蚁群算法(Ant Colony Algorithm, ACO) 于1991年首次提出,该算法模拟了自然界中蚂蚁的觅食行为。蚂蚁在寻找食物源时, 会在其经过的路径上释放一种信息

    2024年01月18日
    浏览(49)
  • 【路径规划】局部路径规划算法——人工势场法(含python实现 | c++实现)

    路径规划与轨迹跟踪系列算法 基于改进型人工势场法的车辆避障路径规划研究 基于改进人工势场法的车辆避障路径规划研究 1986 年 Khatib 首先提出人工势场法,并将其应用在机器人避障领域, 而现代汽车可以看作是一个高速行驶的机器人,所以该方法也可应用于汽车的避障

    2023年04月09日
    浏览(43)
  • 【路径规划】局部路径规划算法——贝塞尔曲线法(含python实现 | c++实现)

    路径规划与轨迹跟踪系列算法 曲线杂谈(二):Bezier曲线的特殊性质 贝塞尔曲线的特性总结 贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔( Pierre Bézier)发表,他运用贝塞尔曲线来为汽车的主体进行设计。 贝塞尔曲线是应用于二维图形应用程序的数学曲线,由一组称为

    2024年02月14日
    浏览(98)
  • 路径规划-DWA算法(C++实现)

    1、简单介绍 DWA算法(dynamic window approach),其原理主要是在速度空间(v,w)中采样多组速度,并模拟出这些速度在一定时间内的运动轨迹,并通过评价函数对这些轨迹进行评价(其中包括距离障碍物距离,距离目标点距离等等进行评价),选取最优轨迹对应的(v,w)驱动机器人

    2024年02月10日
    浏览(44)
  • Dijkstra算法——邻接矩阵实现+路径记录

    本文是在下面这篇文章的基础上做了一些补充,增加了路径记录的功能。具体Dijkstra的实现过程可以参考下面的这篇文章。 [jarvan:Dijkstra算法详解 通俗易懂](Dijkstra算法详解 通俗易懂 - jarvan的文章 - 知乎 https://zhuanlan.zhihu.com/p/338414118) 创建 GraphAdjMat 类 GraphAdjMat 类用来实现图的

    2024年01月18日
    浏览(41)
  • 辨析 关键路径、关键链、缩短工期方法

    关键路径法 关键路径是从起点到终点的最长路径 关键路径上活动的总浮动时间和自由浮动时间为0 关键链法 根据有限的资源对项目进度进行调整,结合了确定性和随机性办法 添加了持续时间缓冲(非计划工作活动),在关键路径法基础上考虑了资源因素 缩短工期的方法 赶

    2024年02月02日
    浏览(42)
  • golang文件相对路径问题

    目录结构 2.具体代码:

    2024年01月17日
    浏览(50)
  • 路径规划问题的遗传算法实现(python代码)

        遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。     路径

    2024年02月04日
    浏览(45)
  • Golang开发-new关键字

    在Go语言中,new用于创建一个新的零值对象,并返回指向该对象的指针。它是Go语言中用于分配内存的一种方式。 new的语法如下: 其中,Type表示要创建的对象的类型,ptr是指向新对象的指针。 以下是一个示例,演示如何使用new创建一个新的对象: 在上述

    2024年02月09日
    浏览(43)
  • 基于Dijkstra算法实现无人机三维路径规划

    基于Dijkstra算法实现无人机三维路径规划 无人机在飞行任务中往往需要寻找一条最优路径以达到最佳的飞行效果。而在三维空间中,路径规划问题变得更加复杂。本文将介绍如何基于Dijkstra算法来解决无人机三维路径规划问题,并且提供相应的matlab代码。 一、Dijkstra算法简介

    2024年02月14日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包