golang实现关键路径算法

news/2024/10/19 3:32:16/

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

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

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

首先定义任务结构体:

type Task struct {id             string  // 任务IDduration       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 - 1cycle := falsevar dfs func(node *Task) //遍历函数dfs = func(node *Task) {visited[node] = 1for _, neighbor := range node.successors {if visited[neighbor] == 0 {dfs(neighbor)} else if visited[neighbor] == 1 {cycle = truereturn}}visited[node] = 2order[index] = nodeindex--}
​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.durationif earlyStart > maxEarlyStart {maxEarlyStart = earlyStart}}//前置任务的的最晚结束时间即当前活动的最早开始时间task.earliestStart = maxEarlyStartreturn 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.durationreturn task.latestStart}//计算后置任务的最早开始时间minLateStart := projectDurationfor _,successor := range task.successors {lateStart := s.calculateLateStart(successor, projectDuration) - task.durationif lateStart < minLateStart {minLateStart = lateStart}}task.latestStart = minLateStartreturn minLateStart
}

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

func (s *Schedule)CriticalPath() ([]*Task,int) {criticalPath := make([]*Task,0)projectDuration := 0// 计算任务的最早开始时间,确定项目的最早结束时间for _,task := range s.tasks {task.earliestStart = -1task.latestStart = -1earlyStart := 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是项目排期结构体,由项目的活动序列组成。关键路径算法可以帮助项目管理者合理安排项目计划和资源分配,以确保项目按计划完成,并能及时发现和解决可能导致项目延误的问题。它被广泛应用于建筑、制造、软件开发等众多行业中。


http://www.ppmy.cn/news/63281.html

相关文章

SRVCC流程及异常场景介绍

SRVCC(Single Radio Voice Call Continuity)用于在LTE和3G网络之间,实现VoLTE电话无缝切换到3G网络。用户正在使用VoLTE电话进行通话,当他们移出了LTE网络覆盖范围,SRVCC技术会自动将电话切换到3G网络,从而保持通话不中断。 关键流程如下 UE(用户设备)向MME(移动管理…

SpringBoot【开发实用篇】---- 热部署

SpringBoot【开发实用篇】---- 热部署 1. 手动启动热部署2. 自动启动热部署3. 参与热部署监控的文件范围配置4. 关闭热部署 什么是热部署&#xff1f;简单说就是你程序改了&#xff0c;现在要重新启动服务器&#xff0c;嫌麻烦&#xff1f;不用重启&#xff0c;服务器会自己悄悄…

面试官问我有没有mysql优化经验,我该怎么回答好

当面试官问到你是否有MySQL优化经验时&#xff0c;你可以通过以下方式回答&#xff1a; 确认问题&#xff1a;确认面试官具体指的是哪些方面的优化经验&#xff0c;例如查询优化、索引优化、缓存优化等等。 解释经验&#xff1a;如果你有MySQL优化经验&#xff0c;那么你可以详…

(四)【平衡小车制作】陀螺仪MPU6050

一、硬件结构 1.什么是陀螺仪&#xff1f; 陀螺仪是用于测量或维护方位和角速度的设备。它是一个旋转的轮子或圆盘&#xff0c;其中旋转轴可以不受影响的设定在任何方向。当旋转发生时&#xff0c;根据角动量守恒定律&#xff0c;该轴的方向不受支架倾斜或旋转的影响。 2.MPU…

C++数据结构:手撕红黑树

目录 一. 红黑树的概念及结构 二. 红黑树节点的定义 三. 红黑树节点的插入 3.1 初步查找插入节点的位置并插入节点 3.2 红黑树结构的调整 3.3 红黑树节点插入完整版代码 四. 红黑树的结构检查 4.1 检查是否为搜索树 4.2 检查节点颜色是否满足要求 附录&#xff1a;红黑…

算法之路--冒泡排序算法

写在前面 很早就想系统梳理所接触的所有算法&#xff0c;但是只是存在于一个想法阶段&#xff0c;懒惰使人遗忘不是么。作为一个软件开发人员&#xff0c;绕不开算法与数据结构&#xff0c;既然绕不开&#xff0c;何不逐一分析学习透彻&#xff0c;与君共勉之。 冒泡排序算法&a…

力扣---LeetCode141/142. 环形链表 (I)和(II) (代码详解+流程图+数学逻辑拓展)

文章目录 前言141. 环形链表 I1.1 链接&#xff1a;1.2 思路&#xff1a;1.3 代码&#xff1a;快慢指针1.4 流程图&#xff1a; 142. 环形链表 II2.1 链接&#xff1a;2.2 思路&#xff1a;2.3 代码&#xff1a;2.4 流程图&#xff1a; 拓展问题及证明(面试常问)&#xff1a;3.…

vmware 详细安装教程

一.VM是什么&#xff1f; VMware Workstation是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比&#xff0c;VMWare 采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统&#xff0c;在系统切换时需…