总浮动时间(TF) 自由浮动时间(FF) 区别

此篇参考了http://blog.sina.com.cn/s/blog_ae72ef760101bxhz.html
用了里面的两张图

首先贴上咱们举例用的项目进度网络图:
这里写图片描述

其中每个小方块里面的若干数字是啥意思呢:
这里写图片描述

TF = Total Flow = 总浮动时间
FF = Free Flow = 自由浮动时间
每个小方块是一个活动,TF和FF都是针对一个活动来说的

自由浮动时间

在不延误其紧后进度活动最早开始日期的前提下,某进度活动可以推迟的时间量。

这里解释一下上面这个官方定义中的"推迟"这两个字,我一开始搞不清楚这个推迟到底是最早开始时间推迟的量还是最晚开始时间推迟的量,其实想想,咱们理想中的进度计划肯定都是按活动的最早开始时间和最早结束时间来算的,所以如果说一个活动推迟完成了,那肯定是跟最早活动开始时间相比推迟了。

比如活动F,它最早会在15周结束,而它的紧后活动H呢,由于H的开始不仅依赖于F,还依赖于其他活动的完成,所以H最早也要从17周开始,也就是说F活动只要在17周之前完成就不会影响到H活动的进行,假如F活动按照乐观的估计15周就完成了,那么空闲的第16周就是F活动的自由浮动时间了,所以F的自由浮动时间是一周。

现在再回头看官方的解释,是不是明白多了,记住自由浮动时间用两个"最早"来计算,紧后活动的最早开始时间减去紧前活动的最早结束时间。

紧前活动的实际浮动时间在自由浮动时间范围之内的话就不会对紧后活动或者项目有任何的影响。

那再提个问题了,那如果F活动实际进行的时候浮动了2周,超过了1周怎么办啊,你会发现即使F从最早开始时间往后浮动了两周,原本在15周应该结束,现在在17周结束了,它也只会导致H活动从18周开始,在第22周结束,也还没有到最终活动I的最早开始日期,所以不会影响到项目总工期。

那如果F的实际浮动时间继续变大,总会到影响总工期的时候吧,那到底浮动多少就会影响总工期了呢?

该说说总浮动时间了。

总浮动时间

在不延误项目完成日期或违反进度制约因素的前提下,某进度活动可以推迟的总时间量。

每个活动在图上都有最晚开始时间,都说了是最最最最晚开始时间了,意思就是再晚要出大问题了,所以总浮动时间就是一个活动的最晚开始时间减去最早开始时间了,用最晚结束时间减去最早结束时间也是一样的哈。超过这个时间,项目肯定是要延迟了(按照原计划哈,这里不考虑赶工和快速跟进哈)。

总结

自由浮动时间 = 后面活动的最早开始时间 - 此活动的最早结束时间
总浮动时间 = 自己的最晚开始时间 - 自己的最早开始时间

如果一个活动延迟的时间(为什么不考虑活动提前完成,这种好局面不用考虑哈)
<= 自由浮动时间:没有任何影响,不影响紧后活动按照咱们最优计划开始,也肯定不会影响总工期

> 自由浮动时间 并且 <= 总浮动时间:紧后活动被延迟了,不过还好,不会影响到总工期

> 总浮动时间:歇火,工期不保

再回到最上面的进度网络图,红色线表示是关键路径,一般情况下,关键路径的每个活动是没有总浮动时间和自由浮动时间的(特殊情况这里不展开讨论了),因为是最关键的一条路径,所以任意一个活动的任何延迟,都被认为是会影响工期的。

下面是使用红外循迹传感器和PID控制算法控制差速转向小车的示例代码,使用Arduino IDE编写: ``` //定义红外循迹传感器的引脚号 #define LEFT_SENSOR A0 #define RIGHT_SENSOR A1 //定义电机控制引脚号 #define LEFT_MOTOR_PIN 5 #define RIGHT_MOTOR_PIN 6 //定义PID控制算法的参数 #define KP 1.2 #define KI 5 #define KD 0.1 //定义PID控制器 class PIDController { private: double _kp, _ki, _kd; double _targetValue; double _error, _lastError, _sumError; unsigned long _lastTime; public: PIDController(double kp, double ki, double kd) { _kp = kp; _ki = ki; _kd = kd; _targetValue = 0; _error = 0; _lastError = 0; _sumError = 0; _lastTime = millis(); } void setTargetValue(double targetValue) { _targetValue = targetValue; } double compute(double inputValue) { unsigned long currentTime = millis(); double deltaTime = (double)(currentTime - _lastTime) / 1000; _lastTime = currentTime; _error = _targetValue - inputValue; _sumError += _error * deltaTime; double deltaError = (_error - _lastError) / deltaTime; _lastError = _error; double outputValue = _kp * _error + _ki * _sumError + _kd * deltaError; return outputValue; } }; //定义PID控制器实例 PIDController pid(KP, KI, KD); void setup() { pinMode(LEFT_SENSOR, INPUT); pinMode(RIGHT_SENSOR, INPUT); pinMode(LEFT_MOTOR_PIN, OUTPUT); pinMode(RIGHT_MOTOR_PIN, OUTPUT); pid.setTargetValue(0.5); //设置目标值为0.5 } void loop() { //读取红外循迹传感器的值 int leftSensorValue = analogRead(LEFT_SENSOR); int rightSensorValue = analogRead(RIGHT_SENSOR); double sensorValue = (double)(leftSensorValue + rightSensorValue) / 2.0 / 1023.0; //计算PID控制算法的输出值 double outputValue = pid.compute(sensorValue); //将输出值转换成电机控制信号 int leftMotorSpeed = 255 * (1 - outputValue); int rightMotorSpeed = 255 * (1 + outputValue); //控制小车的转向 analogWrite(LEFT_MOTOR_PIN, leftMotorSpeed); analogWrite(RIGHT_MOTOR_PIN, rightMotorSpeed); } ``` 上述代码中,首先定义了红外循迹传感器的引脚号和电机控制引脚号。然后定义了PID控制器的参数和实例,包括比例系数、积分系数、微分系数、目标值和误差等。在`setup()`函数中,初始化了引脚和目标值。在`loop()`函数中,读取红外循迹传感器的值,并根据PID控制算法计算输出值。最后将输出值转换成电机控制信号,控制小车的转向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllenLeungX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值