当前位置: 首页 > news >正文

golang实现关键路径算法

关键路径算法(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是项目排期结构体,由项目的活动序列组成。关键路径算法可以帮助项目管理者合理安排项目计划和资源分配,以确保项目按计划完成,并能及时发现和解决可能导致项目延误的问题。它被广泛应用于建筑、制造、软件开发等众多行业中。

相关文章:

golang实现关键路径算法

关键路径算法&#xff08;Critical Path Method&#xff0c;简称CPM&#xff09;是一种用于项目管理的技术&#xff0c;主要用于计算项目中的关键路径和关键活动。关键路径是指项目中的最长路径&#xff0c;决定了项目的最短完成时间。关键活动是指在关键路径上的活动&#xff…...

Overcoming catastrophic forgetting in neural networks

目录 预备知识&#xff1a; 论文笔记 1. Introduction 2. Elastic weight consolidation 2.1 EWC allows continual learning in a supervised learning context 2.2 EWC allows continual learning in a reinforcement learning context 3. Conclusion 文章链接&#x…...

[Linux] Linux文件系统

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 文章目录 一、Linux文件系统1.1 磁盘1.2 inode1.3 软硬…...

有仰拍相机和俯拍相机时,俯拍相机中心和吸嘴中心的标定

俯拍相机中心和吸嘴中心的标定 文章目录 俯拍相机中心和吸嘴中心的标定 前言适用模型如下&#xff1a;一、使用一个标定片进行标定1.关键注意&#xff1a;2.标定步骤&#xff1a; 二、使用一个L型的工件1.关键注意&#xff1a;2.标定步骤&#xff1a; 总结 前言 在自动化设备领…...

【Vue学习笔记5】Vue3中的响应式:ref和reactive、watchEffect和watch

所谓响应式就是界面和数据同步&#xff0c;能实现实时更新。 Vue 中用过三种响应式解决方案&#xff0c;分别是 defineProperty、Proxy 和 value setter。Vue 2 使用的方案是 defineProperty API。Vue3中使用的方案是Proxy和value setter。 1. ref和reactive vue3中实现响应…...

自动化测试工具的基本原理以及应用场景

自动化测试工具是现代软件开发流程中必不可少的组成部分&#xff0c;它可以通过编写脚本或使用图形用户界面工具自动化测试过程&#xff0c;提高测试的效率和准确性。本文将介绍自动化测试工具的基本原理以及应用场景。 自动化测试工具的基本原理 自动化测试工具通常采用的原理…...

《Java虚拟机学习》 java代码的运行过程

1. Java文件转换 当我们保存java文件后&#xff0c;首先由编译器编译成class文件&#xff0c;然后通过Java虚拟机将class文件转换成字节码文件 2.Java虚拟机是怎么运行Java文件 首先将java文件加载到java虚拟机中&#xff0c;然后由虚拟机将类元信息存储在 虚拟机的方法区中。…...

关于Intel处理器架构中AVX2里Gather特性的说明

在 Intel Haswell 架构里引入了 Gather 特性。它使得CPU可以使用向量索引存储器编址从存储器取非连续的数据元素。这些gather指令引入了一种新的存储器寻址形式&#xff0c;该形式由一个 基地址寄存器&#xff08;仍然是通用目的寄存器&#xff09;和通过一个 向量寄存器&#…...

UNIX常用命令(C站最全,一文通关)

unix常见命令列举如下&#xff0c;除了看还要会用&#xff1a; ls - 列出目录下的文件 cd - 切换目录 pwd - 显示当前目录 mkdir - 创建目录 rm - 删除文件或目录 rmdir - 删除空目录 cp - 复制文件或目录 mv - 移动文件或目录,或重命名 cat - 显示文件内容 less - 分…...

Vue监听属性详细讲解

文章目录 定义要监听的属性定义 watch修改监听的属性值监听数组变化监听对象变化监听计算属性变化监听事件变化监听路由变化 在 Vue 中&#xff0c;可以使用 watch/$watch 方法监听数据、计算属性、事件和路由的变化&#xff0c;从而实现数据绑定、事件监听和路由控制等功能。需…...

网申形式一览:这三种投递方式,你了解吗?

银行校招是个滚动的过程&#xff0c;每家银行的网申期并不一致。想要在看重的银行网申期投出一份漂亮的简历&#xff0c;简历自身要“过硬”。是不是还有同学不清楚网申简历形式&#xff1f; 从如信银行考试中心了解到&#xff0c;银行网申&#xff0c;尤其是大行网申&#xff…...

vue项目将多张图片生成一个gif动图

当前做项目有一个需求是将多张图片生成一个gif动图的形式 类似下面图片几张图片叠加生成一个gif动图 图片涉及工作隐私&#xff0c;就不公开啦 我们要引入一个gif.js的引入包&#xff0c;但是他没有直接引入的方式&#xff0c;只能从官方下载文件包&#xff0c;下载地址&#…...

开心档之Go 语言常量

Go 语言常量 常量是一个简单值的标识符&#xff0c;在程序运行时&#xff0c;不会被修改的量。 常量中的数据类型只可以是布尔型、数字型&#xff08;整数型、浮点型和复数&#xff09;和字符串型。 常量的定义格式&#xff1a; const identifier [type] value你可以省略类…...

动态库和静态库的使用

一、什么是库&#xff1f; 库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码&#xff0c;相当于进行了加密&#xff0c;别人可以使用库&#xff0c;但是看不到库中的内容。 常见的库类型 共享库 静态库 动态库…...

前端:20 个常见的前端算法题

现在面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂基本必考 今天给大家带来 20 个常见的前端算法题&#xff0c;重要的地方已添加注释&#xff0c;如有不正确的地方&#xff0c;欢迎多多指正 &#x1f495; 1、两数之和 题目&#xff1a; 给定一个数组 nums …...

【Linux】多线程 --- 线程概念 控制 封装

从前种种&#xff0c;譬如昨日死。从后种种&#xff0c;往如今日生。 文章目录 一、线程概念1.重新理解用户级页表1.1 进程资源如何进行分配呢&#xff1f;&#xff08;地址空间页表&#xff09;1.2 虚拟地址如何转换到物理地址&#xff1f;&#xff08;页目录页表项&#xff0…...

最长递增子序列的长度 _ 贪心+二分查找 _ 20230510

最长递增子序列的长度 _ 贪心二分查找 _ 20230510 前言 最长递增子序列的程序一般采用动态规划方式&#xff0c;使用bottom-up的数组记忆方式比较容易理解&#xff0c;当然也可以采用top-down的递归模式。本文主要讨论如何利用贪心策略&#xff0c;同时辅助以二分查找的方式实…...

VMware ESXi 7.0 U3m Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-05-03&#xff0c;发布 ESXi 7.0U…...

Scrum敏捷开发和项目管理流程及工具

Scrum是全球运用最广泛的敏捷管理框架&#xff0c;Leangoo基于Scrum框架提供了一系列的流程和模板&#xff0c;可以帮助敏捷团队快速启动Scrum敏捷开发。 这里可以介绍一下在scrum中单团队敏捷开发如何管理&#xff0c;单团队敏捷开发主要是针对10-15人以下&#xff0c;只有一…...

微服务之配置中心

文章目录 1什么是配置2什么是配置中心3为什么我们要用配置中心4特点 1什么是配置 就是springboot中的application.yml/properties文件 比如&#xff1a;项目名、端口号、数据库连接参数、启动参数等。 2什么是配置中心 配置中心就是用来管理项目当中所有配置的系统&#xff…...

windows下安装OpenCL

由于我的电脑是windows10&#xff0c;显卡是集显Intel UHD Graphics 630。 下载Intel的SDK for OpenCL&#xff0c;下载地址https://software.intel.com/en-us/opencl-sdk/choose-download&#xff0c;也可以在我的资源里面直接下载https://download.csdn.net/download/qq_363…...

前端项目的通用优化策略

一、虚拟滚动 当我们开发的时候&#xff0c;遇到大数据加载&#xff0c;页面卡顿的问题应该如何处理&#xff1f;大多数情况下&#xff0c;我们都是尽量通过分页的方式处理这类问题&#xff0c;但是总有一些特殊的情况我们必须把数据全部加载到前端进行处理。我曾经遇到过一个…...

关于 IO、存储、硬盘和文件系统

关于IO、存储、硬盘和文件系统 0.引入1.了解IO1.1.存储器IO1.2.设备IO 2.存储介质和存储类型2.1.内存2.2.硬盘2.3.固态硬盘&#xff08;SSD&#xff09;2.4.U盘 3.硬盘的工作原理3.1.磁头3.2.盘片3.3.电动机3.4.硬盘的读写操作 4.文件系统概述4.1.文件系统的类型4.2.文件系统的…...

计算机网络期中复习提纲-酷酷的聪整理版

第一章 概述 1.请介绍计算机网络在逻辑上的组成及其各自的作用。 计算机网络在逻辑上可以分为终端子网和通信子网两部分。 终端子网是指连接计算机与网络的部分,主要负责将数据从计算机发送到通信子网,或将从通信子网接收到的数据传输到计算机。终端子网通常包括物理层和数据…...

clickhouse的嵌套数据结构Tuple、Array与Nested类型介绍和使用示例

文章目录 Tuple类型Array类型Nested类型使用示例单独使用Tuple数组嵌套 Array(Tuple)Nested类型 生产使用&#xff1a;分组查询 Tuple类型 Tuple是ClickHouse数据库中的一种数据类型&#xff0c;它允许在一个字段中存储由不同数据类型组成的元组(tuple)。元组可以包含任意数量…...

人脸修复增强调研

Real-ESRGAN 工程地址&#xff1a;https://github.com/xinntao/Real-ESRGAN 效果&#xff1a; 人脸增强部分&#xff0c;调用的GFPGAN. GFPGAN 工程地址&#xff1a;https://github.com/TencentARC/GFPGAN 论文效果&#xff1a; BasicSR-ESRGAN&#xff1a; 项目地址&a…...

【Java】继承和多态

文章目录 一、继承1.继承的例子&#xff08;is-a&#xff09;2.组合的例子&#xff08;has-a&#xff09; 二、多态1.重写2.重载 三、继承的语法四、继承的注意事项1.初始化的顺序&#xff1a;2.super关键字 五、继承访问限定符六、多态实现方式七、多态的理解注意事项&#xf…...

ThingsBoard集群部署之k8s

1、概述 今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来…...

【Gorm】如何在 GORM 中实现模型之间的关联?

文章目录 关联1、Belongs To&#xff08;属于&#xff09;2、Has One&#xff08;拥有一个&#xff09;3、Has Many&#xff08;拥有多个&#xff09;4、Many To Many&#xff08;多对多&#xff09; 关联 ​ 当涉及到 ORM&#xff08;Object-Relational Mapping&#xff09;的…...

Linux危险命令

rm -rf 命令 该命令可能导致不可恢复的系统崩坏。 rm -rf / #强制删除根目录下所有东西。rm -rf * #强制删除当前目录的所有文件。rm -rf . #强制删除当前文件夹及其子文件夹。fork 炸弹 :() { :|:& };:不太好理解可以转换成 bomb() {bomb|bomb& }; bomb一旦执行…...