第10章利用LING0开发高级模型 在这一章里,我们将在不同的领域里建立一些高级模型。其目的有两个:一个是通过对这些高级模型 的研究,帮助用户提高建模的技巧:另一个是通过 LINGO在生产管理、后勤保障、金融、排队和销售等 很多领域的实例来说明 LINGO应用的广泛性。 10.1生产管理模型 在这一节里,我们将开发生产管理领域里的四个模型。下面分别进行详细介绍: 10.1.1 MODELI: BLEND(原材料混合模型) 1.背景 在混合问题中,通常是将两种或多种原材料混合在一起制成一种或多种产品,这种产品要满足一种或 多种质量要求。混合问题适用于很多领域,包括决定动物饲料的最佳配比、最低成本的矿石组合以及制造 出一种最低成本的特殊合金或决定最有效的广告媒体交易等等。 2.问题 假设有一家燃料处理工厂,生产两种产品 Regular和 Premium,并希望能获得最大的收益。这两种产品都 是由丁烷( butane)、催化重整油( catalytic reformats)和石脑油( naphtha)混合而成。它们必须在锌烷( octane) 蒸汽压( vapor pressure)和挥发性( volatility)方面满足一定的要求。每一种原材料都是有限的。而且己 知原材料的单位成本和产品的最小需要量和最大需要量 3.模型 模型10.1.1.1:原材料混合模型 BLEND ??? 4.集合 在这个模型里,我们定义了三个基本集合,即 RAWMAT(原材料)、 FINGOOD(产品)和 QUALMES 质量要素)。 从这三个基本集合可创建三个派生集合。第一个派生集合RXQ是一个密集,它是由原材料集合和质 量要素集合相乘而得,用这个派生集合来定义一个属性以表示每一种原材料的质量指标。第二个派生集合 QXF是由质量集合和产品集合相乘而得,用这个集合可以计算出产品里的质量指标。第三个派生集合RXF 是由原材料集合和产品集合相乘而得,用这个集合可以计算出每一种产品里原材料的含量 5.变量 在这个模型里,主要变量是每一种产品里各种原材料的数量(USED)。为了计算上的需要,我们还增 加了两个其他的变量。第一个变量是 BATCH,它被用于表示每一种产品的批量大小。第二个变量是 QSLACK,它被用于表示每一种产品里的各个质量要素离上限值的松弛量。 6.目标函数 这个模型的目标函数是求总收益达到最大。这可以用下面的表达式计算: [OBJECTIVEJMAX @SUM ( FINGOOD: PRICe*BATCH) @SUM (RAWMAT (R): COST (R)* @SUM(FINGOOD(F): USED(R, F))); 总收益当然是总收入减去总费用。总收入等于每一种产品的单位售价乘上它的批量再求和。可用下面 的 LINGO语句表达 UM (FINGOOD: PRICE %BATCH 总费用等于每一种原材料的单位价格乘上所用的总数再求和。它可以用下面的表达式计算: @SUM(RAWMAT (R: COST(R)( aSUM (FINGOOD(F): USED(R, F) 7.约束 在这个模型里有四种类型的约東,仅仅有两种要计算。第一种要计算的约束是每一种产品的批量。可 以用下面的表达式计算: BATCOMPJBATCH(F)=@SUM (RAWMAT (R): USED(R, F));
第 10 章 利用 LING0 开发高级模型 在这一章里,我们将在不同的领域里建立一些高级模型。其目的有两个:一个是通过对这些高级模型 的研究,帮助用户提高建模的技巧;另一个是通过 LINGO 在生产管理、后勤保障、金融、排队和销售等 很多领域的实例来说明 LINGO 应用的广泛性。 10.1 生产管理模型 在这一节里,我们将开发生产管理领域里的四个模型。下面分别进行详细介绍: 10.1.1 MODELl:BLEND(原材料混合模型) 1. 背景 在混合问题中,通常是将两种或多种原材料混合在一起制成一种或多种产品,这种产品要满足一种或 多种质量要求。混合问题适用于很多领域,包括决定动物饲料的最佳配比、最低成本的矿石组合以及制造 出一种最低成本的特殊合金或决定最有效的广告媒体交易等等。 2. 问题 假设有一家燃料处理工厂,生产两种产品 Regular 和 Premium,并希望能获得最大的收益。这两种产品都 是由丁烷(butane)、催化重整油(catalytic reformats)和石脑油(naphtha)混合而成。它们必须在锌烷(octane)、 蒸汽压(vapor pressure)和挥发性(volatility)方面满足一定的要求。每一种原材料都是有限的。而且己 知原材料的单位成本和产品的最小需要量和最大需要量。 3. 模型 模型 10.1.1.1:原材料混合模型 BLEND ??? 4. 集合 在这个模型里,我们定义了三个基本集合,即 RAWMAT(原材料)、FINGOOD(产品)和 QUALMES (质量要素)。 从这三个基本集合可创建三个派生集合。第一个派生集合 RXQ 是一个密集,它是由原材料集合和质 量要素集合相乘而得,用这个派生集合来定义一个属性以表示每一种原材料的质量指标。第二个派生集合 QXF 是由质量集合和产品集合相乘而得,用这个集合可以计算出产品里的质量指标。第三个派生集合 RXF 是由原材料集合和产品集合相乘而得,用这个集合可以计算出每一种产品里原材料的含量。 5. 变量 在这个模型里,主要变量是每一种产品里各种原材料的数量(USED)。为了计算上的需要,我们还增 加了两个其他的变量。第一个变量是 BATCH,它被用于表示每一种产品的批量大小。第二个变量是 QSLACK,它被用于表示每一种产品里的各个质量要素离上限值的松弛量。 6. 目标函数 这个模型的目标函数是求总收益达到最大。这可以用下面的表达式计算: [OBJECTIVE]MAX= @SUM(FINGOOD:PRICE*BATCH) @SUM(RAWMAT(R):COST(R)* @SUM(FINGOOD(F):USED(R,F))); 总收益当然是总收入减去总费用。总收入等于每一种产品的单位售价乘上它的批量再求和。可用下面 的 LINGO 语句表达: @SUM(FINGOOD:PRICE%BATCH) 总费用等于每一种原材料的单位价格乘上所用的总数再求和。它可以用下面的表达式计算: @SUM(RAWMAT(R):COST(R){ @SUM(FINGOOD(F):USED(R,F)) 7. 约束 在这个模型里有四种类型的约束,仅仅有两种要计算。第一种要计算的约束是每一种产品的批量。可 以用下面的表达式计算: [BATCOMP]BATCH(F)=@SUM(RAWMAT(R):USED(R,F));
具体说就是:产品F的批量是所有用于产品里的原材料的总和 第二种要计算的约束是计算每一种产品里的质量指标离质量上限的缺损值。每一种质量指标测定如 下 [QRESUPJ@SUM(RAWMAT (R) QLEVEL(R,Q)*USED(R, F))+QSLACK(Q, F)=QUP(Q, F)*BATCH (F); 具体地说,实际质量指标加上离上限的缺损值等于质量上限指标, 第三种约束是产品的批量必须在限制的范围内。我们用@BND函数建立这一约束如下 @BND(MINREQ, BATCH, MAXSELL): 注意:虽然我们可以直接输入批量大小限制的约束,但是使用aBND函数限制变量的界限效率更高。 最后一种约束是产品的质量指标必须符合要求。我们使用下面的约束: [QRESDNJQSLACK (Q, F)<=(QUP(Q, F)-QLOW(Q, F))SBATCH(F) 具体地说,质量指标的松弛量必须小于等于质量指标的最大量与最小量的差值。否则质量指标一定低 于最小限量。松弛量非负的事实确保质量指标不会超过最大限量。 8.解答 求解模型可得如下结果 BATCH (REGULARY 4000.000 BATCH (PREMIUM) 4095.238 total profit $44,905 下面列出了产品中各种原材料的实际含量 Raw material(原材料) Regular Premium 466 Catalytic Reformats 5162484 1.9501.146 10.1.2 MODEL2:MRP(物资需求计划模型) 1.背景 物资需求计划技术简称MRP,是用于制作复杂产品的生产进度表。假设已知产品的需求进度表、产品 及各种部件订货至交货的时间,于是MRP可利用它们提出符合需求进度表的详细及时的生产进度表 MRP的目的是找到一个符合需求的详细及时的生产进度表。MRP没有试图去寻找总成本最少的生产 进度表。在很多情况下,借助于MRP去寻找成本最少的生产进度表是一个很复杂的最优化问题,而且很 难实现 2.问题 假设你是一个人力车的制造商,有一个未来产品的需求计划。为了满足生产的需求,你需要知道什么 时候需要哪些部件、子部件以及它们的数量。假设你的最终产品有: (1)单轮脚踏车(有一个座位和一个轮子)—— -Unicycle (2)自行车(有一个座位、两个轮子和一根链条)—— Bicycles (3)双座自行车(两个座位、两个轮子和两根链条)—— Tandem 每一种产品都是由一些部件组装而成。每一个部件又都是由其他的一些子部件组装而成。为了简单和 不失一般性,我们把所有的产品、部件和子部件都看成零件。下面是主要的部件和子部件 (1)座位一 Seats (2)轮子(有1根轮轴和36根轮辐)- Wheels (3)链条(有84个链环)—— Chins (4)轮轴——Hubs (5)轮辐—— Spokes (6)链环—— Links 生产每一批零件所用的时间称为定货至交货的时间。当你开始生产一个零件的时候,相应的部件必须 及时到位。销售部门对未来两个月(8周)的需求作了预测:第八周需要10辆单轮脚踏车,第九周需要
具体说就是:产品 F 的批量是所有用于产品里的原材料的总和。 第二种要计算的约束是计算每一种产品里的质量指标离质量上限的缺损值。每一种质量指标测定如 下: [QRESUP]@SUM(RAWMAT(R): QLEVEL(R,Q)* USED(R,F))+QSLACK(Q,F)=QUP(Q,F)*BATCH(F); 具体地说,实际质量指标加上离上限的缺损值等于质量上限指标。 第三种约束是产品的批量必须在限制的范围内。我们用@BND 函数建立这一约束如下: @BND(MINREQ,BATCH,MAXSELL); 注意:虽然我们可以直接输入批量大小限制的约束,但是使用@BND 函数限制变量的界限效率更高。 最后一种约束是产品的质量指标必须符合要求。我们使用下面的约束: [QRESDN]QSLACK(Q,F)<=(QUP(Q,F)-QLOW(Q,F))$BATCH(F); 具体地说,质量指标的松弛量必须小于等于质量指标的最大量与最小量的差值。否则质量指标一定低 于最小限量。松弛量非负的事实确保质量指标不会超过最大限量。 8. 解答 求解模型可得如下结果: BATCH(REGULAR) 4000.000 BATCH(PREMIUM) 4095.238 total profit $44,905 下面列出了产品中各种原材料的实际含量: Raw Material(原材料) Regular Premium Butane 534 466 Catalytic Reformats 1,516 2.484 Naphtha 1,950 l,146 10.1.2 MODEL2:MRP(物资需求计划模型) 1. 背景 物资需求计划技术简称 MRP,是用于制作复杂产品的生产进度表。假设已知产品的需求进度表、产品 及各种部件订货至交货的时间,于是 MRP 可利用它们提出符合需求进度表的详细及时的生产进度表。 MRP 的目的是找到一个符合需求的详细及时的生产进度表。MRP 没有试图去寻找总成本最少的生产 进度表。在很多情况下,借助于 MRP 去寻找成本最少的生产进度表是一个很复杂的最优化问题,而且很 难实现。 2. 问题 假设你是一个人力车的制造商,有一个未来产品的需求计划。为了满足生产的需求,你需要知道什么 时候需要哪些部件、子部件以及它们的数量。假设你的最终产品有: (1)单轮脚踏车(有一个座位和一个轮子)——Unicycle (2)自行车(有一个座位、两个轮子和一根链条)——Bicycles (3)双座自行车(两个座位、两个轮子和两根链条)——Tandem 每一种产品都是由一些部件组装而成。每一个部件又都是由其他的一些子部件组装而成。为了简单和 不失一般性,我们把所有的产品、部件和子部件都看成零件。下面是主要的部件和子部件: (1)座位——Seats (2)轮子(有 1 根轮轴和 36 根轮辐)——Wheels (3)链条(有 84 个链环)——Chins (4)轮轴——Hubs (5)轮辐——Spokes (6)链环——Links 生产每一批零件所用的时间称为定货至交货的时间。当你开始生产一个零件的时候,相应的部件必须 及时到位。销售部门对未来两个月(8 周)的需求作了预测:第八周需要 10 辆单轮脚踏车,第九周需要
20辆自行车和20辆双座自行车 3.模型 模型10.1.2-1:物资需求计划模型MRP ?? 你一定还记得代字号“~”是LNGO的记录结束符号。当遇到一个代字号时,LNGO就停止从数据 文件读取数据而开始读取模型文件里的下一个语句。 5.集合 在这个模型里我们定义了两个基本集合:一个是零件(PARI),另一个是时间周期(TME) 用上面两个基本集合又产生了两个派生集合:一个是USES,它是一个密集,由PART与自身相乘而 得,我们用这个集合来建造一个包含零件使用数据的表格或称输入输出矩阵,这个表格告诉我们生产一个 零件需要多少配件。另一个派生集合是PXT,它是由零件集合与时间周期集合相乘而得,我们需要这个集 合是由于我们关心每一时期每一种零件的需要量及每一时期开始生产的每一种零件的数量。 6.变量 在这个模型里惟一未知的是总需求属性(TD)。这里TD(p,t)是t时期产品p的总需求。总需求由 两个因素决定:一个是外部消费者的需求(ED):一个是内部生产方面的需求。我们借助于合并零件的定 货至交货的时间来计算TD。这样,当TD在某一时期为非零时,则生产必须在那一时期开始。 7.公式 这个模型的关键公式是: !对每一零件P和时间周期T,总需求=外部需求+未来一个订货至交货时间父集合的需求 复制过来??? 对每一个时期里的每一种零件而言,必须开始生产的数量在其订货交货时间后要满足: (1)外部的需求 (2)内部生产的需求 表示内部需求的子表达式为:ED(PT+LT(P)) 下面的表达式求出了在一个订货交货时间以外,内部生产需要的所有其余零件数量 aSUM(USES(P2, P): TD(P2, T+LT(P))*NEEDS(P2, P)): 注意:我们在外面@FOR循环函数里还使用了一个逻辑判别式(用黑体显示) @FOR (PXT (ET) I T+LT (P)#LE#NP: 如果没有这个条件判别式,这个计算将扩展到TME集合里的最后时期之外。 8.解答 求解这个模型,我们将会得到下面的变量TD的非零值解答: Variable TD (U, 7) 10.00000 TD(B, 7) 20.00000 TD(T8) 20.00000 TD(S, 6) 30.00000 TD(S。7) 40.00000 ID(W:4)50.00000 TD(W5) 40.00000 TD(C, 6) 20.00000 TD(C7 40.00000 TD(H3) 50.00000 TD(H 4) 40.00000 TD(P2) 1800.000 TD(E3) 1440.000 TD(L, 4) 1680.000
20 辆自行车和 20 辆双座自行车。 3. 模型 模型 10.1.2—1:物资需求计划模型 MRP ??? 你一定还记得代字号“~”是 LINGO 的记录结束符号。当遇到一个代字号时,LINGO 就停止从数据 文件读取数据而开始读取模型文件里的下一个语句。 5. 集合 在这个模型里我们定义了两个基本集合:一个是零件(PART),另一个是时间周期(TIME)。 用上面两个基本集合又产生了两个派生集合:一个是 USES,它是一个密集,由 PART 与自身相乘而 得,我们用这个集合来建造一个包含零件使用数据的表格或称输入输出矩阵,这个表格告诉我们生产一个 零件需要多少配件。另一个派生集合是 PXT,它是由零件集合与时间周期集合相乘而得,我们需要这个集 合是由于我们关心每一时期每一种零件的需要量及每一时期开始生产的每一种零件的数量。 6. 变量 在这个模型里惟一未知的是总需求属性(TD)。这里 TD(p,t)是 t 时期产品 p 的总需求。总需求由 两个因素决定:一个是外部消费者的需求(ED);一个是内部生产方面的需求。我们借助于合并零件的定 货至交货的时间来计算 TD。这样,当 TD 在某一时期为非零时,则生产必须在那一时期开始。 7. 公式 这个模型的关键公式是: !对每一零件 P 和时间周期 T,总需求=外部需求+未来一个订货至交货时间父集合的需求; 复制过来??? 对每一个时期里的每一种零件而言,必须开始生产的数量在其订货交货时间后要满足: (1)外部的需求 (2)内部生产的需求 表示内部需求的子表达式为:ED(P, T+LT(P)) 下面的表达式求出了在一个订货交货时间以外,内部生产需要的所有其余零件数量。 @SUM(USES(P2,P):TD(P2,T+LT(P))*NEEDS(P2,P)); 注意:我们在外面@FOR 循环函数里还使用了一个逻辑判别式(用黑体显示): @FOR(PXT(E T)I T+LT(P)#LE#NP: 如果没有这个条件判别式,这个计算将扩展到 TIME 集合里的最后时期之外。 8. 解答 求解这个模型,我们将会得到下面的变量 TD 的非零值解答: Variable Value TD(U,7) 10.00000 TD(B,7) 20.00000 TD(T.8) 20.00000 TD(S,6) 30.00000 TD(S。7) 40.00000 TD(W:4) 50.00000 TD(W,5) 40.00000 TD(C,6) 20.00000 TD(C.7) 40.00000 TD(H.3) 50.00000 TD(H.4) 40.00000 TD(P,2) 1800.000 TD(E 3) 1440.000 TD(L,4) 1680.000
T1)(L,5)3360.000 将上面的解答制成表格就会得到如表10.1所示的生产进度表。 表10.1MRP生产进度 时间(周) 3 4 6 8 零件(个) Unicycle Bicycles Tandem Seats Hubs 40 Spokes 1.8001.440 1.6803.360 见程序 !对于每一个存在优先关系的作业对来说,前者对应的工作站I必须小于后者对应的工作站J @FOR (PRED(I, J): @SUM (STATION (K): K(X (, K).KX(I, K))>=0) 对于每一个工作站来说,指派作业完成的总时间必须小于最大循环时间 @FOR (STATION (K) @SUM(TXS (I, K):T(D)X(I, K))<=CYCTIME ) !目标函数是使最大循环时间达到最小 MIN=CYCTIME: 指定X(I,J)为0/1变量 @FOR(TXS: @BIN (X)) END 4.集合 我们定义两个基本集合一—TASK(作业)和STA∏ON(工作站)。我们用这两个基本集合产生两个派 生集合。第一个派生集合是PRET,它是一个疏集,是由集合TASK与自身相乘而得。集合的元素是作业 之间的优先关系,例如,这个集合的第一个元素是(A,B),它表示作业A优先于作业B。 第二个派生集合是TXS,它是由作业集合与工作站集合相乘而得到的密集,我们用这个集合来确定哪 一个作业指派给哪一个工作站。 变量 这个模型的决策变量是属性X。属性Ⅹ是定义在集合TXS上。X(t,s)是一个0/1变量。如果作 业t指派给工作站s,则其值为l:否则其值为0。属性X可用下式限定为0/1变量 @FOR(TXS:@BIN (X)); 为了表示整个装配线的循环时间,我们引进了标量变量 CYCTIME,它是通过每个工作站的最大循环 时间来计算的。 6.目标函数 这个模型的目标函数很简单,它就是使得装配线总体循环时间达到最小值。可用下式给出 MINECYCTIME 约束 这个模型的约束有三种:
T1)(L, 5) 3360.000 将上面的解答制成表格就会得到如表 10.1 所示的生产进度表。 表 10.1 MRP 生产进度 时间(周) 零件(个) 2 3 4 5 6 7 8 Unicvcle lO Bicvcles 20 Tandem 20 Seats 30 40 Wheels 50 40 Chains 20 40 Hubs 50 40 Spokes 1.800 1.440 Links 1.680 3.360 见程序 !对于每一个存在优先关系的作业对来说,前者对应的工作站 I 必须小于后者对应的工作站 J: @FOR(PRED(I,J):@SUM(STATION(K):K{X(J,K)·K}X(I,K))>=0); !对于每一个工作站来说,指派作业完成的总时间必须小于最大循环时间; @FOR(STATION(K): @SUM(TXS(I,K):T(I)}X(I,K))<=CYCTIME); !目标函数是使最大循环时间达到最小; MIN=CYCTIME; !指定 X(I,J)为 0/1 变量; @FOR(TXS:@BIN(X)); END 4. 集合 我们定义两个基本集合——TASK(作业)和 STATION(工作站)。我们用这两个基本集合产生两个派 生集合。第一个派生集合是 PRET,它是一个疏集,是由集合 TASK 与自身相乘而得。集合的元素是作业 之间的优先关系,例如,这个集合的第一个元素是(A,B),它表示作业 A 优先于作业 B。 第二个派生集合是 TXS,它是由作业集合与工作站集合相乘而得到的密集,我们用这个集合来确定哪 一个作业指派给哪一个工作站。 5. 变量 这个模型的决策变量是属性 X。属性 X 是定义在集合 TXS 上。X(t,s)是一个 0/1 变量。如果作 业 t 指派给工作站 s,则其值为 l;否则其值为 0。属性 X 可用下式限定为 0/1 变量: @FOR(TXS:@BIN(X)); 为了表示整个装配线的循环时间,我们引进了标量变量 CYCTIME,它是通过每个工作站的最大循环 时间来计算的。 6. 目标函数 这个模型的目标函数很简单,它就是使得装配线总体循环时间达到最小值。可用下式给出: MIN=CYCTIME; 7. 约束 这个模型的约束有三种:
(1)每一个作业必须指派到一个工作站; (2)作业的优先关系必须得到满足; (3)装配线循环时间 CYCTIME变量的计算 下面的表达式求出每一个作业的指派标量的总和并令其值为1。这样就限定一个作业只被指派到一 工作站 @FOR(TASK (I):@SUM(STATION(K):X(, K))=1) 我们使用下面的表达式执行作业的优先关系: @FOR(PRED(I, J) @SUM (STATION (): K*X(J, K)-K*X(I, K))>=0) 假设作业Ⅰ是在作业J之前。如果作业I被错误地指派给了一个工作站,而这个工作站是在作业J指 派给的工作站之后。那么,所有K*X(I,K)的总和将超所有K*X(J,K)的总和,约束不会得到满足 这样,上面的约束有效地保证了优先关系 我们用下面的约束计算循环时间 @FOR (STATION (K) @SUM(TXS (I, K):T(I)*X(I, K))<=CYCTIME ) 在这个约束里,@SUM(IXS(I,K):T(1)}*X(I,K)为工作站K算出循环时间。我们用aFOR 语句使变量 CYCTIME大于或等于所有工作站的循环时间。如果我们再加上目标函数使 CYCTIME达到最 小,CYC∏ME将被“压缩”到各个工作站循环时间的最大值。 借助于“压缩” CYCTIME到恰当的值,我们避免了使用@MAX函数。假如我们一定要使用@MAX 函数的话,为了把握分段线性函数@MAX, LINGO将不得不求助于非线性求解器。在建模实践中,我们 应尽量避免使用非线性模型,这很重要 8.解答 求解模型,我们将会得到下面指派变量ⅹ的非零值解答: X(A,2) 1000000 X(B,3) 1.000000 X(C,4) 1.000000 X(D,1) 1.000000 X(E,3) 1.000000 X(F,4) X(G,4) 1000000 X(H,3) X(I,3 1.000000 X(J,4) 1000000 X(K,4) 1.000000 概述这个解答,我们有: Workstation Assigned Tasks Cycle Time D 整个装配线的循环时间是50分钟,它是所有工作站的最大循环时间。我们得到了一个较为平衡的装 配线(只有2号工作站有5分钟的松弛时间) 10.1.4 MODEL4: ORDER(工件排序模型) 1.背景 在工件排序问题中,每个工件将被指派到不同的机床上进行加工作业,目标函数是求出所有工件的加
(1)每一个作业必须指派到一个工作站; (2)作业的优先关系必须得到满足; (3)装配线循环时间 CYCTIME 变量的计算。 下面的表达式求出每一个作业的指派标量的总和并令其值为 1。这样就限定一个作业只被指派到一个 工作站。 @FOR(TASK(I):@SUM(STATION(K):X(I,K))=1); 我们使用下面的表达式执行作业的优先关系: @FOR(PRED(I,J): @SUM(STATION(K):K*X(J,K)-K* X(I,K))>=0); 假设作业 I 是在作业 J 之前。如果作业 I 被错误地指派给了一个工作站,而这个工作站是在作业 J 指 派给的工作站之后。那么,所有 K*X(I,K)的总和将超所有 K*X(J,K)的总和,约束不会得到满足。 这样,上面的约束有效地保证了优先关系。 我们用下面的约束计算循环时间: @FOR(STATION(K): @SUM(TXS(I,K):T(I)*X(I,K))<=CYCTIME); 在这个约束里,@SUM(TXS(I,K):T(I)}*X(I,K))为工作站 K 算出循环时间。我们用@FOR 语句使变量 CYCTIME 大于或等于所有工作站的循环时间。如果我们再加上目标函数使 CYCTIME 达到最 小,CYCTIME 将被“压缩”到各个工作站循环时间的最大值。 借助于“压缩”CYCTIME 到恰当的值,我们避免了使用@MAX 函数。假如我们一定要使用@MAX 函数的话,为了把握分段线性函数@MAX,LINGO 将不得不求助于非线性求解器。在建模实践中,我们 应尽量避免使用非线性模型,这很重要。 8. 解答 求解模型,我们将会得到下面指派变量 X 的非零值解答: Variable Value X(A,2) 1.000000 X(B,3) 1.000000 X(C,4) 1.000000 X(D,1) 1.000000 X(E,3) 1.000000 X(F,4) 1.000000 X(G,4) 1.000000 X(H,3) 1.000000 X(I,3) 1.000000 X(J,4) 1.000000 X(K,4) 1.000000 概述这个解答,我们有: Workstation Assigned Tasks Cycle Time 1 D 50 2 A 45 3 B,E,H,I 50 4 C,F,G,J,K 50 整个装配线的循环时间是 50 分钟,它是所有工作站的最大循环时间。我们得到了一个较为平衡的装 配线(只有 2 号工作站有 5 分钟的松弛时间)。 10.1.4 MODEL4:ORDER(工件排序模型) 1. 背景 在工件排序问题中,每个工件将被指派到不同的机床上进行加工作业,目标函数是求出所有工件的加