background-image: url("../pic/slide-front-page.jpg") class: center,middle exclude: FALSE # 数据、模型与决策</br></br>(Data, Model and Decision) <!--- chakra: libs/remark-latest.min.js ---> ### 胡华平 ### 西北农林科技大学 ### 经济管理学院数量经济教研室 ### huhuaping01@hotmail.com ### 2025-04-01
--- class: center, middle, duke-orange,hide_logo name: chapter09 exclude: FALSE # 第9章 项目安排:</br></br>计划评审法/关键路线法 ### [9.1 活动时间已知的项目安排](#known) ### [9.2 活动时间不确定的项目安排](#uncertain) ### [.white[9.3 时间与成本抉择]](#option) --- layout: false class: center, middle, duke-softblue,hide_logo name: option # 9.3节 时间与成本抉择 --- layout: true <div class="my-header-h2"></div> <div class="watermark1"></div> <div class="watermark2"></div> <div class="watermark3"></div> <div class="my-footer"><span>huhuaping@    <a href="#chapter09"> 第09章 项目安排</a>                       <a href="#option">9.3 时间与成本抉择</a> </span></div> --- ## 引子 .fyi[ **思考**: - 关键路径法的设计为项目经理提供了增加资源以减少项目完成时间的方法。 - 增加资源一般都会增加项目成本,所以项目经理不得不在减少活动时间和增加额外成本之间做出抉择。 ] --- exclude: true ## R chunk: 项目活动 --- ## 机器维修项目:项目活动 下表描述了一项由5项活动构成的双机器维修项目:
--- ## 机器维修项目:项目网络图 根据表中给出的活动信息,可以构造一个项目网络图: - 网络中的节点(方形框)代表每项活动,弧(箭头线)代表各项活动之间的优先顺序。 <img src="../pic/chpt09-case-cost-network-path-time.png" width="1000" style="display: block; margin: auto;" /> --- ### 机器维修项目:找到整个项目的所有关键活动 根据活动时间确定情形下的项目时间相关计算,我们可以得到下表:
- 关键活动有3项,分别是活动A、B和E。 - 关键路径为 `\(A \Rightarrow B \Rightarrow E\)`,路径长度为 `\(7+3+2=12\)`天。 --- ### 机器维修项目:管理层关注的问题 .fyi[ **项目现实情况:** - 我们假设当前的生产水平要求该维修项目必须在10天之内完成。 - 考虑到项目网络的关键路径长度为12天,我们认识到除非能够缩短活动的已知时间,否则要满足期望的不可能的。 - 这通常可以靠增加资源来缩减活动时间,这种方法就是紧缩(crashing) - 但是,增加额外的资源来缩短活动时间,通常会导致项目成本的增加。 ] .puzzle[ **管理层的关注**: - 那么,如何做到只需要最小资源的增加,就能达到紧缩活动时间的目的呢? ] --- ### 机器维修项目:紧缩活动时间 靠增加资源来缩减活动时间的方法就是所谓的**紧缩**(crashing),也称为**紧缩活动时间**。 .case[ > 例如:总工期是12天,希望10天完成,需要缩短工期2天。 ] 此时,我们需要先得到如下的信息 - 正常或期望时间下的活动成本 - 在最大紧缩时间内完成活动那个的时间(最短可能的活动时间) - 最大紧缩时间下的活动成本 --- ### 机器维修项目:紧缩活动时间(定义) 下面给出其他相关定义: .pull-left[ - `\(\tau_i\)`:活动 `\(i\)`的正常时间(期望时间) - `\(\tau_i'\)`:活动 `\(i\)`的最短时间(最大紧缩下的时间) - `\(M_i\)`:活动 `\(i\)`的最大压缩时间 - `\(C_i\)`:活动 `\(i\)`的正常费用(无紧缩) - `\(C_i'\)`:活动 `\(i\)`在最大紧缩时间下的费用 ] .pull-right[ - 最大压缩时间: `\(M_i = \tau_i - \tau_i'\)` - 每项活动在单位时间上的紧缩成本: `\(K_i=\frac{(C_i'-C_i)}{M_i}\)` ] --- ### 机器维修项目:紧缩活动时间(示例) .case[ 已知如下信息: - 给定活动A的正常完成时间 `\(\tau_A=7\)`天,正常的活动费用为 `\(C_A=500\)`美元。 - 而在最大紧缩状态下,活动A的最短完成时间 `\(\tau_A'=4\)`天,但费用会增加到 `\(C_A'=800\)`美元。 我们可以计算得到: - 最大压缩时间 `\(M_A=\tau_A - \tau_A^{\prime}=7-4=3\)` - 单位时间的紧缩成本为 `\(K_A=\frac{(C_A^{\prime}-C_A)}{M_A} = K_i=\frac{(800-800)}{3}=100\)`(美元/每天) ] --- exclude: true ## R chunk: 紧缩计算 --- ### 机器维修项目:时间与成本的关系
.fyi[ **思考**:为了以最小成本在10天期限内完成整个项目,哪些活动应该被紧缩?紧缩多少时间? ] --- ### 机器维修项目:紧缩方案的一个试错修改 为了以最小的成本在10天内完成,我们可能会最先考虑: - 应该紧缩关键路径上的活动,即A、B、E。 - 而活动A在这3项活动中具有**最低**的单位紧缩成本 `\((K_A=100)\)` - 因此将活动A紧缩2天可以使路径A-B-E的完成时间缩减为期望的10天。 .notes[ **注意**: - 当对现在的关键活动进行紧缩时,关键路径可能会改变 - 因此需要检查修改后网络中的关键路径 - 也许会你会发现其实是可以紧缩其他活动或是修改先前的决定 - 对于小型项目网络,我们或许可以多次试错修改,但是对于复杂大型项目则会变得很困难! ] --- ## 紧缩时间后的线性规划模型:问题描述 .puzzle[ > 如何运用线性规划方法,系统分析项目网络的紧缩问题? ] 下面我们需要先进行问题描述。在PERT/CPM中,我们知道: - 完成时间=最早开始时间+活动时间。也即 `\(EF= ES+t\)` - 如果活动具有松弛时间,则:完成时间>最早开始时间+活动时间。也即: `$$LF > (EF = ES +t)$$` - 由于我们不可能提前知道一项活动是否会于最早开始时间开始,则:完成时间≥最早开始时间+活动时间。也即: `$$LF \geq (EF = ES +t)$$` --- ### 线性规模模型示例:活动A 对于一项活动,我们可以给出如下定义: - `\(x_i\)`:活动i的最早完成时间 `\((EF_i)\)` - `\(y_i\)`:活动i的最大紧缩时间 `\(M_i =(\tau_i - \tau_i^{\prime})\)` --- ### 线性规模模型示例:活动A 对于活动A: .pull-left[ - 活动A最早开始时间为 `\(ES_A=0\)`,正常活动时间为 `\(\tau_A=7\)`。 - 那么A正常的最早完成时间为 `$$x_A = EF_A = ES_A + \tau_A = 0+7 = 7$$` - 同时,活动A在紧缩状态下的最早完成时间为 `$$\begin{align} x_A^{\prime} &= ES_A + \tau_A^{\prime} \\ &= ES_A + (\tau_A - M_A) = ES_A + (\tau_A - y_A) \\ &= 0+(7 - y_A ) \end{align}$$` ] .pull-right[ - 那么,活动A的最早完成时间,正常状态下应该要比紧缩状态下更长。因此有: `$$\begin{align} x_A & \geq x_A^{\prime} \\ x_A &\geq 0+(7 - y_A )\\ x_A + y_A &\geq 7 \end{align}$$` ] --- ### 线性规模模型示例:全部活动的约束条件 首先,我们需要考虑所有活动面临的约束条件: .pull-left[ - 照前述方法,可以得到所有活动的如下关系: `$$\begin{align} x_A + y_A &\geq 7 && \text{(A)} \\ x_B + y_B - x_A &\geq 3 && \text{(B)} \\ x_C + y_C &\geq 6 && \text{(C)} \\ x_D + y_D - x_C &\geq 3 && \text{(D)} \\ x_E + y_E - x_B &\geq 2 && \text{(E1)} \\ x_E + y_E - x_D &\geq 2 && \text{(E2)} \\ \end{align}$$` ] .pull-right[ - 此外,我们还要求,项目必须在10天之内完成,因此需要约束活动活动E的完成时间: `$$x_E \leq 10$$` - 而且,每项活动都有最大紧缩时间的约束: $$ y_A \leq 3; y_B \leq 1; y_C \leq 2; y_D \leq 2; y_E \leq 1$$ ] .footnote[ **注意**:由于活动E有两个紧前活动(B和D),因此活动E有两个约束条件。 ] --- ### 线性规模模型示例:目标函数 .fyi[ - 在正常状态下,项目的总成本为1700美元。 - 而在紧缩状态下,我们可以通过最小化**总紧缩成本**来最小化**项目总成本**(=正常成本+总紧缩成本)。 ] 最终我们得到如下的最小化目标函数: `$$\begin{align} \textrm{Min} \quad f&=\sum_{i = 1}^{5}{K_i\cdot M_i} \\ & = K_i\cdot M_A + K_B\cdot M_B + K_C\cdot M_C + K_D\cdot M_D + K_E\cdot M_E \\ & = 100\cdot y_A + 150\cdot y_B + 200\cdot y_C + 150\cdot y_D + 250\cdot y_E \end{align}$$` --- ### 线性规模模型示例:整个规划模型 最终我们得到了具有10个变量和12个约束条件的线性规划模型: `$$\begin{align} \textrm{Min} \quad f&= 100\cdot y_A + 150\cdot y_B + 200\cdot y_C + 150\cdot y_D + 250\cdot y_E \end{align}$$` > s.t. `$$\begin{align} x_A + y_A &\geq 7 && \text{(A)} \\ x_B + y_B - x_A &\geq 3 && \text{(B)} \\ x_C + y_C &\geq 6 && \text{(C)} \\ x_D + y_D - x_C &\geq 3 && \text{(D)} \\ x_E + y_E - x_B &\geq 2 && \text{(E1)} \\ x_E + y_E - x_D &\geq 2 && \text{(E2)} \\ x_E & \leq 10 &&\\ y_A \leq 3; y_B \leq 1; y_C \leq 2; y_D \leq 2; y_E &\leq 1 && \end{align}$$` --- ### 线性规模模型示例:MST分析结果及解读 采用管理科学家软件MST对线性规划模型求解结果: <table class="table" style="margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> 活动代码 </th> <th style="text-align:center;"> 正常时间T_i </th> <th style="text-align:center;"> 紧缩时间T_i' </th> <th style="text-align:center;"> 正常费用C_i </th> <th style="text-align:center;"> 紧缩费用C_i' </th> <th style="text-align:center;"> 最大紧缩时间M_i </th> <th style="text-align:center;"> 单位紧缩费用K_i </th> <th style="text-align:center;"> 最优时间解 </th> <th style="text-align:center;"> 紧缩量K_i </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> A </td> <td style="text-align:center;"> 7 </td> <td style="text-align:center;"> 4 </td> <td style="text-align:center;"> 500 </td> <td style="text-align:center;"> 800 </td> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> 100 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 6 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 1 </td> </tr> <tr> <td style="text-align:center;"> B </td> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> 200 </td> <td style="text-align:center;"> 350 </td> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> 150 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 3 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 0 </td> </tr> <tr> <td style="text-align:center;"> C </td> <td style="text-align:center;"> 6 </td> <td style="text-align:center;"> 4 </td> <td style="text-align:center;"> 500 </td> <td style="text-align:center;"> 900 </td> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> 200 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 6 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 0 </td> </tr> <tr> <td style="text-align:center;"> D </td> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> 200 </td> <td style="text-align:center;"> 500 </td> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> 150 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 3 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 0 </td> </tr> <tr> <td style="text-align:center;"> E </td> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> 300 </td> <td style="text-align:center;"> 550 </td> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> 250 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 1 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 1 </td> </tr> <tr> <td style="text-align:center;"> 合计 </td> <td style="text-align:center;"> 21 </td> <td style="text-align:center;"> 12 </td> <td style="text-align:center;"> 1700 </td> <td style="text-align:center;"> 3100 </td> <td style="text-align:center;"> 9 </td> <td style="text-align:center;"> 850 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 19 </td> <td style="text-align:center;color: red !important;background-color: yellow !important;"> 2 </td> </tr> </tbody> </table> 结果解读: -- .page-font-20[ - 活动A和活动E最终活动时间分别为6天和1天,比正常状态下分别紧缩了1天时间。 - 总紧缩成本为 `\(K_A \cdot y_A +K_E \cdot y_E = 100 \times 1 +250 \times1 = 350\)` - 因此,正常状态下的项目总成本为1700美元,而紧缩状态下项目总成本为1700+350 = 2050美元。 ] --- ## 紧缩时间后的线性规划模型:评析 .notes[ - 线性规划解为我们提供了修改后的活动时间,但没有提供修改后的最早开始时间,最晚开始时间和松弛等信息。 - 我们必须用修改后的活动时间和一般的PERT/CPM方法来设计项目的活动时间安排表。 ] --- ### MST-LP线性规划求解:实操步骤1 - **步骤1**:打开管理科学家软件,选择分析模块`4. Integer Linear Programming`。 <img src="../pic/seq-chpt09-crash-LP/chpt09-crash-lp-seq- 01.jpg" width="680" style="display: block; margin: auto;" /> --- ### MST-LP线性规划求解:实操步骤2 - **步骤2**:新建线性规划分析工作;设定相关参数。 <img src="../pic/seq-chpt09-crash-LP/chpt09-crash-lp-seq- 02.jpg" width="730" style="display: block; margin: auto;" /> --- ### MST-LP线性规划求解:实操步骤3 - **步骤3**:根据线性约束模型,填写相关参数;设定求解参数。 <img src="../pic/seq-chpt09-crash-LP/chpt09-crash-lp-seq- 03.jpg" width="1030" style="display: block; margin: auto;" /> --- ### MST-LP线性规划求解:实操步骤4 - **步骤4**:得到线性规划求解结果。 <img src="../pic/seq-chpt09-crash-LP/chpt09-crash-lp-seq- 04.jpg" width="430px" style="display: block; margin: auto;" /> --- ### MST-LP线性规划求解:实操步骤5 - **步骤5**:把问题分析过程,保存下来。 <img src="../pic/seq-chpt09-crash-LP/chpt09-crash-lp-seq- 05.jpg" width="730" style="display: block; margin: auto;" /> --- layout:false background-image: url("../pic/thank-you-gif-funny-fan.gif") class: inverse,center # 本节结束