+ All Categories
Home > Documents > Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization...

Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization...

Date post: 08-Jun-2020
Category:
Upload: others
View: 38 times
Download: 0 times
Share this document with a friend
378
Xpress-MP 优化实例精选 原书名:Programmation linéaire 原作者:Christelle Guéret, Christian Prins, Marc Sevaux ©2000,Editions Eyrolles,Paris,France。 英文版书名:Applications of optimization with Xpress-MP 英文版译校:Susanne Heipcke 中文版译校:Bryan Soon 译自本书英文版 Dash Optimization 有限公司出版 www.dashoptimization.com
Transcript
Page 1: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

Xpress-MP

优化实例精选 原书名:Programmation linéaire

原作者:Christelle Guéret, Christian Prins, Marc Sevaux

©2000,Editions Eyrolles,Paris,France。

英文版书名:Applications of optimization with Xpress-MP

英文版译校:Susanne Heipcke

中文版译校:Bryan Soon

译自本书英文版

Dash Optimization 有限公司出版

www.dashoptimization.com

Page 2: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

Dash Optimization Ltd.

Blisworth House

Blisworth

Northants

NN7 3BX

United Kingdom

©2000,Editions Eyrolles,Paris,France。

英文译本首发行于 2002 年

中文译本首发行于 2006 年

本书的翻译和编辑均得到 EC Framework 5 之 LISCOS(大型集成供应链优化软件)项目的支

持(合同号 G1RD-1999-00034)。

封面设计: James Atkins Design, www.jades.co.uk

负责人: Software Logistics, www.softwarelogistics.com

ISBN: 0-9543503-0-8

近更新于 2006 年 1 月 19 日

Page 3: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

关于作者

Christelle Guéret,现为法国南特高等矿业学院(Ecole des Mines de Nantes)自

动控制和生产系统系副教授。她于 1997 年在法国贡比涅工程技术大学获得博士学位,并在

2004 年 12 月在南特大学 IRCCyN 实验室获得任教资格。她执教的课程包括图论算法,调度

问题,以及线性规划等。她的主要研究领域主要是生产和物流过程中的优化问题,尤其是调

度问题和车辆路径问题。

Susanne Heipcke,曾经在德国巴斯夫公司(BASF-AG)工作,并在 1998 年加入 Dash

Optimization。在攻读博士期间她的主要研究方向是联合使用约束规划和混合整数规划方法

解决大规模工业问题,并于 1999 年在英国白金汉大学获得博士学位。此后她致力于建模相

关的各种工作,包括编写 Mosel 的教学材料,以及开发 Mosel 与各种求解器和求解方法之间

的接口。从 2001 年起,她开始在埃克斯-马赛第二大学执教硕士研究生的数学建模课程。

Christian Prins,于法国皮埃尔和玛丽居里大学(又称法国第六大学)获得博士学位

和任教资格。目前他在法国特鲁瓦工程技术大学(UTT)工业系统工程系担任教授。他的研

究兴趣包括组合优化,车辆路径问题和运输问题,调度问题,及用于优化的算法工具(例如

元启发方法,可重用的软件组件等)。他是 Computers and Operations Research 编辑委员

会成员。

Marc Sevaux,现在法国南不列塔尼大学(罗连安特)担任教授职务。他在 1998 年于

皮埃尔和玛丽居里大学(巴黎第六大学)获得博士学位,并在 2004 年 7 月于法国瓦伦西安

大学 LAMIH 实验室获得执教资格。他的主要研究兴趣是组合优化问题,特别是规划,调度,

与路径选择问题。Marc Sevaux 是元启发学会欧洲分会(EU/ME)的负责人。他是 Journal of

Heuristics and INFO 的副编辑。

Page 4: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

I

目录 前言........................................................................ 1

预备知识.................................................................... 5

在阅读本书前你需要了解................................................... 5

符号和约定............................................................... 6

第1部分 开发线性和整数规划模型 .............................................. 7

第1章 什么是建模? 为什么要使用模型? ....................................... 8

1.1 棋子问题:描述....................................................... 8

1.1.1 第一个模型表达................................................. 8

1.2 线性规划........................................................... 10

1.3 求解棋子问题........................................................ 13

1.3.1 创建模型...................................................... 13

1.3.2 结果.......................................................... 15

1.3.3 可分割性...................................................... 18

1.3.4 无界和不可行.................................................. 18

1.4 处理不可行性和无界性................................................ 18

1.5 建模和优化带来的收益................................................ 19

1.6 模型中的数据........................................................ 21

1.7 参考文献和进阶阅读.................................................. 21

第2章 典型线性规划模型的创建 ............................................... 23

2.1 简单上界和下界...................................................... 23

2.2 流约束.............................................................. 25

2.3 简单资源约束........................................................ 26

2.4 物料平衡约束....................................................... 28

2.5 质量需求............................................................ 31

2.6 会计约束,非约束的“约束”.......................................... 32

2.7 混合约束............................................................ 33

2.8 模式................................................................ 34

2.9 软约束和“恐慌变量”................................................ 35

2.10 目标函数........................................................... 37

2.10.1 大化目标函数............................................... 37

2.10.2 比例目标函数................................................. 37

第3章 整数规划模型......................................................... 39

3.1 整数规划对象:“全局实体”.......................................... 39

3.2 整数规划求解:分支定界法............................................ 41

3.3 使用二值变量建模.................................................... 43

3.3.1 是/否逻辑..................................................... 43

3.3.2 逻辑条件...................................................... 44

3.3.3 二值变量乘积.................................................. 49

3.3.4 二分法:要么/要么约束......................................... 50

3.4 二值变量“无所不能”................................................ 51

3.4.1 普通整数...................................................... 52

Page 5: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

II

3.4.2 部分整数...................................................... 52

3.4.3 半连续(SC)变量.............................................. 52

3.4.4 1 类特殊有序集(SOS1 或 S1) ................................... 53

3.4.5 2 类特殊有序集(SOS2 或 S2) ................................... 54

3.5 联系实数变量与二值变量.............................................. 56

3.5.1 建模固定成本.................................................. 56

3.5.2 计数.......................................................... 57

3.5.3 部分整数变量.................................................. 58

3.5.4 价格间断与销售经济学.......................................... 59

3.5.5 二值变量和实数变量的乘积...................................... 61

3.6 参考文献和进阶阅读.................................................. 61

第4章 二次规划............................................................. 63

4.1 销售额优化.......................................................... 63

4.2 投资优化............................................................ 63

4.3 参考文献和进阶阅读.................................................. 64

第2部分 应用实例........................................................... 65

应用实例问题分类........................................................... 66

第5章 Xpress-MP基础........................................................ 73

5.1 引例................................................................ 73

5.1.1 使用 Xpress-Mosel ............................................. 74

5.1.2 使用 Xpress-IVE ............................................... 75

5.2 使用 Mosel 建模...................................................... 76

5.2.1 窃贼问题...................................................... 76

5.2.2 从文本文件读入数据............................................ 80

5.2.3 保留关键字.................................................... 81

第6章 采矿和加工业......................................................... 83

6.1 合金制造............................................................ 83

6.1.1 模型的数学表达................................................ 84

6.1.2 模型实现...................................................... 85

6.1.3 结果.......................................................... 87

6.2 动物饲料制造........................................................ 87

6.2.1 模型的数学表达................................................ 88

6.2.2 模型实现...................................................... 90

6.2.3 结果.......................................................... 92

6.3 石油精炼............................................................ 93

6.3.1 模型的数学表达................................................ 94

6.3.2 模型实现...................................................... 97

6.3.3 结果......................................................... 100

6.4 蔗糖生产........................................................... 100

6.4.1 模型的数学表达............................................... 100

6.4.2 模型实现..................................................... 101

6.4.3 结果......................................................... 102

6.5 露天采矿........................................................... 103

6.5.1 模型的数学表达............................................... 103

Page 6: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

III

6.5.2 模型实现..................................................... 104

6.5.3 结果......................................................... 105

6.6 电力生产........................................................... 106

6.6.1 模型的数学表达............................................... 106

6.6.2 模型实现..................................................... 108

6.6.3 结果......................................................... 109

6.7 参考文献和进阶阅读................................................. 110

第7章 调度问题............................................................ 111

7.1 体育馆建设......................................................... 111

7.1.1 问题 1 的数学表达............................................. 111

7.1.2 问题 1 的程序实现............................................. 113

7.1.3 问题 1 的结果................................................. 114

7.1.4 问题 2 的数学表达............................................. 114

7.1.5 问题 2 的程序实现............................................. 115

7.1.6 问题 2 的结果................................................. 117

7.2 流水线车间调度..................................................... 118

7.2.1 模型的数学表达............................................... 118

7.2.2 模型实现..................................................... 121

7.2.3 结果......................................................... 122

7.3 任务车间调度....................................................... 123

7.3.1 模型的数学表达............................................... 123

7.3.2 模型实现..................................................... 127

7.3.3 结果......................................................... 128

7.4 瓶颈机器上的任务排序............................................... 129

7.4.1 模型的数学表达............................................... 130

7.4.2 模型实现..................................................... 132

7.4.3 结果......................................................... 134

7.5 油画制造........................................................... 134

7.5.1 模型的数学表达............................................... 134

7.5.2 模型实现..................................................... 136

7.5.3 结果......................................................... 137

7.6 生产线平衡......................................................... 138

7.6.1 模型的数学表达............................................... 138

7.6.2 模型实现..................................................... 140

7.6.3 结果......................................................... 141

7.7 参考文献和进阶阅读................................................. 141

第8章 规划问题............................................................ 145

8.1 自行车生产规划..................................................... 145

8.1.1 模型的数学表达............................................... 145

8.1.2 模型实现..................................................... 146

8.1.3 结果......................................................... 148

8.2 玻璃杯生产......................................................... 148

8.2.1 模型的数学表达............................................... 149

8.2.2 模型实现..................................................... 151

Page 7: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

IV

8.2.3 结果......................................................... 152

8.3 物料需求规划....................................................... 153

8.3.1 模型的数学表达............................................... 154

8.3.2 模型实现..................................................... 155

8.3.3 结果......................................................... 157

8.4 电子元件生产规划................................................... 158

8.4.1 模型的数学表达............................................... 158

8.4.2 模型实现..................................................... 160

8.4.3 结果......................................................... 161

8.5 玻璃纤维生产规划................................................... 161

8.5.1 模型的数学表达............................................... 162

8.5.2 模型实现..................................................... 164

8.5.3 结果......................................................... 165

8.6 将生产任务分配到机器上............................................ 165

8.6.1 模型的数学表达............................................... 166

8.6.2 模型实现..................................................... 167

8.6.3 结果......................................................... 167

8.7 参考文献和进阶阅读................................................. 168

第9章 装载和切割问题...................................................... 171

9.1 货车载荷平衡....................................................... 171

9.1.1 模型的数学表达............................................... 172

9.1.2 模型实现..................................................... 173

9.1.3 结果......................................................... 176

9.2 驳船装载........................................................... 177

9.2.1 模型的数学表达............................................... 178

9.2.2 模型实现..................................................... 179

9.2.3 结果......................................................... 180

9.3 储存罐注液......................................................... 181

9.3.1 模型的数学表达............................................... 181

9.3.2 模型实现..................................................... 183

9.3.3 结果......................................................... 184

9.4 文件备份........................................................... 185

9.4.1 模型的数学表达............................................... 185

9.4.2 模型实现..................................................... 187

9.4.3 结果......................................................... 188

9.5 金属板切割......................................................... 189

9.5.1 模型的数学表达............................................... 189

9.5.2 模型实现..................................................... 190

9.5.3 结果......................................................... 191

9.6 切割用作课桌腿的铁棒............................................... 191

9.6.1 模型的数学表达............................................... 192

9.6.2 模型实现..................................................... 193

9.6.3 结果......................................................... 194

9.7 参考文献和进阶阅读................................................. 194

Page 8: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

V

第10章 陆路运输........................................................... 197

10.1 汽车租赁.......................................................... 197

10.1.1 模型的数学表达.............................................. 197

10.1.2 模型实现.................................................... 198

10.1.3 结果........................................................ 200

10.2 选择运输方式...................................................... 200

10.2.1 模型的数学表达.............................................. 200

10.2.2 模型实现.................................................... 203

10.2.3 结果........................................................ 205

10.2.4 扩展讨论.................................................... 206

10.3 仓库位置设置...................................................... 206

10.3.1 模型的数学表达.............................................. 207

10.3.2 模型实现.................................................... 208

10.3.3 结果........................................................ 210

10.4 燃油运输.......................................................... 210

10.4.1 模型的数学表达.............................................. 211

10.4.2 模型实现.................................................... 213

10.4.3 结果........................................................ 215

10.5 组合各种不同运输方式.............................................. 215

10.5.1 模型的数学表达.............................................. 216

10.5.2 模型实现.................................................... 217

10.5.3 结果........................................................ 218

10.6 货车车队规划...................................................... 218

10.6.1 模型的数学表达.............................................. 219

10.6.2 模型实现.................................................... 220

10.6.3 结果........................................................ 221

10.7 参考文献和进阶阅读................................................ 221

第11章 航空运输........................................................... 223

11.1 机场航班连接...................................................... 223

11.1.1 模型的数学表达.............................................. 224

11.1.2 模型实现.................................................... 224

11.1.3 结果........................................................ 225

11.2 机组人员组成...................................................... 225

11.2.1 模型的数学表达............................................. 226

11.2.2 模型实现.................................................... 227

11.2.3 结果........................................................ 229

11.3 航班降落调度...................................................... 230

11.3.1 模型的数学表达.............................................. 230

11.3.2 推广到任意类型的时间窗口.................................... 233

11.3.3 模型实现.................................................... 233

11.3.4 结果........................................................ 235

11.4 航空枢纽选择选址.................................................. 235

11.4.1 模型的数学表达.............................................. 236

11.4.2 模型实现.................................................... 237

Page 9: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

VI

11.4.3 修改后的模型表达............................................ 238

11.4.4 结果........................................................ 241

11.5 空运路线规划...................................................... 241

11.5.1 模型的数学表达.............................................. 241

11.5.2 模型实现与求解结果.......................................... 242

11.6 参考文献和进阶阅读................................................ 247

第12章 电信通讯问题....................................................... 249

12.1 网络可靠性....................................................... 249

12.1.1 模型的数学表达.............................................. 249

12.1.2 模型实现.................................................... 251

12.1.3 结果........................................................ 253

12.2 移动电话网络设计.................................................. 254

12.2.1 模型的数学表达......................................... 255

12.2.2 模型实现.................................................... 256

12.2.3 结果........................................................ 257

12.3 电话路由安排...................................................... 257

12.3.1 模型的数学表达.............................................. 258

12.3.2 模型实现.................................................... 260

12.3.3 结果........................................................ 262

12.4 有线网络建设...................................................... 262

12.4.1 模型的数学表达.............................................. 262

12.4.2 模型实现.................................................... 265

12.4.3 结果........................................................ 266

12.5 卫星通信调度...................................................... 267

12.5.1 模型的数学表达.............................................. 268

12.5.2 模型实现.................................................... 271

12.5.3 结果........................................................ 273

12.6 GSM 基站选址 ...................................................... 275

12.6.1 模型的数学表达.............................................. 276

12.6.2 模型实现.................................................... 277

12.6.3 结果........................................................ 278

12.7 参考文献和进阶阅读................................................ 278

第13章 经济和金融......................................................... 281

13.1 贷款选择.......................................................... 281

13.1.1 模型的数学表达.............................................. 281

13.1.2 模型实现.................................................... 283

13.1.3 结果........................................................ 283

13.2 广告宣传.......................................................... 284

13.2.1 模型的数学表达.............................................. 284

13.2.2 模型实现.................................................... 285

13.2.3 结果........................................................ 286

13.3 投资选择.......................................................... 286

13.3.1 模型的数学表达.............................................. 287

13.3.2 模型实现.................................................... 288

Page 10: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

VII

13.3.3 结果........................................................ 289

13.4 为提前退休计划筹集资金............................................ 290

13.4.1 模型的数学表达.............................................. 290

13.4.2 模型实现.................................................... 292

13.4.3 结果........................................................ 293

13.5 家庭预算.......................................................... 293

13.5.1 模型的数学表达.............................................. 293

13.5.2 模型实现.................................................... 294

13.5.3 结果........................................................ 295

13.6 发展计划选择 ...................................................... 295

13.6.1 模型的数学表达.............................................. 296

13.6.2 模型实现.................................................... 296

13.6.3 结果........................................................ 297

13.7 均方差投资方案选择................................................ 298

13.7.1 问题 1 的数学表达............................................ 298

13.7.2 问题 1 的模型实现............................................ 299

13.7.3 问题 1 的结果................................................ 300

13.7.4 问题 2 的数学表达............................................ 300

13.7.5 问题 2 的模型实现............................................ 300

13.7.6 问题 2 的结果................................................ 302

13.7.7 扩展讨论.................................................... 302

13.8 参考文献和进阶阅读................................................ 303

第14章 时间表制定与人员安排 ............................................... 303

14.1 为机器分配操作人员................................................ 304

14.1.1 模型的数学表达.............................................. 304

14.1.2 模型实现.................................................... 306

14.1.3 结果........................................................ 308

14.2 护士工作时间调度.................................................. 309

14.2.1 问题 1 的数学表达............................................ 309

14.2.2 问题 1 的程序实现............................................ 310

14.2.3 问题 1 的结果................................................ 311

14.2.4 问题 2 的数学表达............................................ 311

14.2.5 问题 2 的模型实现............................................ 312

14.2.6 问题 2 的结果................................................ 313

14.3 制定大学课表...................................................... 314

14.3.1 模型的数学表达.............................................. 314

14.3.2 模型实现.................................................... 316

14.3.3 结果........................................................ 317

14.4 考试日程安排...................................................... 318

14.4.1 模型的数学表达.............................................. 318

14.4.2 模型实现.................................................... 319

14.4.3 结果........................................................ 320

14.5 结合人员分配的生产规划............................................ 320

14.5.1 模型的数学表达.............................................. 321

Page 11: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

VIII

14.5.2 模型实现.................................................... 322

14.5.3 结果........................................................ 324

14.6 建筑工地上的人员规划.............................................. 324

14.6.1 模型的数学表达.............................................. 325

14.6.2 模型实现.................................................... 326

14.6.3 结果........................................................ 327

14.7 参考文献和进阶阅读................................................ 327

第15章 地方政府和公共服务部门 ............................................. 331

15.1 供水管理.......................................................... 331

15.1.1 模型的数学表达.............................................. 332

15.1.2 模型实现.................................................... 333

15.1.3 结果........................................................ 334

15.2 闭路电视监控...................................................... 335

15.2.1 模型的数学表达.............................................. 335

15.2.2 模型实现.................................................... 336

15.2.3 结果........................................................ 337

15.3 选区划分.......................................................... 338

15.3.1 模型的数学表达.............................................. 338

15.3.2 模型实现.................................................... 340

15.3.3 结果........................................................ 343

15.4 路面铺沙.......................................................... 343

15.4.1 模型的数学表达.............................................. 344

15.4.2 模型实现.................................................... 345

15.4.3 结果........................................................ 348

15.5 所得税交纳点选址.................................................. 349

15.5.1 模型的数学表达.............................................. 349

15.5.2 模型实现.................................................... 351

15.5.3 结果........................................................ 353

15.6 医院的工作效率.................................................... 353

15.6.1 模型的数学表达.............................................. 353

15.6.2 模型实现.................................................... 355

15.6.3 结果........................................................ 356

15.7 参考文献和进阶阅读................................................ 357

参考文献.................................................................. 359

Page 12: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

1

前言

在过去,许多学生都通过学习线性规划课程对优化有了一定的了解。但直到 近

为止,购置计算机的费用仍然十分昂贵,只有那些拥有功能强大的计算机的工业集团

和研究中心才能够使用软件进行优化。因此线性规划课程通常仅局限于使用图形方法

解决两个变量的问题,或使用著名的表格单纯型法来解决很小规模的问题。可以通过

手工求解的问题规模很少超过 6 到 8 个变量。由于缺少时间和无法使用软件对模型进

行验证,建模过程通常都被忽略。

出于学术远景考虑,目前线性规划课程仍然广泛教授。当然,在大多数课程中,

都将线性规划与一些其他的经典运筹学方法例如项目规划的 PERT(Program

Evaluation and Review Technique,计划评审技术)方法等联合教授。但除了少数

应用数学专业的学生学到了如何应用所学内容之外,大多数人收获并不大:他们不清

楚自己所学有何用途,也不知道目前已经存在一些可用的软件工具, 关键的是,他

们没有学到如何建模。

根据这样的观察,我们决定编写本书。目前个人计算机(PC)已经越发强大,用

于优化的数值方法也日益进步,线性/混合整数规划软件市场已经发生了变化。与

早期的产品(只面向专业人员的子程序库)相比,新一代的软件不再需要进行编程。

这些工具具有友善的用户界面,并且其语法也更为自然,十分接近数学方程式,这都

使这些工具十分易于使用。

在各种研究项目中(科学研究项目以及商业/经济项目等),使用了这样的工具之

后都可以观察到学生的兴趣和效率都有了显著的提高。借助这些工具,即使学生不具

有任何数学背景,他们也能够对相当规模的现实问题进行建模和求解,而不再会迷失

于纯理论的优化方法课程中。这些学生体会到掌握强大工具的满足感,并且对线性/

混合整数规划领域有了新的理解。在以后各自的工作中,他们可能会回忆起这些工具

的强大潜力,并根据自己所积累的经验,适时地使用这些工具。这就是我们在推广使

用数学规划的目标。

本书所面向的阅读群体是理工科和商业/经济学科的学生,以及希望学习线性/

混合整数规划方面的新知识,并希望将其应用于实际工作中的决策人员,专业人员,

以及技术人员。

本书的主要内容将集中于建模过程及应用实例,因此将只对线性/混合整数规划

的理论进行简要介绍,而不进行详细解释。我们也附上丰富的参考材料列表,并在文

中做出标记,读者可以就自己感兴趣的主题进行深入的阅读学习。

为避免内容枯燥无味脱离实际,本书中所选取的例子都来源于实际应用。尽管为

了方便初学者而对这些例子进行了一些简化,但大多数例子仍然足够复杂,无法通过

手工计算在纸面上求解,都需要建立具有一定复杂度的模型才能解决。

建立模型和求解问题所使用的软件是 Xpress-MP,可以从以下地址下载:

http://www.dashoptimization.com/applications_book.html

所下载的是免费版本,其能够求解的问题规模受限(但仍然足以求解本书中的例

Page 13: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

2

子)。因此读者不需要担心如何求解问题,从而可以将注意力集中于 高层的任务——

建模——之上(但这仍然需要一定的学习和训练)。使用此软件工具可以对模型进行

快速验证,能够立刻获得验证结果,更快速地发现模型中的错误,并且能够通过交互

修改问题参数来对问题进行仿真。

但本书的目的仍然是如何建模,而不是将读者变成 Xpress-MP 的专家。因此对每

个问题将首先创建数学模型,在此阶段将不考虑如何使用建模软件实现此模型。然后

再描述如何将模型实现为程序,并对其中使用到的程序语言特性进行解释, 后将给

出求解结果以及对结果的讨论。显然,数学模型和求解结果都与建模软件无关。所有

的 Xpress-MP 模型和数据文件都可以从 Dash Optimization 网站下载到,你可以使用

它们验证本文中的结果。你也可以采用其他的方法来实现这些数学模型。

本文中所列举的例子将根据线性/混合整数规划的应用领域进行分类。首先用几

章来介绍建模技术和 Xpress-MP 的使用,然后用十章的内容来分别介绍各种实例。每

一章都专门介绍一个不同的应用领域,且与其他章节相互独立。在每一章中,将总是

首先对所讨论的主题进行概要描述,然后是(平均)六个实际问题。在每一章 后都

有一小节专用于对本章内容进行总结,并提供附加的材料和参考文献。

第 6 章描述了混合问题或组分分离问题,这种类型的问题在采矿业和加工业中经

常出现。这些问题中很少出现整数变量,因此是 简单的问题,是初学者的 佳选择。

下面两章将介绍工业应用中的另外两大类重要问题,即调度问题(第 7 章)和生产规

划问题(第 8 章)。

在很多实际应用中,都需要使用物体来填充有限的空间(箱子,轮船货舱,计算

机磁盘空间等),或者相反,需要将材料切削为指定的形状而使削掉的废料 少。这

种类型的问题将是第 9章的主题,即装载和切削问题。

广义的流问题中包括许多有趣的优化问题。这种类型的问题将在三个有代表性的

应用领域中进行讨论:陆路运输(第 10 章),航空运输(第 11 章),以及飞速发展的

电信业(第 12 章)。有些问题可能会游移于这三章中,但另一些问题就有较为明确的

归属,例如在地面运输中车辆的巡游路线,机场的航班连接,以及电信业中与网络维

度和可靠性相关的所有问题等。

由于本书面向的读者群体不仅仅是科学家,实业家,以及物流人员,因此本书也

包含了数学规划的一些较偏僻的应用领域。第 13 章将介绍经济和金融领域中的问题。

第 14 章将介绍如何进行时间表制定以及人员安排问题。数学规划在政府部门,权力

部门,以及公共服务部门中也都能够找到用武之地。第 15 章将介绍这些领域中的六

个问题。

如何对问题进行分类一直是一个讨论的主题:理论研究者通常喜欢根据对应的理

论模型类型将问题进行分类。例如著名的流模型是一个经典模型,本书中的若干个问

题都与此模型有关(水路运输,陆路运输,电信业)。我们按照应用领域对这些问题

进行分类,从而使研究某一主题的学生或专业人员能够至少找到一章完整的内容对应

于自己所关心问题。但也没有完全放弃另一种分类方法:在每一章的 后都给出了在

本书的其他章中有哪些问题实例与本章的内容具有相同的理论类型。在实例部分开头

也给出了一份概览表格,在其中列出了所有模型及其对应的理论类型。

由于一些书目在多章中反复被引用,因此参考书目将在本书 后给出。然而,在

Page 14: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

3

每一章 后的一节,即“参考文献与进阶阅读”中,都将给出特定主题相关的参考阅

读书目。所列出的参考文献都经过精挑细选,其中包括入门的论文和阅读材料(有些

可能已经很老了)以及 近发表的文章,以介绍此学科的发展近况。

Xpress-MP 软件是近年来优化领域发展取得的进步之一。在 1960 年代和 1970 年

代出现的第一代软件工具需要用户以数值矩阵的形式输入问题,这种方法不具有直观

性,非常难以阅读,也难以修改。从 1980 年代开始,代数建模语言逐渐普及,使用

这些语言,用户可以写出非常接近于原代数表达式的线性优化程序。通过使用代数建

模语言,用户可以使用索引变量和数据矩阵来编写一般的模型。这意味着可以将模型

与数据分离开(分别保存在不同的文件中),并使模型与问题的大小无关。通过使用

这种高级语言,用户可以将注意力集中于建模中,减少了可能的错误来源,加速了模

型开发过程,并使以后阅读和修改此模型变得更加容易。

本书中所使用的建模和求解环境是 Xpress-Mosel[第 2 章],它是新一代的优化

工具:它能够提供代数建模语言的所有功能,同时也能够对问题进行求解。通过它的

编程工具,你可以同一个环境中实现数学模型以及启发式求解和数据预处理/后处理,

本书中所有应用实例(在不同的程度上)都将使用此工具来对问题进行描述和求解,

并显示结果。对于更高级的应用,此软件具有另一个令人感兴趣的功能,即 Mosel

的模块化设计允许你使用其他求解器,求解算法类型或数据来源。在本书中,由于我

们只使用了一个求解器,即 Xpress-Optimizer,来对线性/混合整数和二次规划进行

求解,因此未使用到此功能。

若在 Microsoft Windows 环境下使用 Mosel 模型,则可以使用 Xpress-IVE 图形

用户界面。在此界面中提供了调试功能,使你能够了解关于此问题以及求解过程的其

他信息,并允许用户以图形形式显示求解结果。在所有支持的操作系统上,Mosel 默

认都使用命令行解释器进行工作,此解释器将接收标准文本文件程序输入。

现有的书籍中只有很少几本与本书的目的类似:Williams 所编写的一本书的第 3

版[Wil93]中给出了 20 个实例分析,并用 Xpress-MP 实现了这些实例。这些实例分析

很适合作为学生研究计划,每个实例都需要若干天的工作。但很不幸的是,这本书只

包含了很少几个应用领域。Schrage 也就 Lindo 软件编写了一本著作[Sch97]。在该

书中给出了更多的应用实例,但这些实例按照理论模型来进行分类。所给出的问题都

直接使用软件进行实现,而没有先进行建模。

与上述两本著作相比,本书中包含了大量的应用实例(60 个),并且这些实例将

按照应用领域进行分类。尽管所有的模型都将使用 Xpress-MP 来进行实现,但都首先

使用数学语法对每个问题进行建模,从而使得可以对此模型进行不同的 终实现。

后,由于我们采用了一般的建模方法( 大流, 小费用流,分配问题,运输问题,

旅行商问题等),因此在处理类似的问题时,或较大规模的实例时,可以重用本书中

给出的许多模型。

在以下地址可以找到本书的更新:

http://www.dashoptimization.com/applications_book.html

我们建议你定期到此地址检查更新。

EC Framework 5 的 LISCOS 项目(合同号 G1RD-1999-00034)为本书提供了部分

资金支持,对此我们表示衷心感谢。

Page 15: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

4

此外我们还要特别对 Yves Colombani 进行感谢,感谢他设计和实现了 Mosel 语

言。如果没有他的远见卓识,Mosel 不可能成为今日这样的一个强大而开放的软件。

Page 16: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

5

预备知识

在阅读本书前你需要了解

在阅读本书之前,你应习惯使用例如 x 或 y 这样的符号来代表未知数值,以及在

简单的线性等式和不等式中使用这些变量,例如:

6≤+ yx

学习数学或线性规划方面的基础课程会对你有很大帮助,但并不强求如此。同样,

熟悉计算机的使用也会对你有很大帮助。

对于除了 简单模型之外的大多数模型,你也应理解对变量在一定范围内进行求

和的概念。例如,如果 jproduce 表示生产线 j 上生产的汽车数目,则在所有 N 条生

产线上生产的汽车数目总和可以写成:

∑=

N

jjproduce

1

这表示“对从 1=j 到 Nj = 的所有生产线 jproduce 上生产的汽车总数进行求

和”。

如果我们的目标是生产至少 1000 辆汽车,则此表述可以写为如下不等式:

10001

≥∑=

N

jjproduce

我们通常在求和时使用集合符号来进行表示求和的范围。假定 LINES 表示生产

线的集合{ }N,...,1 ,

则可以将上述不等式写成下面的形式: .

1000≥∑∈LINESj

jproduce

这个不等式可以读作“对于所有属于集合 LINES 的生产线 j 上生产的汽车总数

进行求和”。

在文中经常使用到的其他数学符号有 N(非负整数集合{ },...2,1,0 ),I和U(求

集合交集和并集运算),∧和∨(逻辑与和逻辑或运算),∀(读作对于任意),以及

Page 17: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

6

∃(读作存在)。

计算机建模语言,特别是我们所使用的 Mosel 语言,十分接近于分析师在描述问

题时所使用的数学表达式。因此如果你能够熟练使用上述的数学表达式,那么就学习

使用建模语言就变得很简单。

符号和约定

在本书中我们使用下面这些约定:

♦ 数学对象用斜体表示。

♦ 命令示例,模型,以及模型输出用楷体表示。文件名也用楷体表示。

♦ 决策变量名用小写字母表示;在应用实例中决策变量通常为动词(例如

buy,make)。

♦ 约束变量名用大写英文字母开头,后面大多为小写字母(例如 Profit,TotalCost)。

♦ 数据(矩阵和集合)和常数完全用大写英文字母(例如 DEM,JOBS,PRICE)。

♦ 在许多键盘上标出的垂直线“|”中间都略微断开,但在屏幕上显示时经常会

没有断开。在 UNIX 中,此符号表示管道符。(注意此符号与有时在 PC 屏

幕上用于绘制表格的符号不同。)“|”符号的 ASCII 十六进制编码为 7C,十进制编码为 124。

Page 18: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

7

第 1 部分 开发线性和整数规划模型

Page 19: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

8

第 1 章 什么是建模? 为什么要使用模型?

我们将首先研究一个小制造商所面临的问题,并思考应如何解决这个问题,以此

作为本章的开端,而不是就什么是模型进行理论概述。在获得了一些实际建模经验之

后,我们将回头了解建模拥有怎样的优点。

第 1.1 节中对此问题进行了语言描述,并将它转化为数学形式。然后我们将在

1.2 节中定义什么是线性规划(Linear Program),并看到此问题符合线性规划的标准。

在 1.3 节中,将使用 Mosel 来实现此问题,并使用 Xpress-Optimizer 对其进行求解。

在对结果的讨论中,将用图形显示出解决方案信息,解决方案将由求解器求出。在建

模和求解线性问题过程中,要注意的重要问题是解是否存在和是否有界(第 1.4 节)。

在本章的结尾,将对建模和优化的优点进行回顾(1.5 节),并将看到数据的重要性

(1.6 节)。

1.1 棋子问题:描述

有一个木匠作坊制作两种不同大小的黄杨木棋子。小型棋子一套需要车床加工 3小时,大型棋子一套需要 2 小时。木匠作坊内有 4 个车床和 4 名熟练操作员,每人

每周工作 40 小时,因此每周车床总工时数为 160 小时。小型棋子一套需要 1 千克黄

杨木,大型棋子一套需要 3 千克黄杨木。很不幸的是,黄杨木现在很稀缺,每周只

能得到 200 千克。

如果售出,每套大型棋子能够得到 20 元利润,每套小型棋子能够得到 5 元利润。

问题是:每周应分别加工每种棋子多少套才能得到 多的利润。

1.1.1 第一个模型表达

在条件限定范围内,作坊主可以改变每种棋子生产的套数:因此在我们的模型中

有两个决策变量(decision variable),每种产品即对应一个决策变量。我们希望找到

这些决策变量的 优值,“ 优”表示得到的利润 多。我们将这些变量简称为:

xs :制造的小型棋子套数。

xl :制造的大型棋子套数。

将通过优化来求解出 大利润所对应的小型和大型棋子生产套数。也就是说,我

们希望优化器能够告诉我们 xs 和 xl 的 优值。

xs 和 xl 的取值将受到一些物理或技术条件约束。在创建模型时的主要任务之一

是以正式的形式写出决定系统行为的约束条件。在我们这个例子中,我们可以注意到

Page 20: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

9

木匠作坊每周机器总工时数为 160 小时。生产一套小型棋子需要三个小时,生产一

套大型棋子需要两个小时。因此如果在一周种我们希望生产 xs 套小型棋子和 xl 套大

型棋子,则我们要使用的总机器工时数为:

xlxs ⋅+⋅ 23

其中 xs⋅3 对应于加工小型棋子的时间, xl⋅2 对应于加工大型棋子的时间。

注意,在这里我们已经进行了一些假定。首先我们假定加工 xs 套小型棋子所需

的车床工时精确等于加工一套小型棋子所需工时的 xs 倍。在实际生产过程中可能并

不是这样——在多次进行同一任务之后,操作者可能会变得更加熟练,从而使平均消

耗的时间略低于预计一次任务所需的时间。但在我们的小型木匠作坊中这一点不会有

很重大的影响。

我们做出的第二个假定更有可能使模型不精确。我们假定加工小型棋子和大型棋

子的总时间等于它们各自的加工时间之和。这样我们就没有考虑到生产转换所需的时

间:重新设置车床,进行清理,获得不同大小的工具,等等。在一些情况下,相对于

实际的生产时间来说,生产转换过程消耗的时间可能无法忽略,因此需要采用更加复

杂的模型。但目前我们仍然假定生产转换的时间可以忽略。

这样我们的第一个约束条件是:

16023 ≤⋅+⋅ xlxs (车床工时)

即表示“我们计划使用的时间长度必须小于或等于可用的时间长度”,也可以说“我们无法使用超出目前可用部分的资源(时间)”。大型棋子和小型棋子的合理组合应

受到此条件的约束,以便使总加工时间不超过可用的总车床工时。

此外,每周只有 200 千克的黄杨木可以使用。由于小型棋子每套消耗 1 千克黄

杨木,而大型棋子每套消耗 3 千克黄杨木,因此第二个约束条件为:

20031 ≤⋅+⋅ xlxs (千克黄杨木)

上面这个不等式的左边是我们计划使用的黄杨木质量千克数,右边是可以提供的

黄杨木质量千克数。

木匠作坊中不可能生产出负数目的棋子,因此还有两个非负约束,它们是:

00

≥≥

xlxs

用类似的方法,我们可以写出总利润的表达式。每套大型棋子出售后可以获得

20 元利润,每套小型棋子出售后可以获得 5 元利润。假定所有制造出的棋子都可以

成功售出(注意这个假定在现实中不一定合理),则总利润就是制造和售出 xs 套小型

棋子和 xl 套大型棋子获得的利润之和。

xlxsofitPr ⋅+⋅= 205

ofitPr 就是目标函数(Object function),即一个需要被优化( 大化)的线性

Page 21: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

10

函数。在这个例子中,此函数与所有决策变量都相关,但有时候此函数也会只涉及部

分决策变量。注意,由于 ofitPr 是决策变量的函数,因此可以将它视为一个因变量

(dependent variable)。在 大化问题中,目标函数通常是利润,营业额,产出,销

售额,市场份额,就业率,或其他正面的参数等。在 小化问题中,目标函数通常为

总支出,由于故障引起的服务中断,或其他不希望看到的情形等。

考虑 xs 和 xl 的一些可行值(表 1.1)。木匠作坊的目标是 大化利润,但是我们

无法选择那些使用资源超出我们所拥有资源的 xs 和 xl 。如果我们计划使用的资源超

出可用资源量,则称此计划与约束条件冲突,如果有一个或多个约束条件与计划冲突,

则此计划不可行(infeasible)。如果没有约束冲突,则此计划可行(feasible)。在此

表格中名为“OK”的列即标明了计划是否可行。

单从利润来看,计划 H 看上去不错。但它是否是 佳的计划?是否还存在我们

未考虑到的计划,能够让我们得到比 1320 还高的利润?为了回答这一问题,我们必

须先了解优化(optimization)的概念。

表格 1.1: xs 和 xl 的取值

xs xl 车床工时 材料用量 OK? 利润 备注

A 0 0 0 0 是 0 没有利润!

B 10 10 50 40 是 250 利润太低。

C -10 10 -10 20 否 150 小型棋子数目为负值。

D 53 0 159 53 是 265 使用了全部的车床工时,但

黄杨木材料有剩余。

E 50 20 190 110 否 650 使用的车床工时数超出可以

提供数。

F 25 30 135 115 是 725 车床工时和黄杨木材料均有

剩余。

G 12 62 160 198 是 1300 使用了所有资源。

H 0 66 130 198 是 1320 看上去不错。资源有剩余。

1.2 线性规划

我们已经为木匠作坊的决策过程建立了一个模型。我们已经找出了木匠需要做出

的决策(每种类型的棋子各生产多少套),并将目标设置为使利润 大化。此外也对

决策变量的各种约束条件进行了分析。我们首先对决策变量进行命名,然后使用这些

变量写出约束条件和目标函数。

与此同时我们也进行了各种显式或隐式的假定。我们显式作出的假定是:

♦ 对于每种大小的棋子,总生产时间与所需生产的棋子套数成正比。

♦ 在切换生产不同大小的棋子时不存在由于设备重新调整等带来的额外时间

支出。

♦ 生产出的所有棋子都能够售出。

我们也作出了许多隐含的假定。例如,我们假定车床不会损坏或卡死,假定车床

Page 22: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

11

的操作员每天都会来上班;假定黄杨木不存在任何可能导致原料不可用或生产出的棋

子质量不满足要求的瑕疵;假定我们不需要降低价格(从而使单位产品利润也降低)

来得到订单,等等。我们也没有讨论只生产了部分的一套棋子是否有价值——它们是

否完全没有意义,还是可以在下周继续将这套棋子制造完成。

在所有的数学模型中,我们都对所试图描述的现实进行了一定程度的简化。有些

假定和简化看起来非常合理(例如,将每种大小的棋子的利润相加得到总利润);另

一些假定在一些情况下只能是我们期望达到的目标(例如在切换生产不同大小的棋子

时不需要花费额外的时间),而另一些假定则似乎很难实现(例如在世界杯决赛第二

天指望所有车床操作员都能够按时来上班)。

建模是一项艺术,而不是精确的科学。不同的建模人员会做出不同的假定,并得

到不同精度的模型,这些模型规模大小不同,具有不同数目的决策变量。在进行建模

的同时,建模人员需要思考是否能够对得到的模型进行求解,即找到目标函数的 大

值和 小值,以及在达到此值时决策变量的取值。

许多模型都可以转化为线性规划模型的形式,很幸运是,即使是很大规模的线性

规划(LP)模型也能够在不甚昂贵的计算机上在可以接受的时间内进行求解。本书

的目的不是深入讨论如何求解线性规划问题,但我们可以假定具有数万个变量和约束

条件的问题都能够轻易得到解答,这不会带来任何危险。因此,如果你可以不采用太

多太过分的假设就将所面临的现实情况建模为线性规划模型,那么你就应该知道你能

够得到解决方案。

因此下面我们需要看看线性规划问题中都包含什么。为此,我们首先介绍线性表

达式(linear expression)的定义。线性表达式是如下形式的表达式:

nN xAx.AxAxA ⋅+++⋅+⋅ K332211

此表达式通常可以写为:

∑=

⋅N

jjj xA

1

其中 NA,,A K1 是常数, Nx,,x K1 是决策变量。因此,如果变量为 x , Pmake ,

和 Qmake ,则

QP makemakex ⋅+⋅−⋅ 432

是一个线性表达式,但是

QPP makemakemakex ⋅+⋅−⋅⋅ 432

不是线性表达式,这是由于其中的第一项包含两个变量的乘积。下面我们将引入

线性不等式(linear inequity)和线性方程(linear equation)的概念。对于任意的线

性表达式∑ =⋅

N

j jj xA1

,以及任意常量 B ,不等式

BxAN

j jj ≤⋅∑ =1和 BxAN

j jj ≥⋅∑ =1

Page 23: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

12

是线性不等式,等式

BxAN

j jj =⋅∑ =1

是线性方程。因此例如我们的车床工时约束条件 16023 ≤⋅+⋅ xlxs

就是一个线性不等式,而

20032 =⋅+⋅⋅ xsxlxs 不是线性方程,这是由于其中的第一项是两个决策变量的乘积。现在,如果我们

有决策变量为

Nx,,x,x,x K321

线性表达式

NN xCxCxCxC ⋅++⋅+⋅+⋅ K332211

以及一组线性不等式和线性方程

iNiNiii BxAxAxAxA ≤⋅++⋅+⋅+⋅ K332211 , 11 M,,i K=

iNiNiii BxAxAxAxA =⋅++⋅+⋅+⋅ K332211 , 21 1 M,,Mi K+=

iNiNiii BxAxAxAxA ≥⋅++⋅+⋅+⋅ K332211 , 32 1 M,,Mi K+=

则下面这个问题就是一个线性规划问题:

maximize 或 minimize ∑=

⋅N

jijj xC (目标函数)

subject to i

N

jjij BxA ≤⋅∑

=1, 11 M,,i K=

i

N

jjij BxA =⋅∑

=1, 21 1 M,,Mi K+=

i

N

jjij BxA ≥⋅∑

=1, 32 1 M,,Mi K+=

且对于所有 N,,j K1= 有 0≥jx (非负约束条件)

maximize 即使目标函数 大化,minimize 即使目标函数 小化,subject to 即

表示“在满足这些约束条件的情况下”。 iB 通常称为右手侧(RHS,right hand side)。

因此,棋子问题就是一个线性规划问题,它的变量为 xs 和 xl ,并且需要

maximize xlxs ⋅+⋅ 205

Page 24: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

13

subject to 16023 ≤⋅+⋅ xlxs (车床工时) 20031 ≤⋅+⋅ xlxs (黄杨木用量)

0≥xs 0≥xl

我们已经强调了线性条件,即目标函数和所有约束条件都必须与决策变量成线性

关系。但是我们还需要两个其他属性,即可分割性(divisibility)和确定性

(determinism)。

可分割性(divisibility)表示在一个可以接受的解决方案中,只要决策变量取值

满足线性约束条件的限制,则允许取此值。特别地,对于部分或所有决策变量,我们

并不限于只接受整数值。在上面我们已经提到了这一点,我们提到部分完成的一套棋

子是否有价值(或更精确地说,一套棋子的 f 部分的价值是否等于整套棋子价值乘

以 f )。

线性规划问题的 后一个要求是它必须是确定的(deterministic),即在目标函

数中的所有系数的值都必须明确了解。在一些情况下,确定性是很强的假定,尤其在

建筑规划模型中,因为这种模型在将来可能还会进行扩展。例如,假定油轮从波斯湾

地区出发抵达炼油厂总是需要 7.5 天是否合理?或者假定下周所有车床操作员每天

都会来上班是否合理?

如果在问题中我们必须考虑目标函数的系数的不确定性,或约束条件中右手侧或

系数的不确定性,那么这样的问题就是随机规划(stochastic programming)问题。

在本书中将不研究这种类型的问题,原因是由于它们较难以解决,而不是由于它们没

有实用价值。实际上,可以说所有规划模型中都有随机元素,我们将在稍候介绍一些

在线性规划框架中处理不确定性的方法。

1.3 求解棋子问题

1.3.1 创建模型

使用 Mosel 来求解棋子问题非常简单。在下一章中我们将对 Mosel 进行详细讨

论,然后 Mosel 的使用将贯串全书。在此我们先给出 Mosel 模型,以让你看到我们

所建模的问题的解。

第一步是将我们所创建的模型转化为 Mosel 程序。下面是程序清单。

Page 25: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

14

表格 1.2:棋子模型

备注

model chess

uses “mmxprs” ! 使用 Xpress-MP Optimizer

declarations

xs, xl: mpvar ! 变量声明

end-declarations

Profit := 5*xs + 20*xl

Boxwood := 1*xs + 3*xl <= 200 ! 黄杨木千克数

Lathe := 3*xs + 2*xl <= 160 ! 机床工时数

maximize(Profit)

writeln(“LP Solution:”)

writeln(“ Objective: ”, getobjval)

writeln(“Make ”, getsol(xs), “ small sets”)

writeln(“Make ”, getsol(xl), “ large sets”)

end-model

1

2

3

4

5

6

在创建数学模型时,我们使用的斜体符号表示数值变量(例如, xs )。对应的

Mosel 决策变量与此数值变量名称相同,但不是斜体(例如,xs)。

在定义了模型之后,就可以对目标函数进行优化,并求得棋子套数的 优值。

注意,符号“*”表示决策变量与相关常数之间相乘。建模语言将自动去掉空格,

并且将区分大小写,因此 Xl 与 xl 将被认为是两个不同的变量。

除非特别说明,Mosel 默认认为所有变量都为非负值,因此不需要为变量指定非

负约束条件。你也可以告诉 Mosel 变量不是非负值。我们在稍候将了解如何进行具

体操作。

下面是将对模型中一些不能一目了然的部分进行解释。这些解释将按照表 1.2 中

列出的模型代码编号给出。这些注解在稍后都将仔细解释,因此如果现在你对其中的

一些不甚清楚,也不需要太在意。

1 和 7:对模型进行命名。end-model 语句将结束此模型。

2:告诉 Mosel 我们将使用 Xpress-Optimizer 优化器来对问题进行求解。

3:我们将各种棋子的制造数目声明为决策变量,即 Mosel 的 mpvar 变量。

4:给出了目标函数和约束条件。

5:告诉 Mosel 使目标函数 Profit 大化。

6:这部分将输出求得的解。getobjval 函数返回目标函数的 优值,getsol(x)返回对应于 优值的变量 x 值。

Page 26: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

15

1.3.2 结果

我们稍后再介绍如何运行 Mosel 模型。这里我们先给出输出结果:

LP Solution: Objective: 1333.33 Make 0 small sets Make 66.6667 large sets

原始模型为:

maximize xlxs ⋅+⋅ 205 subject to 16023 ≤⋅+⋅ xlxs (车床工时)

20031 ≤⋅+⋅ xlxs (黄杨木用量) 0≥xs 0≥xl

我们可以对答案进行检查。Mosel 告诉我们 优解中 xl 是唯一的非零变量,其

值为 66.6667。则利润为 20×66.6667 = 1333.33。很容易看到,所使用的黄杨木质

量千克数为 3×66.6667 = 200,等于可用的黄杨木质量;车床工时为 2×66.6667 = 133.3333,比可用时间少 66.6667 小时;并且满足非负约束条件。

注意,车床工时数并未用尽,但黄杨木已经用尽了。

可以将此问题的解答用图示表示,如图 1.1,灰色阴影区域即为可行区域(feasible

region)。目标函数 ofitPr 的取值用点划线表示。

图 1.1:棋子问题的解

如果希望对此问题的解答进行更深入的分析,则我们希望找到约束活动以及它们

的对偶值(影子价格,shadow price),以及决策变量的即约代价(reduced cost)。为此需要在 Mosel 模型中加入如下语句:

Page 27: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

16

writeln("Activities/Dual Values") writeln(" Lathe: ", getact(Lathe)," / ", getdual(Lathe)) writeln(" Boxwood: ", getact(Boxwood)," / ", getdual(Boxwood)) writeln("Reduced Costs") writeln(" xs: ", getrcost(xs))writeln(" xl: ", getrcost(xl))

则输出变为:

LP Solution: Objective: 1333.33 Make 0 small sets Make 66.6667 large sets

Activities/Dual Values Lathe: 133.333 / 0 Boxwood: 200 / 6.66667

Reduced Costs xs: -1.66667 xl: 0

约束条件的活动值(activity)指对其左手侧(与决策变量相关的所有项之和)

的取值。 佳解决方案只使用了 133.333 个车床工时,但使用了所有可用的 200 千

克黄杨木。由于 160 个可用的车床工时是 4 台车床每台每周工作 40 小时得到的结果,

因此我们可以将每周工时缩短为 35 小时(总工时为 4×35 = 140 小时),而不会使结

果发生变化(图 1.2)。

图 1.2:降低车床工时之后

如果修改了可用的黄杨木数量,则将会对解决方案立刻产生影响:黄杨木约束条

件的对偶值(dual value,也称为影子价格,shadow price)是 6.66667,它表示增

加 1 个单位(1 千克)的黄杨木将使目标函数值增加 6.66667,使总利润达到 1340元。此效果可以用如图 1.3 表示。

Page 28: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

17

变量的即约代价(reduced cost)表明增加生产每种类型的一套棋子需要多少耗

费。如果我们决定再生产一套小型棋子,则其耗费的价值比售出后带来的利润多

1.66667(按资源耗费折算)。换句话说,需要将小型棋子的售价提高 1.66667 元才

能使它与大型棋子的利润率相同。图 1.4 中显示了将小型棋子的售价提高到 6.66667元(收支相抵点,break-even point)之后对此解决方案将会带来的影响:在可行区

域的高亮边上的所有点都能够达到相同的目标函数值 1333.33,因此我们可以生产一

套小型棋子,而保持相同的利润。

图 1.3:增加一个单位的黄杨木

图 1.4:将小型棋子价格提高至收支相抵点

Page 29: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

18

1.3.3 可分割性

在这个例子中,我们要面对前面提到的可分割性(divisibility)问题。在现实世

界中,小数解是可以接受的,在一周内未完工的一套棋子可以在下周继续完成。然而,

在一些优化问题中不允许变量是小数或分数。在处理这样的问题时,需要使用稍后将

要介绍的混合整数规划方法(第 3 章)。

1.3.4 无界和不可行

尽管对于上面这个问题我们已经找到了一个 优解,但并不总是能够找到 优

解。如果约束条件不足,则目标函数可能总是能够找到更好的值,即找不到 优的值。

这种情况下,称此问题无界(unbounded)。这种情况通常意味着在问题模型中忽略

了某个相关的约束条件,或数据有错误,而不是说拥有无限的资源和利润。反之,如

果约束条件的限定性过强,则可能无法找到任何满足所有约束条件的决策变量值。此

时,称此问题不可行(infeasible)。在前面的棋子问题中,如果要求每周生产 100 套

大型棋子,则会出现问题不可行的情况。

1.4 处理不可行性和无界性

在构建线性规划模型时,一个 常见但又 不希望发生的情况就是求解器称解决

方案无界(unbounded)或不可行(infeasible),这二者都表示我们在建模过程中有

错误发生,或我们向模型输入的数据有错误。

我们首先来处理无界性(unboundedness)。在 大化问题中,如果有无界性,

则表示我们可以不受约束地提高利润,从而得到无限的利润。这时你要做的不是立刻

退休,买游艇,然后去晒日光浴,而是要停下来,想到在实践中不可能出现利润无限

的情况——因此我们肯定弄错了什么。产生无界性的原因通常是忘记了某个约束条

件,或在目标函数中将某一项的表示成本的系数错误输入成了表示利润的系数。线性

规划求解器将告诉你哪个决策变量能够无限提高从而使理论上能够得到无限的利润,

因此你可以很容易地找出这个错误并进行纠正。你要做的就是找到这个变量,并看看

现实世界中什么因素使这个变量不会无限增长。然后你就可以在模型中加入这个被忽

略的约束条件,并重试再次求解。使用这种方法,你在实践中可以非常容易地对无界

性进行处理。

但不幸的是,处理不可行性(infeasibility)就不那么容易了,在存在不可行性时,

无法找到一组能够同时满足所有约束条件的决策变量值。与无界性不同,在计划制定

过程中,当计划制定者对可用资源,市场需求等进行假定时,很可能出现不可行性。

如果是在对现有的系统进行优化,且通过观察我们已经了解到此系统具有可行的

解,则对不可行性进行处理就简单了一些。将我们当前正在使用的决策变量代入线性

规划问题中。将变量作为固定变量输入。然后查看哪些约束条件产生冲突。这些约束

条件可能被错误建模了。例如,如果我们知道今天我们能够生产一定数量的 60 瓦和

100 瓦电灯泡,但模型告诉我们与某个生产约束条件发生冲突,则此约束条件就是被

错误建模的约束条件,此时我们即应将注意力集中在模型的这个部分。

Page 30: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

19

如果我们没有这样一组现实可行的值,则这个问题要难得多。在处理不可行的问

题时,新手会问“哪个约束条件错了?”或者“是哪个约束条件是引起了不可行性?”。

这样的问题没有答案,只能告诉新手是约束条件的组合引起了不可行性,或者换句话

说,约束条件的组合中发生矛盾。考虑下面这个问题:

10432

321

3

2

1

≥++≤≤≤

makemakemakemakemakemake

很明显这些约束条件是自相矛盾的(将前三个不等式加起来,然后与 后一个比

较),但如果不了解这个模型的现实意义,那么就不可能找出哪个约束条件(甚至四

个全部)存在错误。我们知道的只是当这四个约束条件放在一起时,它们就发生自相

矛盾。

在实践中,如果能将那些放在一起时发生相互冲突,但去掉其中任意一个后冲突

就消失的约束条件从模型中分离出来,那么就会带来很大帮助。这组约束条件称为不

可消减的不可行集(IIS,Irreducible Infeasible Sets),较好的线性规划求解器能够

为不可行的问题输出此集合。本章将不讨论如何得到 IIS,若需了解详细信息,我们

推荐你查看 Xpress-MP 手册了解详细信息。

必须承认,处理不可行性是建模过程中 难的问题,即使 有经验的分析师在看

见优化系统输出“问题不可行”这样的结果时,也只能一声长叹。由于导致不可行性

的原因可能是模型错误或数据错误,因此没有明确的错误排查首选项。经验丰富的建

模人员当然明白 可能出错的东西是数据,但即使他们有时也会发生错误。

但也有一点让人欣慰的是,不可行性与目标函数无关,只受约束条件影响。

下面是在遇到不可行问题时你应查看的一些事项:

是否对约束条件有正确的认识?(例如,你可能输入了一个≥约束条件,而实际

上应输入≤,或者在应使用不等条件时使用了相等条件。)

是否为流变量设置了正确的流方向(请参考 2.2 节)?(在流平衡约束条件中很

容易弄错符号。)

对资源可用性是否设置了非 0 值?(如果忘了对资源可用性设置值,那么会使

用默认的零值,如果此值位于右手侧,则通常会引起不可行性。)

1.5 建模和优化带来的收益

在讨论了一些较为技术性的内容之后,我们再回头对建模和优化及其能够带来的

收益进行思考。但首先我们将讨论为何实践中的确存在我们目前所讨论的理想过程。

创建模型,运行模型,然后将得到的答案应用于实践,这并不总是一个一次性的

过程。在前面已经提到过了,我们在建模时经常会发生一些错误,这些错误通常只能

够通过优化来找到,例如输出错误信息(如无界或不可行),或结果不符合常识。如

果发生这种情况,则我们需要对模型进行更深入的思考,并对模型进行调整修改,重

Page 31: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

20

新得到新的解,并对 优解进行深入分析,这是一个迭代的过程。在此过程中,很可

能需要加入新的约束条件,去掉那些错误加入的约束条件,更正错误的数据,或甚至

被迫再去收集那些之前没有考虑到的但又必需的数据。

图 1.5:典型优化项目的简化流程

数据精确性和一致性经常是 棘手的问题。模型总是试图反映出来自机构中各个

方面的约束条件,因此需要使用来自机构各处的各种数据,而机构的各个不同部分之

间可能没有进行沟通。因此这些数据可能是采用不同方法收集到的,可能各自符合不

同的标准,基于不同的假定。而优化过程的目的是找到存在的 极端的解答,因此将

对数据的精确性带来很大考验。尽管建模者会尝试使用机构中已有的数据,但已有的

数据在一些时候不能满足需要,因此仍然需要建模者亲身去收集基本数据。

尽管在上面的讨论中我们列出了一系列问题,但对建模和优化过程的进一步思考

发现,建模过程所需要的深入思考和严密分析实际上是它的优点之一。模型先天具有

集成化的特点,因此要求我们的数据满足同一个标准,具有相同的精确度,这也是任

何机构中应该努力实现的目标。

当然,建模和优化带来的 明显收益是我们能够得到一个推荐解,使用此解能够

让我们以 佳的方式运行我们所建模的系统。我们也可以选择不使用推荐解,实际上

这样做的确有充足的原因。例如,准备明天实施的计划所能实现的目标函数值可能与

今天已经采取的计划几乎完全相同,但二者所采取的具体操作非常不同。此时为了让

工作具有延续性,可以放弃一小部分利润,而继续采取今天的方案。然而,关于量化

模型的重要一点是,我们了解将来能够得到多少利润,从而能够利用充足的信息做出

理性的决策,而不是依靠灵机一动或直觉。我们可以了解数据变化将会对我们的解决

方案带来怎样的影响,从而能够找到鲁棒的解决方案,使得在输入数据发生变化时仍

然能够得到较好的输出结果。

建模能够带来的 后一个主要收益是,通过建模,我们能够更量化,更清晰理性

地理解我们所研究的机构或系统的整体或其中的一个部分,而不用考虑组织内的政

治。这种理解将能够引导我们思考以前从未想过的工作和处理方式,而这又可能使效

率和盈利能力得到显著的提高。在我们开始考虑增强后的系统,或开始思考系统在未

来的进化之后,模型的边界即随之扩张。

关于模型可以确定的一点是,随着模型创建和开发过程,模型的大小将不断增长。

在个人计算机刚出现时,线性规划模型的决策变量如果达到 1000 或 2000 个,那么

这个模型就相当庞大了,实际上可能无法在个人计算机上求解。但现在这个规模的模

型只能算是小型模型,数百到数千倍其规模的模型现在也能正常求解。模型规模的增

长并不全是来自典型模型边界的扩张,而更主要来自于将模型分解为子集,如机器,

产品,时间段,客户区域,人力资源等等,然后进行求解的能力。

描述 建模

分析

求解

应用

Page 32: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

21

模型的规模将继续增长,但必须承认模型带来的收益并不随着模型的规模成比例

增长——较小的模型如果把握住决策问题的精髓所在,那么它能够比那些将各个因素

都分解得极为详细的庞大模型能够给你带来更加深邃的洞察。

1.6 模型中的数据

本书的主要内容是关于如何构建清晰,精确,可维护的模型,但我们应首先暂停

一下,讨论一下模型中将要用到的数据。

模型的重要特性之一就是它们通常将机构的不同部分联系到一起,以便得到全局

的 优解决方案。这样带来的结果之一就是模型通常需要使用来自多个不同来源的数

据,因此有必要要求这些数据源都具有相似可比的精确性。如果成本数据的核算就很

不精确,那么对一些工程数据要求 6 位有效数字也就没有什么意义。实际上成功建

模的主要障碍之一就是许多机构都盲信自己的会计数据是精确的,但实际上很多成本

会计数据都来自于十分值得置疑的假定。

经验丰富的建模者在项目开始阶段都不会过于相信数据。优化的根本目的是找到

极端的解决方案,因此对数据的精确性是一个考验。在实践中经常会发现原始的数据

不满足要求,无法使用,因此需要开展一些小规模的调查研究,以便得到更高质量的

数据。

然而也存在过于强调数据精确的必要性的危险,我们也应考虑到数据内部的一致

性。举一个有些极端的例子,如果模型中的所有成本都被低估了 50%,那么就不会

给我们的优化策略(即决策变量的 优值)带来什么影响。目标函数的值当然是错误

的,但我们采取的措施可能是正确的。但如果有些数据来源较为精确,而另一些数据

来源总是有一些固定的偏差,那么就会出现问题了。

如果有可能,应尽量采取下面的做法:

♦ 使用原始格式的数据,而不是将数据组合或分解。

♦ 直接从数据所有者那里取得数据,即从负责收集数据并保持数据精确性的人

那里得到数据。

这些数据通常都保存在电子表格或数据库系统中,因此高质量的建模系统应能够

连接到常用的电子表格或数据库系统。这样就可以从原始来源取得数据,从而降低了

使用陈旧信息的危险性。

在线性规划建模中数据收集扮演着十分重要的角色。有些时候建模者很幸运,建

模所需的数据都能够迅速得到。有些时候在机构中没有所要求精度的数据,由于收集

一手数据所需的时间和成本过于昂贵,因此整个线性规划建模项目都不得不放弃。幸

运的是,后一种情况只是偶然现象,但作者仍然发现大多数建模者总是低估了获取良

好的数据所需花费的时间。

1.7 参考文献和进阶阅读

在一般的运筹学著作中通常都有几章用于介绍线性规划,例如 Winston 的著作

Page 33: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

22

[Win94]。还有一些书籍完全用于介绍这个主题,例如 Chvatal 的著作[Chv83],Schrijver 的著作[Sch86],以及 Bazaraa 和 Jarvis 的著作[BJ90]。在关于优化的一般

著作中也对线性规划进行了讨论,例如[Lue84],[SN96]。

Dantzig 在 1940 年代引入了求解线性问题的单纯形方法(simplex method),他

的专著 Linear Programming[Dan63]多次被修订再版。求解线性问题的另一种较新出

现的方法是内点法(interior point),或称为 Newton-Barrier 算法(原文[Kar84],请

参考[APVK89]了解此方法的一种概念上更简单的形式)。Arbel 的著作[Arb93]中涉及

到许多优化软件;[Roo97]是一本基于内点法的线性规划的教科书。在商业软件包例

如 Xpress-MP 中都已经包含了内点算法。

很多地方都提到,本书下面的第 2 章也会谈到,商业软件的线性规划求解器通

常不会直接对问题的原始形式进行求解,而是通过使用所谓的预求解技术将问题简

化,降低问题的规模(请参考[AA95]了解相关实例),然后再进行求解。在 后,算

法将把求得的结果反变换回去(求解后处理),以向用户提供原始问题的解答。

Page 34: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

23

第 2 章 典型线性规划模型的创建

现在我们将尝试更严格的建模方法。尽管我们说过建模是一项艺术,但这并不表

示每次建模都是随兴而为。实际上我们将从之前的建模经验中学习,以便在下次建模

时提高我们的效率和技术。

在建立新模型时,一个很自然的方法是将模型中的约束条件理解为我们之前了解

的约束条件类型,从而了解应如何建模。如果我们能够将所有约束条件的集合分解为

若干个单独的我们已经知道应如何建模的约束条件,那么对完成创建整个模型就更有

信心。

因此我们应了解一些典型的约束条件类型。首先对约束条件给出各种语言描述,

即我们所建模的系统的负责人如何用语言描述这些约束条件。然后给出约束条件的代

数表达式,并了解如何对约束条件进行归纳。本章后面的内容将逐一介绍下面的这些

约束条件类型:边界(2.1 节),流约束(2.2 节),简单资源约束(2.3 节),物料平

衡约束(2.4 节),质量需求(2.5 节),会计约束(2.6 节),混合约束(2.7 节),模

式(2.8 节),软约束(2.9 节),以及一种非约束的“约束条件”,即目标函数(2.10节)。

应注意到,这些约束条件类型是我们主观给出的,在其他的书籍中可能以其他方

式对约束条件进行分类。

2.1 简单上界和下界

A) 市场调查告诉我,我们无法在这段期间内售出 100 个单位的 4 号产品。

B) 我决定明天发送至少 20 吨的 5 号混合物到波士顿。

C) 我必须在下一阶段发送 30 吨 5 号混合物到巴黎。

D) 在电缆中电流可以向任一方向流动。

在 A 中,决策变量之一将是要售出的 4 号产品,假定为 4sell 。在 A 中称变量 4sell

存在上限(upper limit)或上界(upper bound)为 100,即:

1004 ≤sell

在 B 中,我们设置了相反的限制。设决策变量为 Boston,bsend 6 ,则此变量有一个

下限(lower limit)或下界(lower bound),即

206 ≥Boston,bsend

Page 35: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

24

注意,这比常见的非负约束更严格:

06 ≥Boston,bsend

我们可以看到在 C 中,设决策变量为 Paris,bsend 5 ,则此变量必须取固定(fixed)

值,即相当于上界和下界相等,即:

305 =Paris,bsend

305 ≥Paris,bsend 且 305 ≤Paris,bsend

你可能会问,既然 Paris,bsend 5 是固定值,那么它为什么还要作为决策变量。如果

每天我们都发送 30 吨货物到巴黎,那么可能可以将这个变量从决策过程中移除,同

时也去掉制造此货物的资源,移动此货物的运力等。但是显然可能会有一天巴黎需要

更多的 5 号混合物,此时我们需要花时间重新计算资源,运力等是否足够,并重新

计算巴黎人的净需求量。如果没有人想起要重新计算,那么就会出现错误。如果法国

其他城市的需求量也上涨,那么我们也需要调整生产计划,这时也很可能会忘记重新

计算需求总和。将变量从模型中去除带来的收益远远不及由于去除之后模型缺乏灵活

性而带来的风险。

后一个例子 D 反映了有时候变量并不受到常见的非负条件约束这一事实,在

这种情况中,变量是完全自由(free)的。如我们前面提到过的那样,所有决策变量

默认都认为是非负值,因此我们需要显式告知建模软件此处的决策变量(这里为

eflow)代表从英国到法国的电流,正数值表示电流从英国流向法国,负数值表示电

流从法国流向英国,因此这个决策变量不是非负的。

+∞≤≤∞− eflow

在 Mosel 中,可以通过此语句来表示这一点:

eflow is_free

自由变量可以用一般的非负变量来替代,例如:

FBBF eflowefloweflow −=

其中 BFeflow ( FBeflow )是从英国到法国(法国到英国)的非负电流,但由于

优化软件能够直接处理自由变量,因此不需要进行此处理。然而,如果流存在不对称

性(例如从英国到法国的电流由法国政府征税,而法国到英国的电流不被征税),则

Page 36: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

25

在模型的其他部分可能需要使用变量 BFeflow 和 FBeflow ,因此这时这样的替换不仅

无害,而且必要。

2.2 流约束

如果建模者要处理一些可切分的对象,例如电流,水流,化学流体,交通流等等,

这些对象可以分为多个不同的流,多个流也能够合并到一起,这种情况下就需要使用

流约束了。下面是对流约束的一些语言描述:

A) 我有一个容量为 1000 升的储油罐,需要为三个顾客 C1,C2,和 C3 服务。

B) 我从三个供应商 S1,S2,和 S3 那里购买磁盘驱动器。我希望下个月收到至

少 5000 个磁盘驱动器。

C) 我的工厂有两个供水来源 S1 和 S2。供水方根据供给我的水量向我收费。由

于管道漏水,从 S1 那里收到的水损失 1%,从 S2 那里收到的水损失 2%。我的工厂

每天需要 100,000 加仑水。

在 A 中,流从单个源流出,而在 B 中,我们希望建模总入流。C 则较为复杂,

我们需要建模流的损失。

在 A 中,设流变量为 1plysup , 2plysup , 3plysup 分别表示向三个客户供给

的水量。总供给量是这三个决策变量之和,即 321 plysupplysupplysup ++ ,总量

必须小于或等于我们所拥有的总容量,即 1000 升。因此可以得到:

1000321 ≤++ plysupplysupplysup

(假定已经定义供给量单位为升)

例子 B 与之十分类似。很明显,可以设决策变量为 1buy , 2buy , 3buy ,我们

采购的总量为 321 buybuybuy ++ 。要求购买至少 5000 个磁盘驱动器,因此约束条

件为:

5000321 ≥++ buybuybuy

如果希望购买的驱动器数目就是 5000,则约束条件将变为

5000321 =++ buybuybuy

例 C 则更具有挑战性。“在我的工厂里有两个供水来源 S1 和 S2。供水方根据供

给我的水量向我收费。由于管道漏水,从 S1 那里收到的水损失 1%,从 S2 那里收

到的水损失 2%。我的工厂每天需要 100,000 加仑水。”

Page 37: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

26

对于这个例子可以采用多种不同的方法建模。一种方法是按照如下定义决策变

量: 1buy 和 2buy 是我们从供应商 1 和 2 那里分别购买的水量, 1get 和 2get 是我们

实际得到的水量(损耗已扣除)。如果决策变量以千加仑为单位,则需求约束条件即

为:

10021 =+ getget

损耗可以如下建模(损耗方程):

22

11

990990

buy.getbuy.get

==

上面两个式子就表示了我们实际得到的水量与购买的水量之间的关系。则目标函

数可以表示为 2211 buyPRICEbuyPRICE ⋅+⋅ ,其中 1PRICE 和 2PRICE 分别表示

两个供应商每千加仑水的价格。

我们可以根据损耗方程代入 1buy 和 2buy (或 1get 和 2get ),这样将使方程数和

变量数都减少 2。但如前所述,这样做并不值得,线性规划求解器已经足够聪明,如

果它认为这样做能够降低求解所需的时间,那么它会自动为我们这样做。

2.3 简单资源约束

在棋子问题中我们已经看到了这种约束条件的一个例子,在那个例子中我们所拥

有的车床工时和黄杨木料都是有限的,需要制定一个生产计划,该计划所使用的工时

数和木料数都必须不超过限制。

如果将工时和木料都概括为资源,则所有的线性规划都可以表示为在使用的资源

量受限的情况下 大化某个目标函数。但是将所有对象都看成资源并不总是很有帮

助,因此在下面我们给出一些涉及真实资源的实例语言描述。

A) 每个月我只能得到 10,000 个连接器。制造每个工业级计算机需要 8 个连接

器,制造每个家用级计算机需要 5 个连接器。

B) 每吨化工产品 C1 需要使用 50 克稀有的催化剂以及 1 千克某种精细化工原

料;而每吨化工产品 C2 需要 130 克这种催化剂以及 1.5 千克这种精细化工原料。我

每个月只能负担起购买 10 千克这种催化剂和 200 千克这种精细化工原料。

C) 如果我做一次活动 i ,则需要耗费数量为 iCOST 的可支配收入。下周我的可

支配收入为 150 元。

如果只考虑一种稀缺资源,那么资源约束就可以描述为某个活动可能会用尽此资

源的一部分,我们希望进行多少这样的活动,可用资源数目为多少,以及每单位活动

需要消耗多少此资源。

Page 38: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

27

每单位活动需要消耗的资源量取决于所采用的技术,因此称之为“技术系数”

(technological coefficient)。如果有多种类型的产品,使用多种类型的资源,则可

以用一个技术系数矩阵(technological coefficient matrix)表示每种产品每个单位需

要消耗各种资源各多少。技术系数矩阵可以写成表 2.1 的格式,其中例如 0.8528 表

示制造一个单位的产品 3 需要 0.8528 个单位的资源 3。在度量产品和资源时,注意

使用的单位应保持一致。

在例子 A 中,我们称“每个月我只能得到 10,000 个连接器。制造每个工业级计

算机需要 8 个连接器,制造每个家用级计算机需要 5 个连接器。”,这样就有了一个

简单的技术系数矩阵:

设决策变量为 Imake 和 Hmake ,分别表示计划制造的工业级和家用级计算机数

量,则我们计划使用的连接器数量就是制造工业级计算机所需的连接器数量与制造家

用级计算机所需的连接器数量之和。如果制造一台工业级计算机需要使用 8 个连接

器,则总计 Imake 台工业级计算机需要使用 Imake⋅8 个连接器;如果制造一台家用

级计算机需要使用 5 个连接器,则总计 Hmake 台家用级计算机需要使用 Hmake⋅5 个

连接器。

表格 2.1:技术系数矩阵

资源 1 资源 2 资源 3 … 资源 R

产品 1 1.28235 0.24

产品 2 0.85474 1.8361

产品 3 12.33312 6.128 0.8528

… etc.

产品 P 11.2322 5.208

表格 2.2:简单的技术系数矩阵

连接器数目

工业级计算机 8

家用级计算机 5

因此若总计制造 Imake 台工业级计算机和 Hmake 台家用级计算机,则需要使用

的连接器总数为 HI makemake ⋅+⋅ 58 。此总数不能超过可用的连接器总数,即:

1000058 ≤⋅+⋅ HI makemake

在例子 B 中,我们说“每吨化工产品 C1 需要使用 50 克稀有的催化剂以及 1 千

克某种精细化工原料;而每吨化工产品 C2 需要 130 克这种催化剂以及 1.5 千克这种

精细化工原料。 我每个月只能负担起购买 10 千克这种催化剂和 200 千克这种精细

化工原料。”因此有两种产品和两种资源。

Page 39: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

28

表格 2.3:资源用量

催化剂 精细化工原料

C1 50 1.0

C2 130 1.5

催化剂用克计,精细化工原料用千克计。定义决策变量 1make 和 2make 分别为

计划生产的两种化工产品(C1 和 C2)的质量吨数,使用与例子 A 中相似的方法,

可以得到两个约束条件,一个是催化剂约束条件,一个是精细化工原料约束条件。

100013050 21 ≤⋅+⋅ makemake (催化剂用量)

2005101 21 ≤⋅+⋅ make.make. (精细化工原料用量)

需要注意保持度量单位的一致。

通常情况下,每种资源各有一个约束条件,约束条件将我们计划使用的资源量与

实际拥有的资源量联系到一起。

到此为止例子 C 就没什么挑战了。“如果我做一次活动 i ,则需要耗费数量为

iCOST 的可支配收入。下周我的可支配收入为 150 元。”决策变量是计划做活动 i 的

次数 idoact 。根据线性假定,做 idoact 次活动 i 则需要支出 ii doactCOST ⋅ ,则计划

总支出为∑ ⋅i ii doactCOST ,此支出数额不能超过我的可支配收入(假定我无法使

用信用卡)。则约束条件为:

150≤⋅∑i ii doactCOST

2.4 物料平衡约束

许多系统都有类似于这样的约束条件:“出量必须等于入量。”也就是说,在特定

的过程中,不允许有质量损失。如果此过程为某种物料流动过程,并且流动的物料有

限,则有时可以将这种约束条件表述为容积守恒。

用图示表示就是,如果我们的过程的入流变量为 iflowin ,其中 i 的范围是从 1

到 INN ,出流变量为 jflowout ,其中 j 的范围是从 1 到 OUTN ,并且从外部世界有

一个入流 L ,则有:

Page 40: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

29

图 2.1:一个结点处的物料流平衡

如果流变量都用质量或重量计,则可以得到:

∑∑==

=+OUTIN M

jj

M

ii flowoutflowinL

11

在我们处理多时间段模型中不同时间段之间的物料流动时,会出现一种特别的物

料平衡约束。在多时间段模型中,时间表示为一系列的间隔,不需要考虑在某个特定

的间隔中具体发生了什么事情。假定我们有一家简单的工厂,只生产一种产品,我们

试图决定下面 NT 个时间段(即时间范围为从 1 到 NT )内的生产率 tmake 。另一

组决策变量是 tsell ,即我们决定在时间段 t 内售出的产品数量。如果可以将一个时间

段内生产的产品在后续时间段内继续保存,则可以引入另一组决策变量 tstock ,表示

在时段 t 结束时仓库中保存的产品数量。

我们来研究一下时段 t 内的物料平衡。我们可以称“在时段 t 结束时的库存量等

于时段 t 开始时的库存量加上在此时段内的生产量再减去此时段内的销售量。”

现在我们遇到了一个小问题——我们不知道在时段 t 开始时的库存决策变量,但

是我们可以看到,假定没有库存损耗,则时段 t 开始时的库存量与时段 1−t 结束时的

库存量相同。因此换句话说,前面的表述等同于“时段 t 结束时的库存量等于时段 1−t结束时的库存量加上在时段 t 内的生产量减去在时段 t 内的销售量。”写成数学表达式

就是:

tttt sellmakestockstock −+= −1

这个表述十分简单,但存在一个缺陷:在第 1 个时段之前不存在时段,因此不

存在变量 0stock 。为此我们需要一个只与时段 1 有关的特殊约束条件,我们说“在

时段 1 结束时的库存量等于起始库存量 SINIT ,加上在时段 1 内的生产量减去在时

段 1 内的销售量”,写成数学表达式就是:

111 sellmakeSINITstock −+=

Page 41: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

30

在我们研究从外界供应商那里购买生产所需使用的原材料时,存在另一种物料平

衡约束。对此的文字描述可以为:“对于特定的原材料,在时段 t 结束时的原料库存

等于时段 1−t 结束时的原料库存加上在时段 t 内购入的此原料量减去在时段 t 内生产

消耗的此原料量。”只考虑一种原料,则决策变量为 trbuy , trstock 和 truse ,因此

除了第一个时间段之外其他时段的约束条件为:

tttt ruserbuyrstockrstock −+−= 1

我们要再次记住对于时段 1 存在特殊的约束条件,我们已经知道在时段 1 开始

时拥有的原料数量即等于初始原料量。

变量 truse 也可能与模型的另一部分的决策变量相关,这另一部分的决策变量代

表我们将要生产多少产品。如果将产品编号为 NP,,p K1= ,技术系数 prREQ 表示

生产一个单位的产品 p 需要的原料 r 的单位数,决策变量 ptmake 表示在时段 t 内生

产的产品 p 的数量,则可以立刻写下在时段 t 内使用的原料表达式( truse ):

∑=

⋅=NP

pptprt makeREQruse

1

(请参考 2.3 节“简单的资源约束”了解上式的详细解释)。

由于我们已经写下了 truse 的表达式,因此我们可以考虑在 truse 出现的地方都

用此表达式代入。尽管通常这并不是一个很好的选择,但也不会太糟糕。这样能够略

微减少变量的数目,但我们在模型中其他地方可能又需要使用这些变量,因此需要将

模型中出现 truse 的地方都用此表达式代入。这样模型就更难阅读,也更难以维护。

在多时段模型中当在 NT 时段中一个或多个产品的需求量固定时,会出现一种新

的物料平衡方程形式。需求量固定意味着销售决策变量(上例中的 tsell )固定。这

样我们就可以将约束条件表示为一组简单的等式约束条件,其中 tsell 作为变量,例

如:

tt MUSTSELLsell =

或在变量 tsell 出现的地方都用 tMUSTSELL 代入。这时是否应将 tsell 用

tMUSTSELL 代入可能就是个人选择的问题了——有些建模者会进行代入以减少变

Page 42: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

31

量,而另一些建模者认为变量 tsell 在将来某个时候可能会再次受到关注,因而可能

会使用简单的约束方程,。

2.5 质量需求

下面是对质量需求约束条件的一些描述:

A) 在这种气体中硫含量不允许超过 0.02%。

B) 在这种干杏仁混合物中蛋白质含量必须至少为 3%。

C) 这种食物中脂肪含量必须不低于 5%,但也不应超过 10%。

当需要将各种具有不同属性的原材料混合到一起来形成 终产品时,经常出现这

种类型的质量需求。通常每种原材料都具有一组属性,例如食品的属性可以为脂肪含

量,或者碳水化合物含量;在石油化工行业中,可能为硫含量或辛烷值。我们要求

终产品的某些属性必须符合一定的标准。对于不好的成分,通常表示为百分比 大值;

对于希望获得的属性,通常表示为百分比的 小值,其他属性可能要求限制在上下界

之间(可能这样做会使产品更稳定或拥有其他我们希望得到的性质)。后者的一个极

端例子是我们希望 终产品的某一成分含量精确为某个数值。

假定有 NR 种原材料,我们只关心 终产品的某一个成分。假定单位原材料 r 含

有 rCONT 个单位的此成分(例如如果我们关心的成分为脂肪含量,原材料 3 的脂肪

含量为 10%,则 3CONT 为 0.1)。与对线性规划的一般假定一样,我们假定CONT 的

数值为精确值。

在许多生产工艺中,可以假定 终产品的某个成分就是各个原材料中此成分的线

性和。例如,如果将 1 千克含硫量为 0.01%的汽油与 1 千克含硫量为 0.03%的汽油

混合,则可以得到 2 千克含硫量为 0.02%的汽油。这种线性假设是否正确取决于在

混合过程中的物理化学反应,在一些工业应用中这一假定肯定无法满足。但是,采取

了线性假定之后,我们发现 终产品中某一成分的比例可以表示为:

混合物总质量

该组分总质量含量 ==p

设决策变量为 rruse ,即第 r 种原料的使用量,则可以得到:

∑∑

=

=⋅

= NR

r r

NR

r rr

ruse

ruseCp

1

1

我们可以对此比例施加希望的相等或不等条件。例如, 10.p ≤ (即 10%),则

Page 43: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

32

101

1 .ruse

ruseCNR

r r

NR

r rr ≤⋅

∑∑

=

=

初看上去这不像是个线性不等式,实际上它的确不是,因为在其中有两个线性表

达式的比例。然而,通过交叉相乘,我们可以将约束条件改写为如下形式:

∑∑ ==⋅≤⋅

NR

r rNR

r rr ruse.ruseC11

10

注意:在用同一个值乘以不等式两边时应小心。如果用非负值乘,则不等号的方

向保持不变;但如果用负值乘,则不等号方向发生变化。这里我们将不等号两边都乘

以一组非负变量之和,因此不等号方向不发生变化。

如果将两边的决策变量 rruse 同类项合并,则可以得到线性不等式:

( ) 0101

≤⋅−∑ =

NR

r rr ruse.C

2.6 会计约束,非约束的“约束”

一种典型的创建模型的方法是使用准独立的各个部分来创建整个模型。例如,我

们可以将约束条件表述为“操作区 1 的成本加上操作区 2 的成本...加上操作区 16 的

成本必须低于 10,000,000 元”,稍后在模型中我们可以有 16 个不同的等式,每个等

式表示一个区域中的操作成本。如果决策变量为 tcostotal 和 itcosr ,则可以表示为:

∑=

=16

1iitcosrtcostotal

其中 ii ressionexp_sometcosr = , iressionexp_some 为第 i 个操作区成本表

达式, 161 ,,i K= 。

显然可以通过将 iressionexp_some 代入到定义 tcostotal 的方程中,从而消去

所有变量 itcosr ,但很可能在某一份报告中也希望看到每个区域的操作成本,因此

我们可以让线性规划系统为我们计算出这些变量的值。我们称变量 itcosr 为会计变

量,定义了这些变量的约束条件为会计约束。

是否让线性规划系统为你进行会计计算,还是在稍后制作报告时自己计算,这只

是一个个人喜好问题。在过去,线性规划系统的功能还很弱,人们需要将问题规模尽

可能缩小到只有少量几个约束变量,因此自然而然地选择消去这些会计变量并根据计

算出的 优值来计算这些变量。而现在,增加几百个约束条件已经对问题大局无关紧

Page 44: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

33

要,因此可以在模型中保留会计变量和约束条件。

然而,我们仍然必须注意一个微妙之处:会计变量可能不一定是非负值。

假定变量 irevenue 和 ienditureexp 分别是工厂 i 的利润和支出。如果我们需要定

义会计变量 iprofit 和会计约束

iii enditureexprevenueprofit −=

来求得 iprofit 的值,则我们必须记住,工厂可能会有负利润,因此必须将变量

iprofit 定义为自由变量(除非处于某种原因我们需要强制每个工厂都运营在盈利状

态下)。

在处理会计变量时,忘记决策变量默认为非负是一个很常见的错误原因。然而,

如果你只希望线性规划系统为你进行这样的会计统计,那么可以向模型中添加一些不

受约束的线性表达式,让线性规划系统为你计算出这些线性表达式的值。在过去增加

这些表达式可能会减慢求解过程的速度,但现代的求解器都能够识别出这些约束,并

且在求解过程中忽略这些约束,只在完成求解之后才对这些表达式进行求值。

2.7 混合约束

线性规划建模的常见用途之一是处理混合过程,即我们需要将一些各成分含量百

分比不同的输入混合起来形成某种具有特定属性的 终产品。混合过程通常可以分为

两种主要类别:使用固定配方,每种原料的输入量都预先确定(类似于烹饪菜谱,在

其中列出了制作某种蛋糕所需的各种成分的确切重量);或者可变配方,需要由我们

来决定将要混合到一起的各种原料比例,并且可能要满足一定的限制条件。

可变配方的一个例子是生产动物饲料,动物饲料可以采用很多中不同的原材料,

每种原材料的比例并不需要总是保持固定。有些配方看上去固定,但实际上可变,例

如那些教你调制鸡尾酒的配方。这些配方中总是说金酒,龙舌兰酒,苦艾酒等等的比

例是固定的,但显然实际的操作者所拥有的原材料都很有限,而且他们也明白配方在

一定限度内是可以改变的。

假定我们有 3 种原材料,约束条件可以描述为“原材料 1,原材料 2,原材料 3

的比例为 6:3:1。”用决策变量 1raw , 2raw ,和 3raw 分别表示混合的各种原料质量,

则混合物总质量为 321 rawrawraw ++ ,我们有如下约束条件:

106

321

1 =++ rawrawraw

raw

Page 45: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

34

103

321

2 =++ rawrawraw

raw

101

321

3 =++ rawrawraw

raw

这些约束条件是比例约束,而不是线性方程,但与前面一样,我们可以通过交叉

相乘将它们转化为线性方程:

( ) 321 6060601 raw.raw.raw. ⋅+⋅=⋅− ,即

321 606040 raw.raw.raw. ⋅+⋅=⋅

由于分母总是为非负数,因此交叉相乘之后不等号方向不发生变化。

类似地,我们可以得到:

312 303070 raw.raw.raw. ⋅+⋅=⋅ ,和

213 101090 raw.raw.raw. ⋅+⋅=⋅

这些方程中有一个是冗余的,可以通过另外两个方程来推导出,但将这三个方程

都输入到模型中也不会带来什么危害。实际上将三个方程都保留下来是一个明智的选

择,因为在将来某个时候很可能会加入第四种原材料,如果我们这时想耍小聪明消去

了冗余的约束条件,那么这时我们可能会忘记在前面已经省略了一个冗余方程,从而

犯下一个很难纠正的错误。

2.8 模式

混合约束的一种推广形式是,有M 个输入和 N 个输出,它们必须满足严格的比

例关系。例如,可以将约束条件表示为“我的三个输入必须符合比例 2:1.6:2.2,输

出 1 为 1.6,输出 2 为 1.7。”因此,如果我们输入 1 千克输入 1,0.8 千克输入 2,1.1 千克输入 3,则可以得到 0.8 千克输出 1 和 0.85 千克输出 2。

很容易看出,如果只有一个输出,则这就是一个简单的固定比例混合约束。

当我们拥有一个可以按照不同模式工作的工厂,并且不同模式下的输入输出比例

不同时,经常会出现这种 M 输入/ N 输出的约束条件。在任一时刻,工厂只能工作

于一个模式下。

考虑一个十分简单的例子,假定我们有 3 个输入,2 个输出,和 3 种可能的运行

模式。则可用下面的表格表示工厂的运行特征,在其中定义每个模式的一个单位为 1小时,即我们在此表格中给出了此工厂所使用的每种输入和产生的每种输出的千克

数。

Page 46: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

35

决策变量为工厂处于模式m 中的时间长度,称为 memoduse 。那么输入 1 的总

使用量为 321 242220 emoduseemoduseemoduse ⋅+⋅+⋅ ,输出 2 的产出量为

321 242017 emoduseemoduseemoduse ⋅+⋅+⋅ 。

表格 2.4:固定比例混合示例

消耗/产出量

模式 1 模式 2 模式 3

输入 1 20 22 24

输入 2 16 14 13

输入 3 22 21 18

输出 1 16 15 14

输出 2 17 20 24

在任何给定的计划期间,工厂处于各种模式的总小时数都存在约束条件。例如,

如果我们计划制定一个周计划(168 小时),则约束条件可以为:

168321 ≤++ emoduseemoduseemoduse

即假定我们每周可以工作 多 168 个小时,在从一个模式切换到另一个模式时

不存在额外的时间消耗。后一假定对于某些工厂来说可能完全不现实,如果我们无法

假定切换时间可以忽略,则需要使用整数规划。

2.9 软约束和“恐慌变量”

上面我们所建模的约束条件,即工厂运行时间至多为 168 小时,是一个硬约束

条件。一周内不可能有超过 168 个小时。硬约束的其他例子有那些与物理,化学,

或工程性质相关的约束,例如锅炉容积,或反应速度。还有一些硬约束来自于会计约

束或定义性约束(例如,利润 = 收入 – 支出 就是一个硬约束,它实际上是一个定

义)。

但是在现实中仍然存在其他较为“经济”的约束条件,即使违背了这些约束条件,

也不会付出什么代价。如果某种资源紧缺,则在经济环境中自然而然会出现一个这种

资源的市场,如果我们需要获得更多的这种资源,就可以到这个市场中购买。(这只

是一种一般性的说法,实际上可能只有我们需要某种特定的资源,从而只有我们能够

建立此产品的标准,并决定何时何地需要此资源。)

考虑 2.3 节“简单资源约束”中的例子 B:我们称“生产每吨化工产品 C1 需要

使用 50 克某种稀有催化剂和 1 千克某种精细化工原料,而生产每吨化工产品 C2 需

要 130 克这种催化剂和 1.5 千克这种精细化工原料。我每个月只能负担购买 10 千克

此催化剂,只能买到 200 千克此精细化工原料。”这段陈述的关键在于 后一句,称

只能负担这些数量的催化剂,只能买到 200 千克精细化工原料。可以将精细化工原

料约束条件表示为:

Page 47: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

36

2005101 21 ≤⋅+⋅ make.make. (精细化工原料)

即将它作为一个硬约束。但假定如果我们希望出价每千克 P 元,则能够买到更

多的这种精细化工原料。这样我们就可以引入一个新的决策变量buyFC ,表示以此

价格可以买到的精细化工原料千克数。如果我们创建一个线性规划模型使利润 大

化,则需要在此模型的目标函数中加入一项 buyFCP ⋅ ,表示购买精细化工原料的支

出,这样约束条件就变为:

buyFCmake.make. +≤⋅+⋅ 2005101 21 (精细化工原料,有购入)

现在就出现了一个软约束条件,即我们可以违反原先的约束条件,但对目标函数

会有一些惩罚。变量buyFC 可以视为一个“恐慌变量”(panic variable):如果正常

的资源无法满足需求,则会出现此变量,以便通过市场满足我们的需求。

这种引入恐慌变量的方式不是建模种 常用的引入恐慌变量的方式。在前面我们

提到了,如果线性规划问题不可行,那么很难找到引起不可行的因素,因此优秀的建

模人员学到了我们称之为“预防性建模”的技巧。使用模型时 糟糕的情形是,需要

将模型发布给 终用户,而可怜的 终用户看到的却是一条不可行信息,他们只能手

足无措。而掌握了预防性建模技巧的建模人员将通过向可能被冲突的约束条件加入恐

慌变量来避免这种情况,同时尽量估算在现实中此约束条件冲突可能带来多大耗费。

此时 终用户可以起到一些帮助作用,他们了解应采取何种措施来获得额外的资源。

例如,如果要在工厂停工和租用飞机运输稀缺资源之间进行选择,那么你就应考虑是

否应该租用飞机。

恐慌变量并不仅仅适用于资源可用性约束,也可以用于需求约束。例如,可能有

一个约束条件要求从我们的仓库向特定客户C 发送总量为 100 吨的货物,即建模为:

100≥∑∈DEPOTSd

dCflow

然而,如果我们的库存不足,那么就无法向此客户供货。合同上可能已经注明此

时应给出的补偿,我们清楚这样将带来多少直接损失,或者可能因此使客户与我们之

间的友好关系受到损害(这种损害很难以估计,可能非常主观)。

如果在 优解决方案中的恐慌变量为非 0,则我们可以推断发生了以下两件事情

之一:我们输入的惩罚代价太低,或者我们的确需要通过使用恐慌变量来取得可行性。

设置较高的惩罚代价,然后重新运行模型,这样可能会消除这种情况。但无论如何,

此时我们都得到了一个可行的解决方案,不会再让 终用户茫然地盯着电脑屏幕不知

所措。

Page 48: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

37

2.10 目标函数

目标函数不是一个约束条件,但由于目标函数是一个含有很多变量的线性表达

式,因此构造目标函数与构造约束条件有许多相似之处。实际上,现在我们已经对建

模约束条件进行了十分充分的描述,建模目标函数已经没有什么新东西可说了。

目标通常是成本(需要 小化)或利润(需要 大化)。大多数线性规划系统默

认都求 小值,数学规划软件(MPS,Mathematical Programming Software)的工

业标准规定了应如何将线性规划问题提交给优化器,但它并没有指定应 大化还是

小化目标函数,因此很多人都有选择错误的优化目标的时候,得到的答案自然很傻冒。

这当然让人觉得很傻,但通常可以很明显地看出,发生错误了。

也的确存在没有目标函数的问题,此时使用线性规划优化器的目的只是找出一个

可行解,或在设计时回答是否约束条件过于严格。但这样的问题很少见。

2.10.1 最大化目标函数

有两个表面上为非线性的目标函数可以通过技巧转化成线性规划的形式,第一种

是希望:

minimize ( )Nt,,t,tmax K21

即, 小化一组决策变量的 大值。可以通过引入一个新的决策变量 s 来对此进

行建模,这样问题就变为:

minimize s

subject to 1ts ≥

2ts ≥

3ts ≥

...

Nts ≥

可以看到,s 必须不小于所有的 t , 小化的目标将使 s 取值为 大的 t 值。不幸

的是,在希望 小化 ( )Nt,,t,tmin K21 或 大化 ( )Nt,,t,tmax K21 时,就无法使用这

种技巧了。

2.10.2 比例目标函数

使用第二个技巧可以处理如下形式的比例目标函数:

Page 49: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

38

minimize∑∑

⋅=

j jj

j jj

xD

xNObj

subject to 线性约束条件 ij

jij R~xA∑ ⋅

其中~是≥,≤>=,或者=。

定义新的变量∑ ⋅

=j jj xD

d 1和 dxy jj ⋅= (即 d/yx jj = ),则目标函数变

为:

∑∑∑ =⋅⋅=⋅=j jjj jjj jj yNxdNxNdObj

可以通过交叉相乘来将 d 的定义线性化:

∑∑ ⋅=⋅⋅=j

jjj

jj yDxdD1

可以将 jx 代入线性约束条件:

ij

jij R~xA∑ ⋅

两边同乘以 d 即转化为:

ij

jij Rd~xAd ⋅⋅⋅∑

也可写为:

ij

jij Rd~xdA ⋅⋅⋅∑

ij

jij Rd~yA ⋅⋅∑

终得到的线性规划模型中变量为 d 和 jy 。在对此线性规划进行求解之后,可

以通过定义 d/yx jj = 来求得变量 jx 的 优值。

注意,如果变量 d 可以为 0,那么就会出现问题。也应注意,如果 d 为负值,则

在不等式两边同乘以 d 时,必须将不等号方向改变。

Page 50: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

39

第 3 章 整数规划模型

尽管许多系统都可以用线性规划进行精确建模,但是有些时候在决策问题的核心

之处仍然会出现不连续的情况。需要使用非线性方法的领域主要有以下三种:

♦ 当必须从离散的候选集合中选取实体时

♦ 当建模逻辑条件时

♦ 寻找函数的全局 优值时

借助于建模语言,你可以使用许多离散实体来对这些非线性和非连续性特征进行

建模,然后使用一个混合整数规划(MIP)优化器来寻找问题的全局 优值。通常其

底层结构是线性规划,但是当可以将非线性分离到只含有少数几个变量的函数时,就

可以成功进行优化。

请注意,在本书中将不加区分地使用整数规划(IP)和混合整数规划(MIP)这

两个术语。严格的混合整数规划模型必须同时有离散和连续变量,但纯整数规划模型

只有离散变量。但是除非它们之间的区别对于我们的建模和优化过程有非常重要的作

用,否则我们都不将它们加以区分。

本章的第一节 3.1 节将介绍整数规划建模中的不同类型对象(也称为“全局实

体”)。3.2 节介绍求解混合整数规划的分支定界法。二值变量值得特别关注:可以使

用它们来表示是/否决策,蕴涵式,以及其他逻辑表达式,甚至多个二值变量的乘积。

如 3.4 节所示,有时可以将整数规划中的所有对象都化归为二值变量,但是这样会以

牺牲效率为代价。与实数变量联合使用,二值变量可以用来表示不连续性(3.5 节)。

3.1 整数规划对象:“全局实体”

原则上说,在构建混合整数规划模型时,你只需要连续变量和二值变量,二值变

量是取值只能为 1 或 0 的决策变量。二值变量通常也称为 0/1 变量或是/否变量。但

将实践中常见的各种对象也加入模型实体集合将会给我们带来很多方便。

♦ 整数变量:整数变量即取值必须为整数的变量。

♦ 部分整数变量:部分整数变量是这样的变量:如果其值小于用户指定的限制

L,则取值必须为整数值;如果其值大于此 L,则可以取任意值。

♦ 半连续(SC)变量:半连续变量是一个取值为 0 或者用户指定的上界 U 和

下界 L 之间的某个数值的变量。如果一个变量要么不使用,要么取值位于

某限定范围内,则可以使用半连续变量对其进行建模。

♦ 半连续(SI)整数变量:半连续整数变量是取值为 0,或某个上下界之间的

整数值的变量。如果一个变量要么不使用,要么取值是某个限定范围内的整

数,则可以使用半连续整数变量对其进行建模。

Page 51: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

40

♦ 1 类特殊有序集(SOS1 或 S1):非负变量的有序集合,在其中至多只能有

一个变量取值为非 0 值。

♦ 2 类特殊有序集(SOS2 或 S2):非负变量的有序集合,在其中至多只能有

两个变量取值为非 0 值,且此时这两个非 0 变量顺序必须相邻。

我们将这些变量和集合统称为全局实体,为什么要使用这些全局实体呢?首先我

们进行简单概述,稍后我们将对这些例子进行解释。

整数变量出现得很自然,在很多时候决策变量都必须取整数值才能使得到的 优

解有意义。如果我们对半个小时长的时段内离开火车站的火车数目进行建模,则对应

于此数目的变量必须取整数值,像“11.23 辆火车离开车站”这样的说法没有意义。

部分整数变量这一概念来自于对短缺的汽车引擎在不同区域内分配的过程进行

的研究。有些区域比较大,因此需要很多引擎,因此可以将例如“此区域应分配

1654.19 个引擎”这样的输出结果取整为 1654 个引擎。但是对于那些需要引擎数很

少的地区,这样的取整就不能接受了,例如将 6.32 个引擎取整为 6 个,这对精度影

响较大。因此决策者需要决定当结果小于何数值时即不应将小数的结果进行取整。如

有必要,建模系统允许决策者为每个部分整数变量指定不同的下界 L 。如果决策变量

的 优值较大时允许取整,而较小时则不允许取整,则此时使用部分整数变量能带来

一定的计算便利。

如果在使用某个变量时,其值必须不小于某个 小值,则可以使用半连续变量。

例如,在混合问题中,可能有某个现实原因迫使我们要么不使用某种成分,要么至少

使用 20 千克的此成分。这种类型的约束条件在实践中经常出现。

半连续整数变量通常出现在轮班计划建模中。如果我们计划使用一台机器,则机

器运行时间必须为整数班次,且对每次运行的班次数目有一个 小值要求。例如,可

以让机器运行 0 或 12,13,14...个班次,而运行 1,2,...,11 个班次将不能得到有

意义的经济产出。

1 类特殊有序集通常用于建模选择问题,此时我们需要从一组物体中选出至多一

个。要进行选择的集合有例如何时开始一项工作,修建的工厂大小应为多大,应在哪

一台机器上加工某个零件,等等。

2 类特殊有序集通常用于建模变量的非线性函数。它是可分离规划(Separable Programming)的自然扩展,但在分支定界法(请参考 3.2 节)中使用 2 类特殊有序

集,则可以找到真实的全局 优,而不仅仅是局部 优。(局部 优是这样的一个点,

它要优于其附近的所有邻居点,但无法保证在不相邻的别处是否有更优的选择。全局

优就是 佳的点。例如在青藏高原上乔戈里峰是一个局部 优点,但珠穆朗玛峰才

是全局 优点。)

理论上说,使用上面列出的任意实体构建的模型都可以只使用二值变量进行建

模。现代的整数规划系统之所以需要使用这些额外的实体的原因在于这样能够在求解

模型时显著节省计算的时间和空间代价。大部分关于整数规划的书籍和课程都没有强

调这一点。我们发现小心使用非二值的全局实体通常能够比只使用二值变量显著缩短

求解所需时间。

Page 52: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

41

3.2 整数规划求解:分支定界法

大多数商业整数规划优化器,包括 Xpress-MP,都使用分支定界法(branch and bound)搜索作为寻找和验证 优解的基础算法。本书的目的不是详细讨论求解算法

背后的概念,而是试图理解我们所引入的建模实体为什么有用。但仍然有必要首先对

分支定界法背后的概念进行简要解释。本节的目的是让你对分支定界法的工作原理有

一定了解,因此本节内容可能并不是对此算法的精确描述。

支持分支定界法的第一个概念是松弛(relaxation)。如果在问题中存在全局实体,

我们暂时忘记它们的离散性,并将问题作为线性规划问题进行求解(松弛问题)。如

果我们幸运,求得的解值中可能恰好包含一些符合原先要求的离散值,二值变量都是

0 或 1,整数变量都取整数值,等等。此时就可以得到整数解,因此分支定界算法结

束。

如果得到的解不符合要求,则至少有一个全局实体没有符合要求,称此解是整数

不可行的。此时可能发生的情况有二进制或整数变量取值为小数,部分整数变量取值

低于其下界且为小数,或某个特殊有序集条件不满足,等等。因此我们需要采取一些

措施,使满足整数性要求。因此我们引入分支的概念,我们可以使用一个整数变量来

描述这个概念。假定在线性规划的解中某个整数变量(例如变量 v )的 优值为 12.3。则显然可以用 12≤v 和 13≥v 这两个条件来将初始的问题划分为两个子问题,其中

一个添加了约束条件 12≤v (称为下支),另一个添加了约束条件 13≥v (称为上支)。

如果这两个子问题都能够求解,则两个解中较优的那个就是原问题的解。也就是说,

我们将原问题分解为两个子问题。我们发现由于子问题比原问题有更多的约束,因此

子问题的解肯定不会优于原问题的解。

现在该怎么办呢?我们已经将求解原问题转化为求解两个子问题。因此对于这两

个子问题我们可以再次应用松弛的概念,即忽略离散性条件,将它作为线性规划问题

进行求解。

初看上去,这似乎没有什么道理——我们将求解一个问题转化为求解两个子问

题。然而,可以证明这两个子问题比起原问题具有更好的“整数性”,“整数性”是指

对线性规划松弛更有可能取得整数解。在原问题的线性规划解中,变量 v 希望取值为

12.3,但在两个子问题中,我们迫使 v 取值离开此值。因此在下支子问题的线性规划

解中,将求得 12=v ,在上枝的线性规划解中,将求得 13=v 。在这两种情况中,

原先为小数的变量都取得了整数解,因此我们可以认为,这两个子问题都比原问题具

有更好的“整数性”。

然而,子问题的线性规划松弛解可能仍然是整数不可行的,但现在我们知道应怎

么做了。我们将再次选择一个整数不可行的变量,对其进行分支。

因此分支定界法过程由连续的对不满足离散性条件的变量进行分支组成,从而在

每次分支时都生成两个新的子问题。我们可以用一个树形来表示这一过程,按照计算

机科学中常用的由上到下的顺序绘制:

Page 53: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

42

图 3.1:分支定界树

树的节点表示松弛后的线性规划解。在每个节点旁边我们都记下在此节点处的松

弛后线性规划问题的目标函数值。注意,我们假定求解的是 小化问题,因此随着在

沿着树枝向下前进,由于我们不断加入新的约束条件,目标函数值将恶化(增大)。

如果在某个节点处的线性规划解是整数可行的,则可以停止从此节点向下继续搜索,

否则将对其中的某个整数不可行变量进行分离,创建两个新的子节点。如果在某个节

点处的线性规划是不可行的,则无法继续从此节点向下探索,向不可行问题增加约束

条件只能让此问题更为不可行,因而此节点的后代都不可能给出可行的整数解。

如果在搜索过程中我们找到一个整数解,则可以通过舍弃(fathoming)来对此

事实进行利用。在上图中,我们在节点 6 处找到一个整数解,其目标函数值为 120。观察节点 3,我们发现增加约束条件会让其子节点的目标函数值都比 128 更差,但我

们已经有了一个目标函数值为 120 的解,因此不再需要考察节点 3 的字节点。即节

点 3 被舍弃或截断了。类似地,节点 5 也被舍弃了。节点 7 被舍弃是由于它是不可

行的。

如果我们很幸运,在搜索早期就发现了整数解,则你可以看到大部分可行的节点

都将被舍弃,我们不再需要对整棵树进行搜索。但如果有 N 个离散变量,则理论上

我们可能需要生成差不多N2 个节点,并求解此数目的线性规划问题,这个计算量很

可怕。

你可以看到,在进行分支定界搜索时需要作出三个主要决策:

1. 选择哪一个节点进行线性规划求解(结点选择策略)。

2. 选择哪一个非整数变量进行分支(变量选择策略)。

3. 在进行分支之后首先在哪一个方向进行试探(分支方向策略)。

尽管无论怎样进行这些选择在理论上都是可行的,但是由于只要时间足够,分支

定界法总能找到 优的整数解,因此分支定界算法的实际效率严重依赖于如何进行正

Page 54: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

43

确选择。在许多情况下, 好让整数规划求解器来进行选择;然而建模人员也有机会

对求解过程施加影响,只需将模型语义的知识传递给内部的求解器:如果某个(或某

些)变量的值对于解有很大影响,则可以对这些决策变量赋予较高的分支优先级(例

如,如果我们需要决定是否开办工厂以及在不同时期应生产多少产品,则应先作出关

于开办工厂的决策)。如果建模人员对 终解中的某个变量取值有直觉的感知,则也

可以为此变量设置偏好的分支方向(先向上或先向下)。

与其他求解器一样,Xpress-MP 也有一套默认的策略,实践已经证明这些策略

对大多数问题都能有效作用。然而,在大型混合整数规划项目中,用户应注意根据实

际情况仔细设计模型。在过去二十年里理论研究已经在怎样对整数规划问题进行 佳

建模,以及如何选择模型的表达方式等方面得到了一些启示。但也不应过于夸大这方

面的作用,认为只靠良好的问题表达就能够使整数规划搜索速度有数量级的提高这种

想法也是不正确的。

3.3 使用二值变量建模

我们已经看到,一个丰富的建模环境在二值变量之外还提供了很多其他扩展实

体,在稍后我们将研究使用这些扩展实体的例子,但首先我们来讨论如何使用二值变

量进行整数规划建模。

3.3.1 是/否逻辑

二值变量的 常见用途是建模那些要么完全完成要么一点不做的行为。例如,我

们可能希望建模是否驾驶特定的某辆卡车沿着某一条特定路线来往于城市 A 和城市

B 之间。此时我们可以驾驶此卡车或不驾驶此卡车:只有这两个选择。通常我们可以

使用一个二值变量来建模是否做某一件行为的选择,做此行为则此变量为 1,不做此

行为,则此变量为 0。我们只有两个选项,必须选择其一。

也可能有一些其他属性与此行为及其二值变量相关。例如我们要考虑如何使用我

们所拥有的三辆卡车。1 号卡车载重为 20 吨,2 号卡车载重为 25 吨,3 号卡车载重

为 30 吨。如果某一天我们决定安排 1 号卡车去一个客户那里,那么要么这辆卡车完

全去客户那里,要么完全不去。因此就可以使用一个决策变量 1send (二值变量),

如果 1 号卡车去客户那里,则其取值为 1,否则为 0。类似地,我们也可以设置另一

个二值变量 2send ,如果 2 号卡车去客户那里,则其取值为 1,否则取值为 0;以及

二值变量 3send ,如果 3 号卡车去客户那里,则其取值为 1,否则取值为 0。

在模型中别的地方可能我们会希望了解当天运输出去的货物总重量,即:

321 302520 sendsendsend ⋅+⋅+⋅

如果 1 号卡车去客户那里( 11 =send ),则它将运出 20 吨货物;如果 2 号卡车

Page 55: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

44

去客户那里,则它将运出 25 吨货物;如果 3 号卡车去客户那里,则它将运出 30 吨

货物。因此当天运输出去的货物总量为 321 302520 sendsendsend ⋅+⋅+⋅ 。假定有

一个决策变量out 代表某一天离开仓库的货物总吨数。则可以得到如下方程:

321 302520 sendsendsendout ⋅+⋅+⋅=

3.3.2 逻辑条件

我们用这样的例子来演示二值变量的许多应用:我们有一组项目,每个项目都可

以决定做还是不作。我们将这些项目称为 A,B,C,D,E,F,G,和 H,对每个

项目都设置一个决策变量(一个二值变量),如果此变量值为 1,则表示我们决定做

对应的项目,如果变量值为 0,则表示决定不做对应的项目。我们将这些决策变量分

别命名为 a ,b , c , d , e , f , g ,和 h 。这样决策变量 a 如果取值为 1,则表

示我们决定做项目 A,如果 a 取值为 0,则表示我们决定不做项目 A。现在我们将用

语言描述一些约束条件,并看看如何使用这些二值变量建模这些约束条件。

3.3.2.1 在多个选项中进行选择

我们将要施加的第一个约束条件是“选择做的项目数不能超过一个”。很容易看

出,这个约束条件可以表示为:

1≤+++++++ hgfedcba

为什么是这样呢?考虑选择一个项目,例如选择项目 C。如果 c 为 1,则根据此

约束条件, a ,b , d , e , f , g ,和 h 都为 0,只有这样才能满足此约束条件。

因此如果 c 为 1,其他决策变量均为 0,则我们立刻可以看出,此约束条件表示我们

只能做一个项目。

如果约束条件是我们至多只能做三个项目,则显然我们要做的就是在上面的约束

条件表达式中将 1 换成 3,然后就可以很容易看到至多有 3 个二值变量可以取值为 1。也可以只有两个或一个变量取值为 1,甚至也可以所有变量取值均为 0。但如果有四

个或四个以上的变量取值为 1,那么肯定无法满足此约束条件。

现在假定约束条件是我们必须选择不多不少两个项目。则约束条件可以表示为:

2=+++++++ hgfedcba

由于二值变量取值只能为 0 或 1,因此必须有两个变量值为 1,其他均为 0,这

时才能满足上述约束条件。

3.3.2.2 简单蕴涵式

Page 56: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

45

现在考虑一种完全不同的约束条件。假定“如果我们做项目 A,则必须也做项目

B”,这应如何建模呢?考虑如下约束条件表达式:

ab ≥

为验证这样表示的正确性,我们考虑 a 和b 的所有四种可能组合。首先如果不做

项目 A。如果也不作项目 B,则约束条件表达式可以满足( 00 =≥= ab ),且约束

条件的文字表述也可以满足。如果做项目 B,则 01 =≥= ab ,约束条件表达式和文

字描述都满足。现在考虑如果做项目 A 的情况,即 1=a 。如果 0=b ,则不满足此

约束条件(0 不满足 1≥ 的条件);如果 1=b ,即也做项目 B,则约束条件满足。我

们可以将这些约束条件写在表格中。只有四种可能的情形:{做 A,做 B},{做 A,不

做 B},{不做 A,做 B},{不做 A,做 B},我们可以看到通过约束条件的代数表达式

可以找出其中满足约束的组合。

表格 3.1:蕴涵式约束条件的值

ab ≥ 0=a 1=a

0=b 满足 不满足

1=b 满足 满足

我们要考虑的下一个约束条件的语言表达是“如果我们做项目 A,则不能做项目

B”。这个约束条件应如何建模呢?思路是如果我们已经用二值变量 b 表示做项目 B,则可以很容易用一个变量表示不做项目 B。我们引入一个新变量:

bb −=1

其中b 表示做项目 B ,即“不做项目 B”。如果 1=b ,则 0=b (也就是说,如

果我们做了项目 B,则等于没有做“不做项目 B”),如果 0=b ,则 1=b (如果我们

没有做项目 B,则做了项目“不做项目 B”)。这种表达很方便, b 称为 b 的反

(complement)。这种技巧很常用。在上面我们已经学到如何对“如果做 A,则必须

做 B”进行建模,现在我们要建模“如果做 A,则不许做 B”,即“如果做 A,则必

须做 B ”。由于可以用 ab ≥ 来表示“如果做 A 则必须做 B”,因此我们马上可以看到,

约束条件“如果做 A,则必须做 B ”可以用将前面的约束条件表达式中的b 替换为b

来进行建模,即 ab ≥ 。将b 替换为 b−1 ,可以得到

ab ≥−1

ba +≥1

也可写成

1≤+ ba

Page 57: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

46

在得到此约束条件表达式之后,很明显可以看到,如果做了项目 A( 1=a ),则

b 必须为 0。这与我们希望模型实现的行为完全相同。上面的大段示例的目的在于,

我们使用希望建模的第一个逻辑约束的结果,加上后来引入的反的概念,从而用两个

基本的概念创建了一个更新更复杂的约束条件。在后面我们将经常按照这样思路进行

操作。

下面再给出一个例子,例如约束条件语言描述为“如果不做项目 A,则必须做项

目 B”,也就是说“如果不 A 则 B”。我们立刻可以回忆起第一个逻辑约束“如果做项

目 A,则必须做项目 B”,它可以建模为 ab ≥ 。现在将做 A 用不做 A 代替,因此可

以看到约束条件表达式应为:

ab −≥ 1

1≥+ ba

这样就得到了很清晰的约束条件。如果不做 A,则 0=a a = 0,因此 1≥b ,由

于b 的 大值为 1,那么就表示 1=b 。我们再一次通过建模“如果 A 则 B”的知识

和变量取反的概念来创建了一个更为复杂的约束条件。

下一个要考虑的约束条件是“如果做项目 A,则必须做项目 B,且如果做项目 B,则必须做项目 A”。我们可以看到,前一半可以建模为 ab ≥ ,后一般建模为 ba ≥ ,

将这二者结合起来,可以得到:

ba =

也就是说项目 A 和项目 B 必须同时选中或同时不选中,这与我们对约束条件的

语言表达完全符合。

3.3.2.3 含有三个变量的蕴涵式

我们要考虑的下一个约束条件可以表达为“如果我们做项目 A,则必须也做项目

B 和项目 C”。要注意的第一点是这实际上是两个约束条件。第一个约束条件是“如

果我们做项目 A,则也要做项目 B”,第二个约束条件是“如果我们做项目 A,则必

须也要做项目 C”。通过这样的观察,我们发现这个约束条件可以用两个不等式表达:

ab ≥ 和 ac ≥

这样如果 1=a ,则 1=b 且 1=c 。

再看看这个约束条件“如果做项目 A,则必须也做项目 B 或项目 C”。这与前一

个约束条件看上去相似,但现在的逻辑关系是“或”,而不是“与”。可以用这个表达

式来建模此约束条件:

acb ≥+

为推导出此式,请考虑下面的情况。如果 a 为 0,则 cb + 可以随意取值,这时

对b 和 c 都没有限制。如果 1=a ,则b 和 c 中必须有一个为 1,或者二者都为 1。

我们也可以尝试建模相反的情况:“如果做项目 B 或者项目 C,则必须也做项目

A”。这个例子也可以分为两个独立的约束条件:“如果做项目 B,则也必须做项目 A”

Page 58: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

47

以及“如果做项目 C,则也必须做项目 A”,因此就可以得到下面两个不等式:

ba ≥ 和 ca ≥

这样只要 1=b 或者 1=c ,则可以得到 1=a 。

下面这个约束条件则较难以建模:“如果同时做了项目 B 和项目 C,则必须做项

目 A”。这个约束条件应如何建模呢?一种思路是将它表达为此形式:“如果我们做了

B 和 C,则必须不做 A ”,或者“B,C,和 A 中至多只能选择做两项”,因此可以建

模为:

( ) 21 ≤−++ acb

也可以表示为

1≤−+ acb

或写成更常见的形式

1−+≥ cba

观察 后一个不等式我们可以发现,如果b 和 c 都为 0,或者只有一个为 1,则

对 a 没有限制,但如果b 和 c 都为 1,则 a 必须 1≥ 。一个二值变量必须大于或等于 1就意味着这个二值变量取值必须为 1。

3.3.2.4 一般蕴涵式

通过对前面的内容的总结,我们现在试图建模这个约束条件:“如果我们做 B,C,D 或 E 中的两个或两个以上,则必须也要做 A”。我们的第一个想法是这个约束

条件可能表达为

1−+++≥ edcba

显然如果只有b 和 c 等于 1,则 1≥a ,因此a 必须等于 1。但是问题是如果有三

个变量等于 1,例如b , c , d 均为 1,则约束条件称 13−≥a 即 2≥a ,这对于二

值变量 a 来说是不可能的。因此我们需要将约束变量改写为如下形式:

( )131

−+++⋅≥ edcba

括号内表达式可以取得的 大值为 3,即当 1==== edcb 时。括号前面的 1/3意味着在 糟糕的情况下 a 必须满足 1≥ (即 a 必须为 1)。但我们必须证明在其他时

候,例如 1== cb ( d 和 e 均为 0)的时候此约束条件也为真。此时我们可以得到

( )1001131

−+++⋅≥a ,即31

≥a 。但由于a 取值只能为 0 或 1,因此31

≥a 意味

着 a 必须取值为 1,这与我们期望得到的结果相同。

我们可以对此进行推广,即约束条件“如果我们做了 N 个项目(B,C,D,...)中的 M 个,则必须也要做项目 A”可以建模为如下表达式:

Page 59: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

48

11

+−+−+++

≥MN

Mdcba K

现在我们只掌握了一种建模这些约束条件的方法。现在回头看看约束条件“如果

做了B和C,则必须也要做A”,之前我们将它建模为两个约束条件,即 ba ≥ 和 ca ≥ 。

如果将这个约束条件看作前面建模的“N 件事情中的 M 件”这种约束条件的特例,

则也可以将它只建模为一个约束条件。“如果做了 B 或 C 则也必须做 A”即等同于“如

果做了 N 个项目(B,C,D,...)中的 M 个,则也必须做项目 A”,其中 1=M , 2=N 。

因此约束条件表达式为:

11

+−+−+

≥MN

Mcba ,即

11211

+−+−+

≥cba ,即

( )cba +⋅≥21

这个约束条件表达式与前面的两个约束条件对于二值变量能够起到相同的约束

作用。那么哪一种表达方式更好呢?实际上使用两个约束条件进行表达更好。但是这

两种表达方式都没有错误,如果在整数规划系统中进行求解,它们都能够得到正确的

答案。只是第 1 种,即使用两个约束条件,求解速度更快。

可以使用我们目前研究过的基本概念来构建更多更复杂的约束条件。由于这些更

为复杂的约束条件在建模实践中出现频率并不非常高,因此我们不再对其进行深入研

究。表 3.2 对我们在 3.3.2 节的各个小节中研究过的逻辑条件表达方式进行了总结。

表格 3.2:使用二值变量表示逻辑关系

至多允许做 A,B,...,H 中的一个 1≤+++++++ hgfedcba

至多允许做 A,B,...,H 中的两个 2=+++++++ hgfedcba

如果做了 A,则也应做 B ab ≥

不做 B bb −= 1

如果做了 A,则不应做 B 1≤+ ba

如果没有做 A,则应做 B 1≥+ ba

如果做了 A,则也应做 B;如果做了 B,则也应做 A ba =

如果做了 A,则也应做 B和 C ab ≥ 且 ac ≥

如果做了 A,则也应做 B或 C acb ≥+

如果做了 B或 C,则也应做 A ba ≥ 且 ca ≥

或者: ( )cba +⋅≥21

如果做了 B和 C,则也应做 A 1−+≥ cba

如果做了 B,C,D,E中两个或两个以上,则也应做 A ( )131

−+++≥ edcba

Page 60: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

49

如果做了 N个项目(B,C,D,...)中的 M 个,则也

应做 A 11

+−+−+++

≥MN

Mdcba K

3.3.3 二值变量乘积

我们接着继续建模二值变量的乘积。假定有三个二值变量 1b , 2b ,和 3b ,希望

建模这个等式:

213 bbb ⋅=

由于这个式子中有两个变量的乘积,因此它不是一个线性方程,我们需要将它表

示为线性形式。这里有一个小技巧。考虑下面三个不等式:

13 bb ≤

23 bb ≤

1213 −+≥ bbb

我们可以称这三个不等式能够代表我们希望建模的乘积表达式。为此我们写出下

面的表格 3.3。

表格 3.3:两个二值变量乘积

1b 2b 3b 213 bbb ⋅= ? 13 bb ≤ ? 23 bb ≤ ? 1213 −+≥ bbb ?

0 0 0 Yes Yes Yes Yes

0 0 1 No No No Yes

0 1 0 Yes Yes Yes Yes

0 1 1 No No Yes Yes

1 0 0 Yes Yes Yes Yes

1 0 1 No Yes No Yes

1 1 0 No Yes Yes No

1 1 1 Yes Yes Yes Yes

我们可以看到 213 bbb ⋅= ?这一列只有在 13 bb ≤ ?, 23 bb ≤ ?,和

1213 −+≥ bbb ?列均为 Yes 时才为 Yes。因此可以这三个线性表达式来代表原先的

乘积表达式,当乘积表达式为真时,这三个表达式也都为真。

用这种方法来证明乘积表达式等同于三个线性表达式显得太过于罗嗦,但在得到

这个结论后,我们可以很容易看出为什么这三个不等式是正确的。由于 3b 是 1b 与另

Page 61: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

50

一个小于或等于 1 的变量的乘积,因此 3b 总是小于或等于 1b ,同理 3b 也总是小于或

等于 2b 。唯一需要深入进行考虑的情况就是当 1b 和 2b 都等于 1 时,此时 3b 应强制等

于 1。我们可以通过约束条件 1213 −+≥ bbb 来做到这一点,这个式子在 1b 和 2b 中

只有一个为 1 或都不为 1 时对 3b 没有任何约束作用,但当 121 == bb 时即强制 3b 为

1。

通过对约束条件进行这样的分析,我们可以将乘积等式

3214 bbbb ⋅⋅=

即三个变量的乘积转化为四个约束条件:

14 bb ≤

24 bb ≤

34 bb ≤

23214 −++≥ bbbb

只要 1b , 2b ,和 3b 中有一个为 0,则 4b 为 0;但如果 1b , 2b ,和 3b 均为 1,则

4b 必须大于或等于 3-2,即 4b 必须大于或等于 1,因此 4b 此时取值为 1。

3.3.4 二分法:要么/要么约束

我们目前所接触到的约束条件都是必须同时满足的约束条件,但有些时候我们需

要建模两个约束条件中有一个满足即可的情况,而不再需要同时满足两个约束条件。

考虑这个问题:

minimize 21 xxZ +=

subject to 01 ≥x , 02 ≥x ,且

62 21 ≥+⋅ xx (约束条件 1)或者

72 21 ≥⋅+ xx (约束条件 2)

Page 62: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

51

由于只有两个变量,因此可以用图表绘出可行区域,如下图所示,灰色阴影区域

即为可行区域。

图 3.2:要么/要么约束示例

点 ( )53530 21 .Z,.x,xL === 是一个局部 优点。点 ( )333 21 === Z,x,xG 是

全局 优点。

可以使用一个新的二值变量b 对此进行建模:

bxx ⋅≥+⋅ 62 21

( )bxx −⋅≥⋅+ 172 21

为证明这样建模的正确性,我们只需要考虑下面两种情况:

0=b : 02 321 ≥++⋅ xxx 732 321 ≥⋅+⋅+ xxx 满足约束条件 2

1=b : 62 321 ≥++⋅ xxx 032 321 ≥⋅+⋅+ xxx 满足约束条件 1

3.4 二值变量“无所不能”

所有全局实体(普通整数,部分整数,半连续变量,以及两种类型的特殊有序集)

都可以表示为二值变量的形式。然而,正如本节中的例子所示,使用各个全局实体往

往更方便。

Page 63: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

52

3.4.1 普通整数

考虑一个整数变量 v ,它的取整范围是 0 到 10。我们可以使用四个二值变量 1b ,

2b , 3b , 4b 来在模型中取代这个变量,使用如下表达式:

4321 842 bbbbv ⋅+⋅+⋅+=

记住我们需要加入这个约束条件:

10842 4321 ≤⋅+⋅+⋅+ bbbb

这是对变量 v 的二进制表达。它的主要缺点是现在出现了四个全局实体,而不是

一个全局实体。此外,v 的某个整数值,例如 6,可以用二值变量的多种组合来表示。

例 如 , 6=v 可 以 通 过 { }7500 4321 .b,bbb ==== , 或 者

{ }750110 4321 .b,b,b,b ==== 来得到,还有很多其他的表达方式。这样尽管 v 是一

个整数,但它可以用小数数值的二值变量来得到,这些小数数值将迫使整数规划求解

器产生更多的分支。

由于所有的商业整数规划请求解器都允许用户使用普通整数变量,而将整数变量

分解为二值变量的组合会带来不利影响,因此通常在有了基本的整数变量之后不应再

使用二值变量。

3.4.2 部分整数

我们将稍后(3.5.3 节)再介绍如何对部分整数变量进行建模,在此之前需要先

讨论如何将二值变量与实数变量联系起来。

3.4.3 半连续(SC)变量

假定我们有一个半连续变量 s ,其取值为 0 或下界 L 和上界U 之间的数值。如

果引入一个二值变量b ,则可以将半连续变量 s 表示为如下的一对约束条件:

sbL ≤⋅

bUs ⋅≤

我们来看看为什么可以这样表示。需要考虑两种情况。一种情况是 0=b ,此时

s 值固定为 0;另一种情况是 1=b ,此时 s 值限定在 L 和U 之间。这与我们希望 s 满足的条件完全相同。

那么为什么还要使用半连续变量呢?看上去增加一个二值变量从而替换掉原先

Page 64: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

53

的半连续变量只会带来很小的惩罚。答案是变量 s 可以满足半连续性,但如果引入了

一个二值变量,则此二值变量的整数性就可能无法满足。考虑当 s 取值为 0 或 5 到

10 之间的实数值。假定我们对线性规划松弛进行求解,得到 s 值为 7.5,b 值为 0.75。这当然能够满足上面的两个不等式,但是分支定界法搜索会认为二值变量不满足要求

(其值应为 0 或 1),因此我们将会继续进行分支定界搜索。但是 s 的半连续性实际

上已经得到了满足, s 的确位于其下界 5 和上界 10 之间,因此不再需要对 s 进行进

一步分支。因此如果建模语言或优化器没有半连续变量这一特性,则在分支定界搜索

过程中可能会产生更多的分支和定界处理,因此如果你需要使用半连续变量,则应该

寻找一个内建有此特性的优化器。

3.4.4 1 类特殊有序集(SOS1 或 S1)

1 类特殊有序集是一个变量的集合,其中至多只允许有一个变量取值为正数值,

其他变量取值均为 0。1 类特殊有序集 常用于一组变量都是 0-1 变量的情况:也就

是说,我们需要从一组候选对象中进行选择。例如当我们需要选择计划修建的工厂的

大小时,需要从小型,大型,或甚至不修建工厂中进行选择,此时就可以使用 1 类

特殊有序集,可以从其中选择一个,且只能选择一个。

举一个较为具体的小例子,假定我们在考虑修建一家工厂,选项 S 代表小型工厂,

M 代表中型工厂,B 代表大型工厂,N 代表不建造工厂。可以通过引入四个二值变

量 Sb , Mb , Bb ,和 Nb 来对此进行建模,并将只能选择一个选项这一事实建模为如

下等式:

1=+++ BMSN bbbb

显然,由于这些二值变量之和为 1,因此其中必定有且只有一个取值为 1。因此

满足 1 类特殊有序集的性质。

如果特殊有序集只是这样的东西,那么它算不上什么发明。但是我们忘了“有序”

这个词,因此实际上还有很多文章可做。假定不同大小的工厂的生产能力分别为小型

工厂 10,000 吨,中型工厂 20,000 吨,大型工厂 38,000 吨,当然“没有工厂”的生

产能力就是 0 吨。我们对于选择建造的工厂的生产能力会比较感兴趣,因此在模型

中我们将加入一个决策变量 size,且有如下方程式:

BMSN bbbbsize ⋅+⋅+⋅+⋅= 3800020000100000

我们可以使用这个等式(称为参考行,reference row)中的系数来对变量进行

排序。按照在参考行中的系数,得到排序顺序为 Nb , Sb , Mb , Bb 。现在假定已经

对线性规划松弛进行了求解,得到的解为:

50.bN = , 0=Sb , 0=Mb , 50.bB =

这表示我们要建造半个生产能力为 0 的工厂以及半个大型工厂(请记住这是在

Page 65: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

54

对二值变量的整数性进行松弛后得到的线性规划松弛的解)。

图 3.3:SOS 分支树

分支定界搜索将查看此解,发现只有两个小数变量,即 Nb 和 Bb ,因此将开始对

这两个变量中的某一个进行分支搜索。但是除了是否为小数之外,这些变量还有很多

信息。线性规划解告诉我们所要求的工厂生产能力是 大型工厂生产能力的一半:即

19,000 吨。如果继续进行分支,例如对 Nb 进行分支。则如果得到 Nb 为 1,则将不会

开办工厂,工厂生产能力为 0。但如果分支方法明白前面的结果表示工厂生产能力为

19,000 吨,并对此信息加以利用,那么情况就会好得多。而这正是分支定界树能够

从特殊有序集的性质中得到的信息,分支将针对特殊有序集中的一组变量进行,而不

是对每个变量分别进行。关于如何对一组变量进行分支而不对每个变量分别分支不属

于本书的讨论内容。然而,可以观察到使用特殊有序集对这些选择约束条件进行建模

通常能够使分支定界搜索速度更快。与普通整数变量一样,无论我们选择何种建模方

法,都能得到相同的解。使用特殊有序集的“唯一”优点是通常能够显著加快搜索过

程。

3.4.5 2 类特殊有序集(SOS2 或 S2)

2 类特殊有序集通常用于对但变量函数的分段逼近进行建模。下图是一个例子。

我们希望将 f 表示为 x 的函数,并准备考虑在五个点之间的四段线段。这五个

点是 ( )11 F,R , ( )22 F,R , ( )33 F,R , ( )44 F,R , ( )55 F,R 。对于每个点 i 都有一个相

关的权值变量 iy 。对于每个区间 ( )21 R,R , ( )32 R,R , ( )43 R,R , ( )54 R,R 都有一个

对应的二值变量 ib 。如果值 x 位于 iR Ri 和 1+iR 之间,则 ib 为 1。这样就可以得到:

∑=

⋅=5

1iii yRx (参考行)

Page 66: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

55

∑=

⋅=5

1iii yFf

15

1

=∑=i

iy

图 3.4:使用 SOS2 进行函数逼近

2 类特殊有序集的性质是至多有两个非零的 iy ,且如果有两个非零的 iy ,则它

们必须相邻,即我们总是在一个分段线性的函数上。如果没有相邻条件,则在例如

5031 .yy == (其他均为 0)时,在 2Rx = 时就会出现这样的错误:函数值不是 2F ,

而是 ( ) 231 /FF + ,后者比前者要小得多(如图 3.5)。

Page 67: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

56

图 3.5:使用 SOS2 进行函数逼近:相邻性条件

考虑这样的约束条件:

14321

45

434

323

212

11

=+++≤

+≤+≤+≤

bbbbby

bbybbybby

by

后一个约束条件保证了在可以接受的解中有且只有一个 ib 为 1。例如,如果 3b

为 1,则对 iy 的约束使得 0521 === yyy ,而只有相邻的 3y 和 4y 可能取非零值。

另一种需要考虑的情况是有一个端点的 ib 为 1,例如 1b 为 1。此时 0543 === yyy ,

而 1y 和 2y 可能取非零值,它们也是相邻的。因此这样的约束条件保证了 2 类特殊有

序集的性质能够得到满足,但引入了 1−N 个新的二值变量, N 为点的数目。

与在 1 类特殊有序集中的结论类似,使用 2 类特殊有序集也能够减少搜索时间。

在实践中发现,对 2 类特殊有序集中的变量子集进行分支而不是对每个二值变量分

别进行分支通常都能带来更好的效果。

3.5 联系实数变量与二值变量

3.5.1 建模固定成本

我们要考察的第一个例子是希望对固定成本进行建模,即当某个实数变量 x 超过

0 时,即会出现固定成本 K 。此固定成本 K 可能代表机器安装的成本——如果不安

装此机器则不会遇到此成本,但只要此机器的生产能力 x 大于 0,则必须首先安装机

器,即产生固定的成本。

成本与生产能力 x 之间的关系可以用下图表示。

Page 68: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

57

图 3.6:结合固定成本和可变成本

这里 x 表示某一设备的生产能力,成本由两部分组成。如果生产能力为 0,则成

本也为 0。但如果生产能力为非 0 值,则成本为 xCKCost ⋅+= ,其中C 是生产 x单位产品的单位成本。

我们引入一个二值变量b ,当 x 为 0 时b 取值也为 0,当 x 大于 0 时,b 取值为

1。则成本可以表示为 xCKb ⋅+⋅ ,但我们需要保证当 x 为 0 时b也为 0。

可以引入下面这个约束条件:

bXx max ⋅≤

其中 maxX 是 x 可以取的 大值。

我们来研究以下为什么可以这样表示。如果b为 0,则 x 取值限制为小于或等于

0,因此 x 取值为 0;如果b为 1,则约束条件为 maxXx ≤ ,即 x 不会超过它的 大

值(可能是特定设备的 大生产能力)。

3.5.2 计数

在建模时如果我们希望能够了解某个实数变量 x 是否为 0,则会频繁使用到二值

变量。通常我们希望限制只有一定数目的实数变量取值可以大于 0。

例如我们有许多原料,要将它们混合起来,我们限定至多允许使用 10 种原料进

行混合。如果进行混合的原料量为 ix ,我们要求至多有 10 个 ix 可以为非零,因此对

每种原料 i 我们可以引入一个二值变量 ib ,从而得到如下形式的约束条件:

ii bVOLx ⋅≤

其中VOL是要生产的混合物总量。这些约束条件能够保证如果某种原料量 ix 大

Page 69: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

58

于 0,则对应的 ib 必须为 1。这样限定原料总数不许超过 10 种的约束条件可以表示

为:

1010

1

≤∑=i

ib

3.5.3 部分整数变量

在前面我们决定将如何使用二值变量来表示部分整数变量的讨论推迟到后面。部

分整数变量指这样的变量:在可以接受的解中,如果此变量值小于某个界限,则必须

取整数值;否则可以取实数值。部分整数变量 p 可以很自然地表示为下面的形式:

xvp +=

其中变量 v 是一个整数,其大小必须小于或等于上界U (即 Uv ≤≤0 ), x 是

一个实数变量。我们已经看到整数变量 v 可以使用二进制扩展表示为若干个二值变

量。现在我们要表达出如果 v 严格小于U 时则 x 必须为 0 这一事实。假定我们已经

知道 x 有一个上界 maxX ,则可以引入一个新的二值变量b 以及如下的约束条件:

bXx max ⋅≤

U/vb ≤ (或 bUV ⋅≥ )

为证明此表达式的正确性,请考虑 b 的两种可能取值。首先,如果 0=b ,则

0≤x ,即 x 等于 0,且 0≥v 。

如果 1=b ,则 maxXx ≤ , Uv ≥ ,结合 Uv ≤ 这一事实可以得到 Uv = 。

因此,如果 1=b ,则 v 取 大值,那么就可以为 x 取任意的非 0 值。

与普通整数变量的情况相同,用二值变量表示部分整数变量的代价有些过于昂

贵。首先我们需要将整数部分表示为二值变量的组合,然后需要引入一个新的二值变

量b 来建模变量 p 的半整数性。此外,与半连续变量类似,引入新的二值变量不会

让分支定界搜索速度更快,而是经常可能让搜索速度降低。

考虑如下面这个例子。假定 10=U ,线性规划求得 v 的 优值为 3,x 的 优值

为 0,但二值变量b 的值为 0.3。可以看到,此结果满足我们所列出的所有不等式,

但是二值变量b 是一个小数值,因此需要对b 进一步进行分支来满足其整数性。但是

只要满足部分整数性,得到的变量 v 值就是可行值,因此可能会出现这样的情况:使

用部分整数变量能够得到整数可行解,但引入二值变量就无法得到整数可行解,而需

要进一步进行分支。在含有很多部分整数变量的模型中,这种效果可能会使分支定界

树大小显著膨胀,使搜索速度延长很多。

Page 70: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

59

3.5.4 价格间断与销售经济学

请考虑图 3.7 中的情形,此图表示如果我们购买一定数目的物品,则根据所购买

的数目是否位于特定的价格区间中,从而对购买的所有物品都得到一定的价格折扣。

图 3.7:商品折扣

在此图中可以看到,如果购买的物品数目位于 0 和 1B 之间,则每件物品需要支

付 1COST ,如果购买的物品数目位于 1B 和 2B 之间,则每件物品值需要支付 2COST 。

后如果我们购买的物品总数位于 2B 和 3B 之间,则每件物品只需要支付 3COST 。

为让例子显得更切实一点,假定我们购买了恰好 1B 件物品,则单位价格为 2COST ,

而如果定购的物品数目略少于 1B ,则单位价格为 1COST ,对于其他价格间断点也相

同。这种定价方法称为所有物品折扣定价(all item discount pricing)。

为对这些价格间断进行建模,我们需要使用三个二值变量 1b , 2b ,和 3b ,如果

我们购买的产品单位价格为 iCOST ,则 ib 为 1。

现在引入实数决策变量 1x , 2x ,和 3x ,分别表示以价格 1COST , 2COST ,和

3COST 购买的产品数目。注意,如果不首先以较高的价格 1COST 购买足够的产品,

则无法以价格 2COST 购买产品,不然的话我们的决策就很简单了:只需要以 低的

单位价格购买所有物品。

我们所购买的物品总数 x 为:

321 xxxx ++=

Page 71: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

60

下面这个约束条件模型就对上述所有物品折扣进行了建模:

11121 bBxbB ⋅≤≤⋅ (3.5.1)

( ) ( ) 2122312 bBBxbBB ⋅−≤≤⋅− (3.5.2)

( ) 3233 bBBx ⋅−≤ (3.5.3)

321 bbb ≥≥ (3.5.4)

方程(3.5.1)称,如果我们购买了第二个价格范围内的任何物品( 121 == bb ),

则 1x 就固定为 1B 。方程(3.5.2)保证当 02 =b 时 02 =x ,且当 12 =b 时 2x 的上限

为可以以价格 2COST 购买的产品数目。方程(3.5.3)保证当 03 =b 时 03 =x ,且当

13 =b 时购买的产品总数不能超过以价格 3COST 购买的产品数上限。方程(3.5.4)

保证只有在以较高价格进行购买之后才能以较低价格进行购买。

图 3.8:递增的价格断点

现在请考虑图 3.8,此图示意了随着购买的产品数目发生变化我们得到的折扣如

何变化。当 0 到 1B 数目之间的产品每件需要花费 1C , 1B 到 2B 之间的产品每件需要

花费 2C , 2B 到 3B 之间的产品每件需要花费 3C 。

我们可以用 2 类特殊有序集来对此进行建模。在点 0, 1B , 2B ,和 3B ,我们引

入实数值决策变量 iw ( 3210 ,,,i = )。我们也定义费用支出断点 iCBP ,分别对应于

购买 0, 1B , 2B ,和 3B 数目的产品的总支出。因此有:

Page 72: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

61

( )( )23323

12212

111

0 0

BBCCBPCBPBBCCBPCBP

BCCBPCBP

−⋅+=−⋅+=

⋅==

这样就可以得到:

3322110

3322110

3210

00

1

wBwBwBwxwCBPwCBPwCBPwTotalCost

wwww

⋅+⋅+⋅+⋅=⋅+⋅+⋅+⋅=

=+++

iw 组成一个 2 类特殊有序集,其参考行系数即 x 的定义中的系数。

若希望得到正确解,则至多有两个 iw 为非零,且如果有两个非零,则它们的顺

序必须连续,因此就定义了其中的一段线段。

3.5.5 二值变量和实数变量的乘积

如果有两个实数变量 x 和 y ,以及一个二值变量b ,我们希望建模如下关系:

xby ⋅=

假定 x 的值存在上界U ,则考虑如下约束条件:

xy ≤ (3.5.5)

( )bUxy −⋅−≥ 1 (3.5.6)

bUy ⋅≤ (3.5.7)

如果 0=b ,则(3.5.7)表示 0=y 。如果 1=b ,则(3.5.7)不会带来任何影

响,且可以从(3.5.5)得到 xy ≤ ,从(3.5.6)得到 xy ≥ ,即 xy = ,这与我们希

望表达的效果一致。

3.6 参考文献和进阶阅读

在第 1 章的参考文献部分列出的大部分著作中都也包含一部分关于整数规划的

内容,例如 Schrijver 的著作[Sch86]。Wolsey 的专著[Wol98]是一本关于整数规划的

优秀教科书读物。Papadimitriou 和 Steiglitz 的关于组合优化的著作[PS98]中也涉及

到这一主题。Syslo 等人的著作[SDK83]中给出了一些算法的 Pascal 代码。

Page 73: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

62

分支定界法的概念来自于 Land 和 Doig 的论文[LD60]。对于一些规模巨大的问

题,此算法可以与列生成法联合使用,即得到分支定价算法,请参考[BJN98]以了解

此算法的详细介绍和其主要应用领域。

特殊有序集的概念是由 Beale 等人提出的([BT70]和[BF76])。对于半连续变量,

请参考 Ashford 和 Daniel 的著作[AD93]。

与线性问题的预求解相似,现代的商业混合整数规划软件通常也会首先采取一些

措施以得到更好的问题表达,然后再进入分支定界搜索,有时对搜索树的节点也会采

取一些预处理措施。所使用的技术可以总结为整数预处理(integer preprocessing)和割生成(cut generation)。整数预处理的目的是削减问题的规模,并根据整数性的

考虑对边界进行收缩;请参考[Sav94]了解通常所采用的方法概况。割生成方法能够

生成附加的约束条件(合法的不等式,割平面,或普通意义上的割),从而使问题表

述更为紧凑:这些割不会改变混合整数规划的解,但能使线性规划松弛与混合整数规

划更接近。与割相关的研究是目前的一个十分活跃的领域(例如[GP01]和[MW01])。割是根据识别出特定的数学结构来得到的,但用户也可以通过指定所谓的模型割

(model cut,请参考 10.4 节中的例子)来对此给予一定“帮助”。

如 3.2 节中所述,为有效求解大型应用,可能需要对求解器提供的各种不同搜索

策略进行实验。在[LS98]中对搜索策略进行了计算理论的研究。整数规划算法近年来

发展迅速[JNS00]:现在已经能够求解具有数千个离散变量的问题。然而,某些类型

的问题仍然十分棘手,例如在[CD99]中给出的例子,在该例子中,如果问题实例的

变量数超过 40 个,就无法采用现有的商业求解器进行求解。

另一种完全不同的表述和求解具有离散变量的问题的方法是约束规划

(constraint programming,CP)[VH98]。在 Marriott 和 Stuckey 的著作[MS98]中对

约束规划进行了介绍。(混合)整数规划中的许多概念在约束规划中都能找到对应部

分,反之亦然;Heipcke 在[Hei99b]中对这两个领域中 常见的术语进行了比较和解

释。使用约束规划常常能够相对容易地找到问题的可行解,但很难证明此解为 优解

(混合整数规划中的线性规划松弛所提供的边界信息在约束规划中找不到对应内

容)。另一个十分活跃的研究方向是将这两种方法结合起来,找到它们的互补之处,

从而使在约束规划中也能够处理连续变量(请参考[BDB95],[RWH99],[BK98],和

[Hei99a]以了解相关进展)。

Page 74: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

63

第 4 章 二次规划

二次规划(quadratic programming,QP)是指在线性等式或不等式约束条件下

寻找决策变量的二次函数的 小(或 大值)。注意在二次规划问题中不允许约束条

件中出现二次项,只允许在目标函数中出现二次项。与线性规划或混合整数规划问题

相比,二次规划问题出现得较少,因此我们将只对它进行简略介绍。

混合整数二次规划(mixed integer quadratic programming,MIQP)是指其中

一个或多个决策变量需要取离散值的二次规划问题,即是具有目标函数为二次函数的

混合整数规划问题。离散约束条件可以是我们前面讨论过的任何全局对象(二值变量,

整数变量等)。

由于二次规划只是目标函数为二次函数的线性规划,因此其唯一的特殊点是对目

标函数的建模。我们下面给出两个典型的例子。

4.1 销售额优化

如果有一家公司希望销售总量为 q 的产品,并且同时要决定产品的单价 p ,则

目标函数中将出现一个二次项 qp ⋅ ,即代表产品的销售金额(价格×销量)。

4.2 投资优化

投资优化是一个经典的二次规划问题。如果投资者可以将资金投向多种不同的投

资项目,则他要面临的问题就是在得到一定的回报的前提下使风险 小化。在这个问

题中需要明确考虑到,由于各个投资项目的未来前景之间可能会有很强的相关性,如

股市中的各支股票经常会一起涨跌,在同一个行业内的各支股票更是有很强的相关性

等,因此整体风险不等于各个投资项目风险之和。可以使用一支股票过去的涨跌稳定

性来估测此股票的风险。

我们来看一个小例子。假定我们有 1 百万元,可以投资到三支股票上。设随机

变量 iR 表示投资到股票 i 上的一元钱每年能够带来的收益。通过对历史数据进行分

析,我们可以得到各支股票的收益期望值为 ( ) 0901 .RE = , ( ) 0702 .RE = ,

( ) 0603 .RE = ,其中 ( )xE 表示 x 的期望值。年度收益的方差估测为 ( ) 2001 .Rvar = ,

( ) 2002 .Rvar = , ( ) 1503 .Rvar = , 协 方 差 为 ( ) 03021 .R,Rcov = ,

( ) 04031 .R,Rcov = , ( ) 05032 .R,Rcov = 。

Page 75: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

64

如果 ix 是向第 i 支股票投资的金额(百万元),则每年收益为:

332211 RxRxRx ⋅+⋅+⋅

每年收益期望值为:

( ) ( ) ( )332211 RExRExREx ⋅+⋅+⋅

如果希望收益率至少为 7.5%,则应有:

0750060070090 321 .x.x.x. ≥⋅+⋅+⋅

对于投资支出的约束条件为:

1321 =++ xxx

我们希望 小化投资收益的标准差,即:

( ) ( ) ( ) ( )( ) ( )( )( ) ( ) ( )

( ) ( )( )

323121

23

22

21

3232

31312121

3232

221

21

3322

33112211

332211332211

100080060150070200

222

222

xx.xx.xx.x.x.x.

R,RcovxxR,RcovxxR,Rcovxx

RvarxRvarxRvarx

Rx,RxcovRx,RxcovRx,Rxcov

RxvarRxvarRxvarRxRxRxvar

⋅⋅+⋅⋅+⋅⋅+⋅+⋅+⋅=

⋅⋅+⋅⋅+⋅⋅+⋅+⋅+⋅=

⋅⋅⋅+⋅⋅⋅+⋅⋅⋅+

⋅+⋅+⋅=⋅+⋅+⋅

ix 须满足一般的非负约束。因此我们可以得到一个二次规划问题:目标函数中

存在二次项(不存在线性项,这在一般的二次规划问题中是允许的),同时约束条件

均为线性等式/不等式。

4.3 参考文献和进阶阅读

许多关于数学规划或运筹学的著作中都有二次规划的相关内容。Flectcher 的著

作[Fle87]可以作为一本很好的综合参考。Beale 也著有一本完全关于二次规划的专著

[Bea59]。

二次规划问题出现的频率远低于线性规划或混合整数规划问题,因此我们将只给

出一个应用实例(第 13.7 节)。

Page 76: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

65

第 2 部分 应用实例

Page 77: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

66

应用实例问题分类

这一部分中的应用实例问题按照应用领域组织为 10 章内容。

第 6 章:采矿和加工业 第 7 章:调度问题 第 8 章:规划问题 第 9 章:装载和切割问题 第 10 章:陆路运输 第 11 章:航空运输 第 12 章:电信业问题 第 13 章:经济和金融 第 14 章:时间表制定与人员安排 第 15 章:地方政府和公共服务部门

在下面的表格中列出了这些例子的概要信息,包括其分类(理论问题类型),从*(容易)到*****(困难)的分级,一些建模细节,以及所用到的超出第 5 章介绍的基

本内容之外的 Mosel 特性。如果分类为“NN”,则表示这个例子不对应于任何已知

的标准类型,即此问题可能是多个标准类型的混合体,或具有一些针对特定应用的特

点,使得无法对其进行分类。

在表格中列出了每个问题的引用标号,可以根据此标号找到该问题的 Mosel 实现文件。例如,问题 A-1 合金制造对应的 Mosel 文件为 a1alloy.mos,此问题的数据

位于文件 a1alloy.dat 中。同一章的所有应用实例都以相同的字母开头,后面的数字

对应于在此章中的节号。

Page 78: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

67

表格 4.1:应用实例分类(第 6、7 章)

问题名称和类型 难度 特点

A-1 合金制造

混合问题 * 混合约束条件的数学表达;用数字索引的数据,打印输

出求解结果,if-then 语句,getsol 函数

A-2 动物饲料制造

混合问题 * 混合约束条件的数学表达;用字符串索引的数据,关键

字 as,格式化打印输出,对线性表达式使用 getsol 函

数,strfmt 函数

A-3 石油精炼

混合问题 ** 混合约束条件的数学表达;用字符串索引的稀疏数据,

动态初始化,动态数组,finalize,create,集合的并集

A-4 蔗糖生产

小费用流 * ceil,is_binary

A-5 露天采矿

小费用流 ** 弧编码,求解线性规划松弛

A-6 电力生产

分发问题 ** 内联的 if,is_integer

B-1 体育馆建造

工程规划(势方法) *** 2 个问题;使用“|”进行选择,稀疏/致密格式,命名

和重定义约束条件,用于打印输出求解结果的子程序

(procedure),forward 声明

B-2 流水线车间调度

流水线车间调度 *** 使用一类特殊有序集进行表示

B-3 任务车间调度

任务车间调度 *** 互斥关系的表达(BigM);dynamic array,range,exists,

forall-do

B-4 瓶颈机器上的任务排序

单机器调度 *** 3 个不同的目标;用于打印输出求解结果的子程序

(procedure),if-then

B-5 油画制造

非对称旅行商问题(TSP) *** 求解结果打印,repeat-until,integer 类型转换,使用

“|”进行选择,round

B-6 生产线平衡

生产线平衡 ** 弧编码,range

Page 79: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

68

表格 4.2:应用实例分类(第 8、9 章)

问题名称和类型 难度 特点

C-1 自行车生产规划

单类产品生产规划 *** 建模库存平衡约束条件;内联的 if,forall-do

C-2 玻璃杯生产规划

多类产品生产规划 ** 建模库存平衡约束条件;内联的 if,0 作为索引

C-3 物料需求规划

物料需求规划(MRP) ** 使用索引(子)集,动态初始化,finialize,create,

as

C-4 电子元件生产规划

多类产品生产规划 ** 建模库存平衡约束条件;内联的 if

C-5 玻璃纤维生产规划

具有时间相关的生产成本的

生产规划

*** 将多时期生产表示为流;弧编码,exists,create,

isodd,getlast,内联的 if

C-6 将产品生产批次分配到机器

推广的分配问题 *

D-1 货车载荷平衡

并行机器上的非抢先任务调

度问题

**** 使用排序算法的启发式求解方法; 大化 小值

目标函数的表达;内嵌的子程序:function 返回

启发式方法求得的解,排序过程,ceil,getsize,

if-then,break,exit,所有循环类型(forall-do,

repeat-until,while-do),setparam,截断值

D-2 驳船装载

背包问题 ** 三个目标函数问题的增量式问题定义,调用过程

打印输出求解结果

D-3 储存罐注入

装载问题 *** 2 个目标函数;数据预处理,as,动态创建变量,

调用过程打印输出求解结果,if-then-else

D-4 文件备份

装箱问题 ** 2 个版本的数学模型,打破对称性;数据预处理,

ceil,range

D-5 金属板切割

覆盖问题 *

D-6 为制作课桌切割金属棒

切割问题 ** 对范围集合的集合运算,set of integer(使用数

据作为集合内容)

Page 80: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

69

表格 4.3:应用实例分类(第 10、11 章)

问题名称和类型 难度 特点

E-1 汽车租赁

运输问题 *** 数据预处理,集合运算,sqrt 和^2,if-then-elif

E-2 选择运输方式

小费用流 ** 添加结点以表示运输方式;弧编码,finalize,集合的

并集,用字符串标记的结点

E-3 仓库位置选取

设施选址问题 *** 将流建模为小数,定义模型剪辑

E-4 燃油运输

车辆路径安排问题(VRP) **** 消除不可行的子循环,模型剪辑,使用“|”进行选择,

定义模型剪辑

E-5 组合使用不同运输方式

NN *** 模型的隐含条件,边界约束的强表达和弱表达,索引

三元组

E-6 货车车队规划

NN *** maxlist,minlist,max,min

F-1 枢纽处的航班连接

分配问题 *

F-2 机组编成

二元匹配 **** 两个问题,数据预处理,增量式定义数据数组,弧编

码,(累积的)逻辑 or,逻辑 and,调用过程打印输

出求解结果,forall-do,max,finalize

F-3 航班着陆调度

具有时间窗口的调度问题 *** 将模型推广至任意的时间窗口;计算指定的 BigM,

forall-do

F-4 航空公司枢纽选择

枢纽选择问题 *** 索引四元组;改进的表达方式(学生版本的 Xpress

软件无法求解第一个模型),索引(范围)集合的并

F-5 规划空运航线

对称旅行商问题 ***** 循环求解,旅行商问题子循环消除算法;调用过程来

生成新的约束条件,递规调用子程序,使用集合,

forall-do,repeat-until,getsize,not

Page 81: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

70

表格 4.4:应用实例分类(第 12、13 章)

问题名称和类型 难度 特点

G-1 网络可靠性

具有单位通过量的 大流问

*** 弧编码,range,exists,create,打印路径的算法,

forall-do,while-do,round

G-2 移动电话网络设计

NN ** if-then,exist

G-3 电话路由设计

多物品网络流问题 *** 路径编码,finalize,getsize

G-4 有线网络建设

小权重生成树问题 *** 加入约束条件以排除子回路

G-5 卫星通信调度

有抢先开放式车间调度 ***** 数据预处理,涉及迭代优化的有抢先调度算法,打印

Gantt 图

G-6 GSM 基站选址

覆盖问题 * 建模等价关系;稀疏数据格式

H-1 贷款选择

NN * 计算净现值

H-2 广告宣传

NN * forall-do

H-3 投资项目选择

NN ** 整数集合,使用半连续变量表达模型,参数

H-4 为提早退休计划筹资

NN ** 内联的 if,使用“|”进行选择

H-5 家庭预算

NN ** 在各种支出频率不同的情况下使每月预算收支平衡;

as,mod,内联 if,使用“|”进行选择

H-6 发展计划选择

NN ** 对解决方案进行实验:显式求解线性规划问题,四舍

五入到 接近的整数,然后再次求解

H-7 基于均方差的投资方案选择

二次规划问题 *** 参数,forall-do,min,max,对问题求解进行循环

Page 82: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

71

表格 4.5:应用实例分类(第 14、15 章)

问题名称和类型 难度 特点

I-1 为机器分配操作员

分配问题 **** 大化 小值目标函数的表达;启发式求解,求解两

个不同的问题(增量式定义),集合操作,while-do,

forall-do,负索引值

I-2 制定护士工作时间表

NN *** 两个问题,使用 mod 来表达循环调度;forall-do,整

数的集合

I-3 制定教学课程表

NN *** 多个特有的约束条件,巧妙的目标函数(伪目标函

数);finalize

I-4 考试时间安排

NN ** 破除对称性,无目标函数

I-5 结合人员分配的生产规划

NN *** 2 个问题,通过重定义部分约束条件(有命名的约束

条件)来进行增量式问题定义,exists,creat,dynamic

array

I-6 建筑工地人员规划

NN ** 使用内联的 if 表示平衡约束条件

J-1 供水管理

大流问题 ** 弧编码,finalize,使用“|”进行选择

J-2 闭路电视监控

大结点覆盖问题 ** 网络的编码,exists

J-3 选区划分问题

划分问题 **** 数据预处理算法;文件包含,3 个嵌套/递规的过程,

集合操作,if-then,forall-do,exists,finalize

J-4 路面铺沙

有向中国邮递员问题 **** 寻找欧拉路径的算法,打印输出图的算法;弧编码,

dynamic array,exists,实现欧拉回路算法的两个函

数,round,getsize,break,while-do,if-then-else

J-5 所得税征收点位置选取

p-中位问题 **** 建 模 隐 含 关 系 , 任 意 两 点 间 短 路 径 算 法

(Floyd-Warshall 算法);dynamic array,exists,

短路径算法的过程,forall-do,if-then,使用“|”进

行选择

J-6 医院效率评估

数据包络分析(DEA) *** DEA 方法介绍;循环求解问题,每次对问题都进行

完全重定义,finalize,约束条件命名和声明

Page 83: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions
Page 84: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

73

第 5 章 Xpress-MP 基础

本书中的所有问题都将使用 Xpress-Mosel(简称为 Mosel)语言进行描述。为

运行这些模型,用户可以选择使用 Mosel 命令行解释器或使用图形用户界面

Xpress-IVE。为求解本书中的优化问题,我们在 Mosel 程序代码中使用了

Xpress-Optimizer 线性和混合整数求解器。

你可以在以下地址下载所有必需的软件和参考手册以及本书中所讨论的所有问

题的模型代码:

http://www.dashoptimization.com/applications_book.html

在本章的第一节,我们将介绍如何使用 Mosel 命令行界面或 Xpress-IVE 来运行

第一章中描述的生产计划问题。在第 5.2 节中将介绍 Mosel 语言的基本特性。

5.1 引例

有一个木匠制作两种不同大小的黄杨木棋子。小型棋子生产一套需要车床加工 3小时,大型棋子生产一套需要车床加工 2 小时。木匠作坊内有 4 台车床和 4 名熟练

操作员,每人每周工作 40 小时,因此每周车床工作总时间为 160 小时。小型棋子一

套需要 1 千克黄杨木,大型棋子一套需要 3 千克黄杨木。很不幸的是,黄杨木现在

很稀缺,每周只能得到 200 千克。在售出后,每套大型棋子可以得到 20 元利润,每

套小型棋子可以得到 5 元利润。要解决的问题是每周应生产每种类型的棋子各多少

套才能使利润 大。

在第 1 章中,我们已经详细描述了将此问题描述转化为数学模型的过程,因此

在此不加以复述。前面也已经给出了模型的具体实现(请参考 1.3 节)。我们将下面

的 Mosel 模型输入到一个文本文件中,并将其命名为 chess.mos(.mos 是 Mosel 语言文件的标准扩展名):

model Chess

uses "mmxprs" ! 将使用 Xpress-Optimizer

declarations

xs, xl: mpvar ! 决策变量:每种棋子生产的套数

end-declarations

Profit:= 5*xs + 20*xl ! 目标函数

Boxwood:= 1*xs + 3*xl <= 200 ! 可用的黄杨木千克数

Lathe:= 3*xs + 2*xl <= 160 ! 可用车床工时数

maximize(Profit) ! 求解此问题

Page 85: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

74

writeln("LP Solution:") ! 打印输出求解结果

writeln(" Objective: ", getobjval)

writeln("Make ", getsol(xs), " small sets")

writeln("Make ", getsol(xl), " large sets")

end-model

5.1.1 使用 Xpress-Mosel

Mosel 是一种高级建模和求解语言及环境,在其中你可以定义优化问题,并求得

精确 清晰的解。Mosel 的建模组件为描述优化问题提供了一种简单而强大的语

言。借助于模块化的结构,Mosel 能够访问以不同格式存储的数据(包括电子表格和

数据库),并使用各种求解器,从而为问题找到 优或近 优的解答。Mosel 可以发

布为单独的程序(如本书中使用的命令行解释器),或者发布为一个程序库,从而可

以将模型嵌入到使用其他编程语言编写的大型应用程序中。

为运行我们输入到文件 chess.mos 中的模型,首先需要在命令行窗口中启动

Mosel,然后输入如下命令:

mosel exec chess quit

这些命令将启动 Mosel,对模型进行编译,然后(如果没有发现语法错误)运行

此模型, 后退出 Mosel。我们将看到输出如下内容,注意这里我们将 Mosel 的输

出用加粗显示。

mosel ** Xpress-Mosel ** (c) Copyright Dash Associates 1998-2002 > exec chess LP Solution: Objective: 1333.33 Make 0 small sets Make 66.6667 large sets Returned value: 0 > quit Exiting.

你也可以只输入如下的命令就实现和上面一样的操作效果:

mosel -c "exec chess"

-c 选项后面应加上放在引号内的命令列表。

如果在启动了 Mosel 之后,Mosel 命令行解释器无法识别你所输入的命令(例

如输入 h),则 Mosel 会列出所有可用的命令(或应追加何内容才能使命令正确),并

附有简短的解释。

Page 86: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

75

可以通过输入 mosel -h 来了解在命令行中可以使用的命令。

Mosel 发行包中包括若干个模块,这些模块可以为此语言增加新的功能。你可以

通过使用 exam 命令来查看一个模块的所有功能,例如若需了解 Xpress-Optimizer模块 mmxprs 提供了什么功能,你可以输入:

mosel -c "exam mmxprs"

若需了解 Mosel 语言和 Mosel 命令行解释器的完整介绍,请参考 Mosel 参考手

册,你可以在如下地址下载到此手册:

http://www.dashoptimization.com/applications_book.html

在此地址中你也可以下载到每个 Mosel 模块的手册。

5.1.2 使用 Xpress-IVE

Xpress-IVE,有时也简称为 IVE,是 Xpress 交互可视环境(Interactive Visual Environment)的简称,它是一个运行于 Microsoft Windows 操作系统上的完整的建

模和优化开发环境。在其中将为 Mosel 语言提供一个易于使用的图形用户界面

(GUI),并带有一个内建的文本编辑器。IVE 可以用于开发,管理,和执行多个模

型,是开发和调试原型模型的理想工具。

为在 IVE 中执行模型文件 chess.mos,你需要进行如下操作:

♦ 启动 IVE。 ♦ 通过菜单 File->Open 打开此模型文件。模型的源代码将显示于中央窗口中

(IVE 编辑器)。 ♦ 点击 Run 按钮(绿色三角形),或者点击菜单 Build->Run。此时屏幕应显

示如图 5.1 的内容。

在编译开始之后,工作区底部即自动显示编译信息窗口。如果在模型中发现存在

语法错误,则将在这里给出提示,在其中将显示发现错误的详细行列位置,并给出问

题的描述(如果有)。点击此错误信息,编辑器将转到显示出错的行。

在模型运行之后,即在工作区窗口右边的输出/输入窗口中显示程序输出。模型

的所有输出信息都将在这里显示。使用 IVE 也可以图形化地显示求解过程,在对问

题进行优化求解时,默认将显示此求解过程。右面的窗口中有若干各面板可以用于显

示此求解过程,具体使用哪个面板取决于要求解的问题类型及使用的算法。用户也可

以在 Mosel 模型中嵌入子程序,来绘制图形(请参考网站上的文档了解详细信息)。

在左面的实体面板中你可以了解关于此解决方案的所有信息。你可以展开此面板

中的决策变量列表,将鼠标放置到一个决策变量上,此时会显示此决策变量的解值及

即约代价(reduced cost)值。也可以查看约束条件的对偶值和松弛值。

Page 87: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

76

图 5.1:运行模型 chess.mos 之后 Xpress-IVE 的窗口显示内容

5.2 使用 Mosel 建模

我们再来考虑一个略大一些的模型,此模型描述了一个窃贼所面临的问题。通过

此模型,我们将向你介绍 Mosel 语言的常用基本特性,这些特性在后面几章问题实

例的模型实现中要反复使用。

5.2.1 窃贼问题

有一个窃贼看见了 8 件物品,每件物品具有不同的价值和重量。小偷希望偷走

价值尽可能高的物品,但他能带走的重量不能超过WTMAX 。

我们为物品集合( ITEMS )中的每件物品 i 都引入一个二进制变量 itake ,以表

示决定物品i是否将被偷走,如果 itake 取值为 1,则物品 i 将被偷走,为 0 则表示将

不偷走。另外令 iVALUE 表示第 i 件物品的价值, iWEIGHT 表示第 i 件物品的重量。

这样就得到了对此问题的数学表达式:

maximize ∑∈

⋅ITEMSi

ii takeVALUE ( 大化总价值)

WTMAXtakeWEIGHTITEMSi

ii ≤⋅∑∈

(重量限制)

Page 88: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

77

ITEMSi∈∀ : { }10,takei ∈

这个问题是背包问题(knapsack problem)的一个例子。可以通过如下 Mosel代码来进行实现:

model "Burglar 1"

uses "mmxprs"

declarations

ITEMS = 1..8 ! 物品标号范围

WTMAX = 102 ! 允许携带的重量 大值

VALUE: array(ITEMS) of real ! 物品价值

WEIGHT: array(ITEMS) of real ! 物品重量

take: array(ITEMS) of mpvar ! 1 表示带走物品 i,0 表示不带走物品 i

end-declarations

! 物品: 1 2 3 4 5 6 7 8

VALUE := [ 15, 100, 90, 60, 40, 15, 10, 1]

WEIGHT := [ 2, 20, 20, 30, 40, 30, 60, 10]

! 目标: 使带走的总价值 大

MaxVal:= sum(i in ITEMS) VALUE(i)*take(i)

! 重量限制

sum(i in ITEMS) WEIGHT(i)*take(i) <= WTMAX

! 所有变量取值都为 0 或 1

forall(i in ITEMS) take(i) is_binary

maximize(MaxVal) ! 求解混合整数问题

! 打印输出结果

writeln("Solution:\n Objective: ", getobjval)

forall(i in ITEMS) writeln(" take(", i, "): ", getsol(take(i)))

end-model

运行此模型,可以得到如下输出:

Solution: Objective: 280 take(1): 1 take(2): 1 take(3): 1

Page 89: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

78

take(4): 1 take(5): 0 take(6): 1 take(7): 0 take(8): 0

此模型和所有 Mosel 模型的一般结构如下:

♦ 模型定义:每个 Mosel 程序都以关键字 model 开头,然后是模型名称,并

且 终以 end-model 结尾。

♦ 变量声明:所有对象都必须在 declarations 块中进行声明,除非这些变量都

将通过赋值进行非直接定义(例如,i := 1 就将 i 定义为一个整型变量,并

赋值为 1;在我们这个例子中,目标函数 MaxVal 通过将一个线性表达式赋

值给它进行定义)。在一个模型中不同位置可以有多个这样的 declarations块。

♦ 问题定义:通常模型总是以指定数据开始(本例中即指定 VALUE 和

WEIGHT的数值),然后是对问题的描述(在本例中即定义目标函数MaxVal,定义一个不等式约束条件,并限制变量为二进制)。

♦ 求解:通过调用过程 maximize,我们即命令 Xpress-Optimizer 将目标函数

MaxVal 的值 大化。由于在 Mosel 语言中不存在默认的求解器,因此我们

在程序开头需要使用语句 uses “mmxprs”来指定使用 Xpress-Optimizer 进行求解。

♦ 打印输出: 后两行将把 优解以及决策变量的 优值进行输出。

♦ 换行:可以在同一行中输入多个语句,不同语句之间应用分号隔开(例如

x1<=4; x2>=7)。相反地,由于没有特殊的行结束或行继续字符,因此如果

一个语句需要占用多行,则除 后一行之外其他行都必须以运算符(+,>=等)或类似的符号结尾,以便表明此语句尚未结束。

♦ 注释:如本例所示,符号!表明注释开始,此注释将持续到本行结束。占用

多行的注释应以(!开头,以!)结尾。

现在我们再来详细讨论此模型中用到的某些特性:

♦ 范围和集合:

ITEMS = 1..8

定义了一个范围集(range set),即从 1 到 8 的一组连续整数值。此范围集

将用作数据数组(VALUE和WEIGHT)及决策变量数组 take的索引集(index set)。

除了使用数值索引之外,我们也可以定义 ITEMS 为一组字符串,只须将目

前的定义 ITEMS = 1..8替换为如下定义(不需要对模型作出其他任何更改):

ITEMS = {"camera", "necklace", "vase", "picture", "tv", "video","chest", "brick"} ! 物体的索引集

Page 90: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

79

♦ 数组:

VALUE: array(ITEMS) of real

定义了一个实数值的一维数组,并使用范围集 ITEMS 进行索引。也可以用

相似的形式定义多维数组,例如:

VAL3: array(ITEMS, 1..20, ITEMS) of real

定义了一个三维实数数组。决策变量的数组(类型为 mpvar)也可以用相似

的方法进行定义,如我们的例子所示。

real, integer: 0 boolean: false string: ‘’ (即为空数组)

可以在模型中对数据数组进行赋值,如我们的例子所示,也可以从文件中初

始化(请参考 5.2.2 节)。

♦ 求和:

MaxVal:= sum(i in Items) VALUE(i)*x(i)

定义了一个名为 MaxVal 的线性表达式,其值为下面这个求和表达式的值:

∑∈

⋅ITEMSi

ii xVALUE

♦ 简单的循环:

forall(i in ITEMS) take(i) is_binary

此语句表示对在某个索引范围内的所有值进行循环。索引范围集 ITEMS 是

1,...,8,因此此语句即表示 take(1),take(2),...,take(8)都是二进制变

量。

在模型的倒数第二行也使用了 forall 来输出所有解值。

在一些应用实例中也会用到另一种类型的循环(请参考第 2 部分开头的分类

表格)。

♦ 整数规划变量类型:

为使一个 mpvar 变量,例如变量 xbinvar,成为二值变量(0/1),那么只需

要进行如下声明:

xbinvar is_binary

为使一个 mpvar 变量成为整数变量,即此变量在混合整数规划问题只能取

整数值,可以进行如下声明:

xintvar is_integer

Page 91: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

80

5.2.2 从文本文件读入数据

下面这个例子演示了如何将数据从文本文件读入到表格中。在窃贼问题中,我们

不再将数据嵌入到模型中,而是将数据保存在单独的文件中。在文件 burglar2.mos中定义如下的 Mosel 模型。

model "Burglar 2"

uses "mmxprs"

declarations

ITEMS: set of string ! 物品

WTMAX = 10 ! 允许带走的 大重量

VALUE: array(ITEMS) of real ! 物品价值

WEIGHT: array(ITEMS) of real ! 物品重量

end-declarations

initializations from ‘burglar.dat’

VALUE

WEIGHT

end-initializations

declarations

take: array(ITEMS) of mpvar ! 如果值为 1,则带走物品 i,否则不带走物品 i

end-declarations

! 目标函数: 大化总价值

MaxVal:= sum(i in ITEMS) VALUE(i)*take(i)

! 重量限制

sum(i in ITEMS) WEIGHT(i)*take(i) <= WTMAX

! 所有变量取值均为 0/1

forall(i in ITEMS) take(i) is_binary

maximize(MaxVal) ! 求解此混合整数规划问题

! 打印出解

writeln("Solution:\n Objective: ", getobjval)

forall(i in ITEMS) writeln(" take(", i, "): ", getsol(take(i)))

end-model

下面是文件 burglar.dat 的内容:

VALUE: [("camera") 15 ("necklace") 100 ("vase") 90 ("picture") 60

("tv") 40 ("video") 15 ("chest") 10 ("brick") 1]

Page 92: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

81

WEIGHT: [("camera") 2 ("necklace") 20 ("vase") 20 ("picture") 30

("tv") 40 ("video") 30 ("chest") 60 ("brick") 10]

initializations 块告诉 Mosel 应从何处获得初始化集合和数组所需的数据。在数

据文件中的数据项顺序不需要与初始化块中的顺序相同。注意,集合 ITEMS 的内容

是通过数组 VALUE 和 WEIGHT 的索引值间接定义的。只有在数据已经完成初始化

之后才对其中的变量进行声明,从而使集合 ITEMS 变为已知。

在应用实例中的适当时候,我们将演示如何使用动态的数据数组和决策变量(请

参考第 2 部分开头的分类表格)。

可以将所有数据都作为一个数据记录,例如 KNAPSACK。此时初始化即应为如

下形式:

initializations from 'burglar2.dat’

[VALUE, WEIGHT] as ‘KNAPSACK'

end-initializations

数据文件 burglar2.dat 的内容应为如下:

KNAPSACK: [ ("camera") [ 15 2]

("necklace") [ 100 20]

("vase") [ 90 20]

("picture") [ 60 30]

("tv") [ 40 40]

("video") [ 15 30]

("chest") [ 10 60]

("brick") [ 1 10] ]

在本书给出的实例中,我们都将从文本文件读入数据。但是,Mosel 语言也可以

从其他来源读出数据或向其进行数据写入(例如电子表格和数据库),也可以使用输

入到内存中的数据。若读者希望了解详细信息,请参考网站上的相关文档。

5.2.3 保留关键字

在 Mosel 语言中保留如下关键字。这些关键字的完全大写形式也是关键字(即

AND 和 and 都是关键字,但 And 不是)。请不要将这些关键字用于其原本用途之外

的地方。

and, array, as

boolean, break

case

declarations, div, do, dynamic

elif, else, end

false, forall, forward, from, function

if, in, include, initialisations, initializations, integer, inter,is_binary, is_continuous, is_free,

is_integer, is_partint, is_semcont,is_semint, is_sos1, is_sos2

linctr

Page 93: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

82

max, min, mod, model, mpvarnext, not

of, options, or

parameters, procedure, public, prod

range, real, repeat

set, string, sum

then, to, true

union, until, uses

while

Page 94: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

83

第 6 章 采矿和加工业

在本章中将介绍一些较为简单的线性规划问题,即建模者需要在满足一定质量约

束条件的情况下将原材料进行混合或提取其中的成分,目标是使总成本 小。这些混

合或产品组合问题常见于需要持续使用大量原材料的加工行业中,例如石油精炼,化

工,冶金,农副产品加工等。由于这些问题要处理的数量可以为小数,因此它们相对

比较简单,不需要使用混合整数规划。

我们将研究三个这种类型的例子:冶金行业中的合金制造(第 6.1 节),动物饲

料制造(第 6.2 节),以及石油精炼(第 6.3 节)。这些问题都与第一产业有关,第一

产业即与生产原材料相关的经济活动,如农业和采矿业。除了混合问题之外,本章还

将介绍一些工业产业中的问题:如何处理可能由于发酵而迅速损失的甘蔗(第 6.4节),露天矿山的开采(第 6.5 节),以及对若干台发电机组的电能生产进行计划(第

6.6 节)。

6.1 合金制造

有一家钢铁公司收到一份 500 吨造船用钢的订单。对这些造船用钢有如下要求

(品质):

表格 6.1:造船钢品质要求

化学元素 低含量 高含量

碳(C) 2 3

铜(Cu) 0.4 0.6

锰(Mn) 1.2 1.65

此公司储存有七种不同的原材料,都可以用于制造这种钢。表 6.2 列出了这些原

材料的品质,可用库存量,以及价格。

表格 6.2:原材料品质,可用库存量,与价格

原材料 C% Cu% Mn% 可用库存(吨) 单价(欧元/吨)

铁合金 1 2.5 0 1.3 400 200

铁合金 1 3 0 0.8 300 250

铁合金 2 0 0.3 0 600 150

铜合金 1 0 90 0 500 220

铜合金 2 0 96 4 200 240

铝合金 1 0 0.4 1.2 300 100

铝合金 2 0 0.6 0 250 165

我们的目标是求出各种原材料各取多少才能使生产成本 低。

Page 95: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

84

6.1.1 模型的数学表达

我们使用 RAW 表示原材料集合,COMP 表示与材料品质相关的各种成分(化

学元素)的集合。我们希望找出每种原材料 r 的用量 ruse ,以能够生产出数量为

produce的满足给定要求 DEM 的钢材。我们用 rcP 表示在原材料 r 中的化学元素 c

的含量, rCOST 表示原材料 r 每千克的采购价格。此外,每种成分 c 的 低和 高

品质含量分别用 cPMIN 和 cPMAX 表示。这样就可以得到如下的数学模型:

minimize ∑∈

⋅RAWr

rr useCOST (6.1.1)

∑∈

=RAWr

ruseproduce (6.1.2)

COMPc∈∀ : procudurePMINuseP cRAWr

rrc ⋅≥⋅∑∈

(6.1.3)

COMPc∈∀ : procudurePMAXuseP cRAWr

rrc ⋅≤⋅∑∈

(6.1.4)

RAWr ∈∀ : rr AVAILuse ≤ (6.1.5)

DEMproduce ≥ (6.1.6)

RAWr ∈∀ : 0≥ruse , 0≥produce (6.1.7)

式(6.1.1)是目标函数,即 小化总成本,总成本等于每种原材料的单位价格

乘以此原材料的用量然后对所有原材料进行求和。

约束条件(6.1.2)表明 终得到的产品重量等于生产此产品所使用的各种原材

料重量之和。约束条件(6.1.3)和(6.1.4)对 终产品的品质进行了限制。给出这

些约束条件的根据是:如果得到的钢材中含有 ruse 吨某种化学元素 c 含量百分比为

rcP 的原材料,则此化学元素在此钢材中的总含量可以表示为如下式:

∑∈

⋅RAWr

rrc useP

则在 终产品中的化学元素 c 的含量百分比可以表示为:

produceuseP

RAWr rrc∑ ∈⋅

对 终产品中的元素 c 含量百分比 低含量进行约束,则有如下关系: .

Page 96: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

85

cRAWr rrc PMINproduce

useP≥

⋅∑ ∈

此关系是非线性的,但是可以通过在两边同乘以 produce 将它线性化,这样我

们 终就得到了线性约束条件(6.1.3)

同理可以导出约束条件(6.1.4)。

约束条件(6.1.5)将保证使用的原材料量不会超过可用库存量。约束条件(6.1.6)将保证生产出的钢铁量满足要求。 后一个约束条件(6.1.7)是对此问题中所有变量

的非负约束。

6.1.2 模型实现

可以将上述数学模型转化为如下的 Mosel 程序。很容易看到二者之间的对应关

系。在此模型中,与本书中大多数模型相同,我们将从独立的数据文件中读入所有数

据。注意,尽管在模型的数学表达式中我们只使用数字对各种原材料进行标记,但在

求解之后我们将读入各种原材料的名称,以使输出的解更容易阅读。

model "A-1 Production of Alloys"

uses "mmxprs"

declarations

COMP = 1..3 ! 成分(化学元素)

RAW = 1..7 ! 原料(合金)

P: array(RAW,COMP) of real ! 原料成分(百分比)

PMIN,PMAX: array(COMP) of real ! 各种成分的 小和 大值

AVAIL: array(RAW) of real ! 各种原料的可用库存量

COST: array(RAW) of real ! 每吨原料的价格

DEM: real ! 要生产的钢材总量

use: array(RAW) of mpvar ! 各种原料的使用量

produce: mpvar ! 实际生产的钢材量

end-declarations

initializations from 'a1alloy.dat’

P PMIN PMAX AVAIL COST DEM

end-initializations

! 目标函数

Cost:= sum(r in RAW) COST(r)*use(r)

Page 97: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

86

! 实际生产钢材量 = 使用原料总量

produce = sum(r in RAW) use(r)

! 确保每种化学元素含量都满足 大和 小百分比要求

forall(c in COMP) do

sum(r in RAW) P(r,c)*use(r) >= PMIN(c)*produce

sum(r in RAW) P(r,c)*use(r) <= PMAX(c)*produce

end-do

! 原料使用量必须不超过可用库存量

forall(r in RAW) use(r) <= AVAIL(r)

! 实际生产量应满足需求

produce >= DEM

! 求解此问题

minimize(Cost)

! 打印输出求解结果

declarations

NAMES: array(RAW) of string

end-declarations

initializations from ‘a1alloy.dat’ ! 获得各种合金名称

NAMES

end-initializations

writeln("Total cost: ", getobjval)

writeln("Amount of steel produced: ", getsol(produce))

writeln("Alloys used:")

forall(r in RAW)

if(getsol(use(r))>0) then

write(NAMES(r), ": ", getsol(use(r))," ")

end-if

write("\nPercentages (C, Cu, Mn): ")

forall(c in COMP)

write( getsol(sum(r in RAW) P(r,c)*use(r))/getsol(produce), "% ")

writeln

end-model

数据文件 a1alloy.dat 内容如下所示:

P : [ 2.5 0 1.3 ! 原料成分

Page 98: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

87

3 0 0.8

0 0 3 0

0 90 0

0 96 4

0 0.4 1.2

0 0.6 0]

PMIN: [2 0.4 1.2]

PMAX: [3 0.6 1.65] ! 各种元素的 大和 小含量百分比要求

AVAIL: [400 300 600 500 200 300 250] ! 原料可用库存量

COST: [200 250 150 220 240 200 165] ! 原料成本

DEM: 500 ! 要生产的钢材量

NAMES: ["iron 1" "iron 2" "iron 3" "copper 1" "copper 2"

"aluminum 1" "aluminum 2"]

在打印输出求解结果的语句中,我们使用了 Mosel 的 if-then 语句,你也可以使

用 if-then-else 或 if-then-elif-then-else 的形式。观察求解结果打印输出语句还可以发

现,getsol 函数不仅可以用于变量,而且也可以用于线性表达式。

6.1.3 结果

要生产出 500 吨所要求的钢材,需要使用 400 吨铁合金 1,39.776 吨铁合金 3,2.761 吨铜合金 2,57.462 吨铝合金 1。 终得到的产品中碳,铜,锰的含量百分比分

别为 2%,0.6%,和 1.2%。总的生产成本为 98121.60 欧元。

6.2 动物饲料制造

有一家牛饲料公司要生产两种类型的动物饲料:粉状饲料和颗粒饲料。生产这些

饲料所需的原料有:燕麦,玉米,和糖渣。首先需要将这些原料(糖渣除外)磨碎,

然后将所有原料混合形成饲料产品。在 后一个生产工序中,需要将半成品制成颗粒

状或粉末状,从而得到 终产品。

Page 99: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

88

图 6.1:动物饲料生产流程

每种饲料产品都需要满足一些营养成分需求。表 6.3 中列出了原料含有的和 终

产品要求的蛋白质,脂肪,和纤维含量百分比。

表格 6.3:营养成分含量百分比

原料 蛋白质 脂肪 纤维素

燕麦 13.6 7.1 7

玉米 4.1 2.4 3.7

糖渣 5 0.3 25

要求含量 >= 9.5 >= 2 <=6

各种原料的可用量也有限制。表 6.4 列出了每天各种原料的可用量以及对应的价

格。

表格 6.4:原材料可用量与价格

原料 可用量(千克) 价格(欧元/千克)

燕麦 11900 0.13

玉米 23500 0.17

糖渣 750 0.12

表 6.5 列出了各道工序的成本。

表格 6.5:加工成本(欧元/千克)

磨碎 混合 结粒 筛粉

0.25 0.05 0.42 0.17

如果每天需求量为 9 吨颗粒饲料,12 吨粉状饲料,则各种原材料应分别使用多

少,并应怎样进行混合才能够使总成本 低?

6.2.1 模型的数学表达

此模型与上一个模型很相似,区别在于现在我们需要生产两种类型的产品,而且

不再要求 终产品中各成分位于给定的 低和 高范围内,而是要满足特定的营养需

求。令 { }21,FOOD = (1 表示颗粒饲料,2 表示粉状饲料)为将要生产的饲料类型

磨碎 混合

结粒

筛粉

糖渣

燕麦

玉米

颗粒

饲料

粉状

饲料

Page 100: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

89

集合, RAW 为原料集合, { }321 ,,COMP = 为要求的营养成分(1 表示蛋白质,2

表示脂肪,3 表示纤维素)。此外我们还用 rCOST 表示原料 r 的每千克采购价,

pPCOST 表示工序 p 的每千克加工成本, cREQ 表示营养成分 c 的要求含量, rcP 表

示在原料 r 中营养成分 c 的含量, rAVAIL 表示原料 r 每天可以获得的 大量,

fDEM 表示饲料产品 f 每天的需求量。

设变量 rfuse 表示生产饲料 f 所使用的原料 r 的量, fproduce 表示饲料 f 每天

的生产量,则可以得到如下模型:

minimize

∑∑ ∑

∑ ∑∑ ∑

∈∈ ∈

∈≠∈∈ ∈

⋅+

⋅+⋅+

⋅+⋅

RAWrr

RAWrr

RAWr FOODfrf

RAWrr

FOODfrf

RAWr FOODfrfr

usePCOST

usePCOSTusePCOST

usePCOSTuseCOST

2

1

筛粉

结粒混合

糖渣

磨碎

(6.2.1)

FOODf ∈∀ : fRAWr

rf produceuse =∑∈

(6.2.2)

{ }21,∈∈∀ c,FOODf : fcRAWr

rfrc produceREQuseP ⋅≥⋅∑∈

(6.2.3)

FOODf ∈∀ : fRAWr

rfr produceREQuseP ⋅≤⋅∑∈

33 (6.2.4)

RAWr ∈∀ : rFOODf

rf AVAILuse ≤∑∈

(6.2.5)

FOODf ∈∀ : ff DEMproduce ≥ (6.2.6)

FOODf,RAWr ∈∈∀ : 0≥rfuse ; FOODf ∈∀ : 0≥fproduce (6.2.7)

需要 小化的目标函数(6.2.1)是生产的总成本。其中第一项是原料的采购成

本,后面几项是不同工序的加工成本。除了糖渣之外的其他原料都需要进行磨碎,所

有原料都要进行混合。对于已经混合后的半成品,通过结粒工序可以得到颗粒饲料

( 1=f ),通过筛粉工序可以得到粉末饲料( 2=f )。约束条件(6.2.2)表明每种

类型饲料的生产量等于生产这种产品的各种原料使用量之和。约束条件(6.2.3)和

(6.2.4)即表示对营养成分的需求。得出这些约束条件的思路与前一个例子中我们

对于钢铁“品质”约束条件的推导相同。饲料产品 f 中营养成分 c 的含量百分比可以

表示为:

Page 101: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

90

f

RAWrrfrc

produce

useP∑∈

⋅ (6.2.8)

对于前两种营养成分(蛋白质,脂肪),此百分比必须至少为 cREQ ,对于第三

种营养成分(纤维素),此百分比不应超过 cREQ 。对于前两种营养成分,则可以得

到如(6.2.9)所示的关系,对于第三种营养成分,此关系为(6.2.10)。

cf

RAWrrfrc

REQproduce

useP≥

⋅∑∈ (6.2.9)

cf

RAWrrfrc

REQproduce

useP≤

⋅∑∈ (6.2.10)

由于在分母上出现了变量 fproduce ,因此这两个关系都是非线性关系,但和前

面一样,可以通过在两边都乘以 fproduce 来将它们转化为线性约束条件。

这样我们就得到了约束条件(6.2.3)和(6.2.4)

约束条件(6.2.5)可以保证原料的用量不超过每天原料的可提供量。约束条件

(6.2.6)表示生产量要满足需求。 后约束条件(6.2.7)将保证所有变量都为非负值。

6.2.2 模型实现

下面的 Mosel 程序实现了上述的数学模型。注意,在此实现中,有些索引集是

数值类型,有些索引集是字符串类型。可以在声明时对索引集内容进行赋值(常量集

合),如 FOOD 和 COMP,也可以动态对索引集进行赋值如 PCOST 的索引集(未

命名),当从文件读入此数组时也将读入其对应的索引集。

model "A-2 Animal Food Production"

uses "mmxprs"

declarations

FOOD = 1..2 ! 饲料类型

COMP = 1..3 ! 营养成分

RAW = {"oat", "maize", "molasses"} ! 原料

P: array(RAW,COMP) of real ! 原料的营养成分组成(百分比)

REQ: array(COMP) of real ! 终产品的营养成分需求

AVAIL: array(RAW) of real ! 原料的可用量

COST: array(RAW) of real ! 原料价格

PCOST: array(set of string) of real ! 加工工艺成本

Page 102: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

91

DEM: array(FOOD) of real ! 各种类型饲料的需求量

use: array(RAW,FOOD) of mpvar ! 某种类型饲料的原料用量

produce: array(FOOD) of mpvar ! 某种类型饲料的产量

end-declarations

initializations from ‘a2food.dat'

P REQ PCOST DEM

[AVAIL, COST] as ‘RAWMAT’

end-initializations

! 目标函数

Cost:= sum(r in RAW,f in FOOD) COST(r)*use(r,f) +

sum(r in RAW,f in FOOD|r<>"molasses") PCOST("grinding")*use(r,f) +

sum(r in RAW,f in FOOD) PCOST("blending")*use(r,f) +

sum(r in RAW) PCOST("granulating")*use(r,1) +

sum(r in RAW) PCOST("sieving")*use(r,2)

! 生产出的饲料量等于使用的各种原料量之和

forall(f in FOOD) sum(r in RAW) use(r,f) = produce(f)

! 满足营养含量要求

forall(f in FOOD,c in 1..2)

sum(r in RAW) P(r,c)*use(r,f) >= REQ(c)*produce(f)

forall(f in FOOD)

sum(r in RAW) P(r,3)*use(r,f) <= REQ(3)*produce(f)

! 原料使用量应不超过可提供量

forall(r in RAW)

sum(f in FOOD) use(r,f) <= AVAIL(r)

! 产量应满足需求

forall(f in FOOD)

produce(f) >= DEM(f)

! 求解此问题

minimize(Cost)

! 打印输出求解结果

writeln("Total cost: ", getobjval)

write("Food type");

forall(r in RAW)

write(strfmt(r,9))

writeln(" protein lipid fiber")

Page 103: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

92

forall(f in FOOD) do

write(strfmt(f,-9))

forall(r in RAW)

write(strfmt(getsol(use(r,f)),9,2))

forall(c in COMP)

write(" ", strfmt(getsol(sum(r in RAW) P(r,c)*use(r,f))/getsol(produce(f)),3,2),"%")

writeln

end-do

end-model

数据文件 a2food.dat 的内容如下所示。在 Mosel 模型文件中,字符串必须以放

在一对单引号或双引号之中;但在数据文件中,只有当字符串中包含空格或其他非字

母/数字符号时,或以数字开头时才需要这样做。

与表 6.4 中列出的原料可用量和价格的方式类似,数组 AVAIL 和 COST 的数据

用一条名为 RAWMAT 的数据记录给出。在初始化块中,需要从同一条数据记录中读

入的多个数据数组的名称应放在一对方括号[和]中,后面加上关键字 as 和此数据记

录的名称。

P: [ (oat 1) 13.6 7.1 7 ! 原材料组成

(maize 1) 4.1 2.4 3.7

(molasses 1) 5 0.3 25 ]

REQ: [ 9.5 2 6] ! 终产品的营养成分要求

RAWMAT: [ (oat) [11900 0.13] ! 原材料可用量和采购价

(maize) [23500 0.17]

(molasses) [750 0.12]]

! 加工成本

PCOST: [(grinding) 0.25 (blending) 0.05 (granulating) 0.42 (sieving) 0.17]

DEM: [9000 12000] ! 各种类型饲料的需求量

在这个例子中我们再次演示了在问题求解之后应如何打印出求解结果。借助于

strfmt 函数可以将数据输出为表格形式。strfmt 函数的第一个参数是给定的字符串或

数值;第二个参数是第一个参数所占用的总字符数,如果不足则加空格补足;第三个

参数是在数字在小数点后面保留的位数。如果第二个参数为负值,则输出将左对齐。

由于在各种例子中打印输出求解结果的方式差别不大,因此在以后的程序代码中

将略去这一部分。

6.2.3 结果

对于生产出需求的 9 吨颗粒饲料和 12 吨粉末饲料, 低成本为 15086.80 欧元。

在表 6.6 中列出了详细的数据。

Page 104: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

93

表格 6.6:饲料生产的 佳方案

饲料类型 燕麦 玉米 糖渣 蛋白质 脂肪 纤维

颗粒饲料 5098.56 3719.53 181.91 9.50% 5.02% 6.00%

粉状饲料 6798.07 4959.37 242.55 9.50% 5.02% 6.00%

6.3 石油精炼

石油精炼厂将使用两种原油生产出丁烷(butane),汽油(petrol),柴油(diesel oil),以及民用燃料油(heating oil)。为生产出这些产品,需要四道工序:分离,转

化,提纯,和混合。

在分离工序中将把原材料进行分馏,使其分离为丁烷(butane),石脑油

(naphtha),轻柴油(gasoil),以及残渣。残渣然后将进行催化裂解以获得较轻的

产品。从分馏工序得到的各种产品将进行提纯(脱硫),或通过重整工艺增加其辛烷

值。 终,为获得可以出售的 终产品,精练厂需要将若干种中间产物进行混合,以

满足商业产品所要求的各种属性。下图中是对此精练厂的生产过程的简单的示意。

在分馏之后,原油 1 能够得到 3%的丁烷,15%的石脑油,40%的轻柴油,以及

15%的残渣。原油 2 能够得到 5%的丁烷,20%的石脑油,25%的轻柴油,以及 10%的残渣。对石脑油进行重整能够得到 15%的丁烷和 85%的重整油(重整石脑油)。对

残渣的催化裂解可以生成 45%的裂解石脑油和 35%的裂解轻柴油(注意,由于在此

工艺中也将生成 15%的气体和 5%的石油焦以及其他另一种无法计入我们的例子中

的残余物,因此这两个百分比之和不等于 1)。汽油由三种成分混合而成:重组石脑

油(重组油),丁烷,以及裂解石脑油。柴油可以通过将脱硫轻柴油,裂解轻柴油,

以及裂解石脑油混合得到。民用燃料油由轻柴油及裂解石脑油组成,对其成分含量没

有要求。

图 6.2:石油精炼简化流图

法律规定了一些汽油和柴油的规格指标。对于汽油有三项重要指标:辛烷值,蒸

汽压,以及挥发性。辛烷值是对汽油的抗爆能力的度量。蒸汽压能够反映出汽油储存

重整

催化裂解

脱硫

混合汽油

混合燃料油

混合柴油

原油

石脑油

残渣

轻柴油

重整油

丁烷

丁烷

裂解石脑油

脱硫轻柴油

丁烷

汽油

燃料油

柴油

裂解

轻柴油

分馏

Page 105: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

94

过程中发生爆炸的风险,尤其在炎热气候条件下。挥发性能够决定在寒冷气候条件下

发动机是否能够容易启动。空气污染法规对柴油的含硫量进行了规定。下面的表格中

列出了 终产品的规格指标和中间产品的成分组成。如果对某一项没有限制,则对应

域保留为空。我们假定所有这些成分都将按照质量线性混合(实际上只有含硫量才如

此)。

表格 6.7:中间产物和 终产品规格属性

规格 丁烷 重整油 裂解石脑油 裂解轻柴油 去硫轻柴油 汽油 柴油

辛烷值 120 100 74 - - >=94 -

蒸汽压 60 2.6 4.1 - - <=12.7 -

挥发性 105 3 12 - - >=17 -

含硫量(%) - - 0.12 0.76 0.03 - <=0.05

下个月此精炼厂需要生产 20,000 吨丁烷,40,000 吨汽油,30,000 吨柴油,42,000吨燃料油。可用原油分别为 250,000 吨原油 1,500,000 吨原油 2。重整炉每月加工

能力为 30,000 吨,脱硫工艺每月加工能力为 40,000 吨,裂解工艺每月加工能力为

50,000 吨。各个工艺的成本取决于其中使用的燃料和催化剂。整流,重整,脱硫,

和裂解的成本分别为每吨 2.10,4.18,2.04,0.60 欧元。

6.3.1 模型的数学表达

设变量 etanbuproduce , petrolproduce , dieselproduce ,和 heatingproduce 分别为

丁烷,汽油,柴油,和燃料油的生产量。这四种产品即组成了 终产品集 FINAL 。

我们需要对每种产品的组分进行测定。用下面这些变量表示中间产品:

petubaneproduce , reformateproduce , thapetcrknaphproduce ,分别表示在生产汽油时丁

烷,重整石脑油,和裂解石脑油的用量(这三个中间产品组成集合 IPETROL );类

似地, asoillgdsproduce , thadslcrknaphproduce ,和 ildslcrkgasoproduce 表示生产柴油时脱

硫轻柴油,裂解石脑油,和裂解轻柴油的用量(集合 IDIESEL); hogasoilproduce ,

hahocrknaphtproduce ,和 lhocrkgasoiproduce 表示生产燃料油时脱硫轻柴油,裂解石脑油,

和裂解轻柴油的用量(集合 IHO )。我们也可以定义变量 pproduce 表示通过不同的

加工工艺中得到的中间产品产量,即集合:

{ }gasoil,residue,naphtha,etandistbuIDIST = (分馏产物)

{ }reformate,etanrefbuIREF = (重整产物)

{ }crkgasoil,crknaphthaICRACK = (裂解产物)

所有 终和中间产物都可以重新组合为集合: DIESELIHOIIPETROLICRACKIREFIDISTFINALALLPRODS UUUUUU=

Page 106: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

95

除了对应于产品的变量之外,我们还定义一个变量 cuse ,表示在生产过程中原

油 CRUDESc∈ 的用量。

我们的目标是 小化生产成本,即使原油分馏成本以及对分馏产物进行重整,脱

硫,和裂解的成本之和 小。因此目标函数为:

minimize ∑∑∈∈

⋅+⋅IDISTp

ppCRUDESc

cc produceCOSTuseCOST (6.3.1)

下面的约束条件(6.3.2)对从原油中能够分馏得到的中间产物总量进行限制,

其中 cpDIST DISTcp 表示在原油 c 中的中间产物 p 含量。

IDISTp∈∀ : ∑∈

⋅≤CRUDESc

ccpp useDISTproduce (6.3.2)

例如,进入重整工艺的石脑油总量( naphthaproduce )不能超过从原油分馏过程

得到的石脑油总量(∑ ∈⋅

CRUDESc cnaphtha,c useDIST )。

对于重整和裂解工艺(这两个工艺都只有一种输入原料)有类似的关系,如果用

pREF 表示石脑油中重整可以得到的各组分百分比, pCRACK 表示残渣裂解可以得

到的各组分百分比,则有:

IREFp∈∀ : naphthap produceREFproducep ⋅≤ (6.3.3)

ICRACKp∈∀ : residuep produceCRACKproducep ⋅≤ (6.3.4)

经过裂解和脱硫过程得到的产物即可以用于混合成 终产品。因此可以得到如下

三个等式。裂解石脑油用于生产石油,燃料油,和柴油(6.3.5)。裂解轻柴油(6.3.6)和脱硫轻柴油(6.3.7)都将用于生产燃料油和柴油。

thadslcrknaphhahocrknaphtthapetcrknaphcrknaphtha produceproduceproduceproduce ++= (6.3.5)

ildslcrkgasolhocrkgasoicrkgasoil produceproduceproduce += (6.3.6)

asoillgdshogasoilgasoil produceproduceproduce += (6.3.7)

下面四个约束条件(6.3.8)-(6.3.11)将限定从中间产品能够分别生产多少各

种 终产品:通过分馏和重整得到的丁烷将用于生产汽油(6.3.8)。三种 终产品(汽

油,柴油,燃料油)都将通过混合各种中间产物得到,因此其产量等于用于混合的各

种中间产物的总量。

etanpetbuetanrefbuetandistbuetanbu produceproduceproduceproduce −+= (6.3.8)

Page 107: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

96

∑∈

=IPETROLp

ppetrol produceproduce (6.3.9)

∑∈

=IDIESELp

pdiesel produceproduce (6.3.10)

∑∈

=IHOp

pheating produceproduce (6.3.11)

此外,在混合中间产品制造汽油和柴油时,还需要遵守一些法律规定,因此又有

一些约束条件。例如,汽油的辛烷值必须高于 94。这个约束条件可以转化为如下形

式(其中 pOCT 表示组分 p 中的辛烷含量):

94≥⋅∑ ∈

petrol

IPETROLp pp

produce

produceOCT (6.3.12)

由于这个约束条件表达式中分母上有变量,因此它是非线性的表达式。

为将它改写成线性约束条件,可以将式子两边都乘以 petrolproduce 。这样就可以

得到下面的约束条件(6.3.13):

petrolIPETROLp pp produceproduceOCT ⋅≥⋅∑ ∈94 (6.3.13)

下面的约束条件(6.3.14)-(6.3.16)是对汽油的蒸汽压和挥发性以及柴油的含

硫量的限制。

petrolIPETROLp

pp produce.produceVAP ⋅≥⋅∑∈

712 (6.3.14)

petrolIPETROLp

pp produceproduceVOL ⋅≥⋅∑∈

17 (6.3.15)

dieselIDIESELp

pp produce.produceSULF ⋅≥⋅∑∈

050 (6.3.16)

我们也需要一些约束条件来对重整(6.3.17),脱硫(6.3.18),以及裂解(6.3.19)

各个工艺的生产能力进行限制。原油 c 的使用量 cuse 不能超过此种原油的可用量

cAVAIL 。约束条件(6.3.21)将保证各种 终产品的产量满足需求 pDEM 。此外

我们也要为所有变量都加上非负约束(6.3.23)。

30000≤npproduce (6.3.17)

50000≤+ ghgd produceproduce (6.3.18)

40000≤++ rhrdrp produceproduceproduce (6.3.19)

Page 108: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

97

CRUDESc∈∀ : cc AVAILuse ≤ (6.3.20)

FINALp∈∀ : pp DEMproduce ≥ (6.3.21)

FINALp∈∀ : 0≥pproduce (6.3.22)

CRUDESc∈∀ : 0≥cuse (6.3.23)

这样从(6.3.1)到(6.3.11)以及从(6.3.13)到(6.3.23)的这些表达式就定

义了本例中的线性规划模型。

与 6.1 和 6.2 节中的两个混合问题相比,这个例子中的表达式看上去很杂乱:如

果在生产过程中产品数量相对不多,但是加工工艺却很多,而且这些工艺相互之间有

复杂的关系,那么就常常会像这个例子一样。会有很多种不同类型的约束条件,并且

常常会有很多例外和特例。

6.3.2 模型实现

可以很容易地根据前一节中的数学表达式写出对应的 Mosel 模型程序。但与前

面的例子相比,在这个例子中我们不再在模型中直接为数据数组定义索引集合,而是

动态地从文件中初始化数据数组的内容(以及对应的索引集合)。唯一需要在模型中

直接定义的集合是 IHO ,这是由于它不是任何数据数组的索引集合,因此其定义无

法从文件中导入。定义所有 终产品和中间产品的集合为 ALLPRODS 。

model "A-3 Refinery planning"

uses "mmxprs"

declarationsCRUDES: set of string ! 原油集合

ALLPRODS: set of string ! 中间产物和 终产品集合

FINAL: set of string ! 终产品

IDIST: set of string ! 分馏产物

IREF: set of string ! 重整产物

ICRACK: set of string ! 裂解产物

IPETROL: set of string ! 制造汽油所需的中间产物

IDIESEL: set of string ! 制造柴油所需的中间产物

IHO={"hogasoil", "hocrknaphtha", "hocrkgasoil"} ! 制造燃料油所需的中间产物

DEM: array(FINAL) of real ! 小产量

COST: array(set of string) of real ! 生产成本

AVAIL: array(CRUDES) of real ! 可用原油量

OCT, VAP, VOL: array(IPETROL) of real ! 汽油的辛烷值,蒸汽压,以及挥发性

SULF: array(IDIESEL) of real ! 含硫量

DIST: array(CRUDES,IDIST) of real ! 原油中各组分百分比

REF: array(IREF) of real ! 重整得到各种产物百分比

CRACK: array(ICRACK) of real ! 裂解得到各种产物百分比

Page 109: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

98

end-declarations

initializations from ‘a3refine.dat’

DEM COST OCT VAP VOL SULF AVAIL DIST REF CRACK

end-initializations

finalize(FINAL); finalize(CRUDES); finalize(IPETROL); finalize(IDIESEL)finalize(IDIST);

finalize(IREF); finalize(ICRACK)

ALLPRODS:= FINAL+IDIST+IREF+ICRACK+IPETROL+IHO+IDIESEL

declarations

use: array(CRUDES) of mpvar ! 原油使用量

produce: array(ALLPRODS) of mpvar ! 各种产物产量

end-declarations

! 目标函数

Cost:= sum(c in CRUDES) COST(c)*use(c) + sum(p in IDIST) COST(p)*produce(p)

! 分馏产物与原料油之间的关系

forall(p in IDIST) produce(p) <= sum(c in CRUDES) DIST(c,p)*use(c)

! 中间产物之间关系

! 重整:

forall(p in IREF) produce(p) <= REF(p)*produce("naphtha")

! 裂解:

forall(p in ICRACK) produce(p) <= CRACK(p)*produce("residue")

produce("crknaphtha") >= produce("petcrknaphtha") +

produce("hocrknaphtha") + produce("dslcrknaphtha")

produce("crkgasoil") >= produce("hocrkgasoil") + produce("dslcrkgasoil")

! 脱硫:

produce("gasoil") >= produce("hogasoil") + produce("dslgasoil")

! 终产品与中间产物关系

produce("butane") = produce("distbutane") + produce("refbutane") -

produce("petbutane")

produce("petrol") = sum(p in IPETROL)

produce(p)produce("diesel") = sum(p in IDIESEL) produce(p)

produce("heating") = sum(p in IHO) produce(p)

! 汽油属性

sum(p in IPETROL) OCT(p)*produce(p) >= 94*produce("petrol")

sum(p in IPETROL) VAP(p)*produce(p) <= 12.7*produce("petrol")

sum(p in IPETROL) VOL(p)*produce(p) >= 17*produce("petrol")

Page 110: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

99

! 柴油含硫量限制

sum(p in IDIESEL) SULF(p)*produce(p) <= 0.05*produce("diesel")

! 原油可供量限制

forall(c in CRUDES) use(c) <= AVAIL(c)

! 生产能力

produce("naphtha") <= 30000 ! 重整工艺

produce("gasoil") <= 50000 ! 脱硫工艺

produce("residue") <= 40000 ! 裂解工艺

! 满足所有产品需求

forall(p in FINAL) produce(p) >= DEM(p)

! 求解此问题

minimize(Cost)

end-model

由于决定对索引集进行动态初始化,因此对变量数组 use 和 produce 需要进行

特殊处理。

如果与数据数组同时声明这些数组,则由于在从文件读入数据之前索引集合仍然

为未知,因此可能会生成空的动态数组。对于数据为非 mpvar 类型的动态数组,其

数组成员在被引用时即会自动创建,而对于变量数组来说情况则不同。可以用两种方

法来处理这种情况:

♦ 在上述的模型代码实现中,我们在从文件中读入数据之后在一个单独的

declarations 块中定义这些变量。此声明块前面有一组 finalize 语句。借助

于 finalize 函数,(动态)索引集合即可以变为常量集合,即不再允许更改

其内容。因此,所有在此之后声明的使用这些集合作为索引的数组将创建为

固定大小的数组。

♦ 另一种方法是,我们可以将 mpvar 类型的数组与数据数组同时声明,但在

从文件完成读入数据并且集合 ALLPROD 和 CRUDE 都已经确定之后加入

如下代码,以显式地创建所需的变量:

forall(p in ALLPROD) create(produce(p))

forall(c in CRUDES) create(use(c))

在大型应用中,通常情况下大多数数据(以及对应的索引集合)都要动态进行初

始化,因此变量需要使用上面介绍的方法之一进行定义。

为使本书中的实例实现都尽量简单,我们通常在模型中直接将索引数组定义为常

量,这样就不再需要对变量的定义加以特别关注。

Page 111: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

100

6.3.3 结果

总生产成本为 1,175,400 欧元。使用 6,500 吨丁烷,25,500 吨重整油,8,000吨裂解石脑油生产了 40,000 吨汽油。这样组合得到的汽油辛烷值为 98.05,蒸汽压

为 12.23,挥发性为 21.38。使用 30,000 吨脱硫轻柴油生产了 30,000 吨柴油,含硫

量为 0.03%。使用 20,000 吨脱硫轻柴油,8,000 吨裂解石脑油,14,000 吨裂解轻柴

油生产了 42,000 吨燃料油。除此之外,此方案也生产了所要求的 20,000 吨丁烷。

6.4 蔗糖生产

在澳大利亚甘蔗的收割已经实现了高度机械化。甘蔗在砍下之后将马上通过运行

于小型铁路网上的货车运送到蔗糖厂。一辆货车的运量能够生产的蔗糖量取决于甘蔗

收购的地点以及甘蔗成熟的程度。在收割之后,甘蔗中的含糖量将由于发酵而迅速下

降,在一段时间之后,所含糖份将完全流失。现在有 11 辆火车到达了蔗糖厂,每辆

货车运载的甘蔗量都相同。已经对每辆货车每小时的损失量以及剩余时间进行了测

算,具体数据如下表所示。

表格 6.8:每车甘蔗属性

货车编号 1 2 3 4 5 6 7 8 9 10 11

损失率(千克/小时) 43 26 37 28 13 54 62 49 19 28 30

剩余时间 8 8 2 8 4 8 8 8 8 8 8

在制糖厂内有三条生产线,每辆货车都可以选择在哪条生产线上进行加工。一车

甘蔗的加工时间为两个小时。必须在这车甘蔗的质量寿命结束之前完成加工。制糖厂

的经理希望找出一个生产计划,使总的蔗糖损失降到 低。

6.4.1 模型的数学表达

这个问题也是关于第一产业的,但与本章前面的几个混合问题有所不同。

设 { }NW,,WAGONS K1= 为货车集合,NL为生产线数目,DUR 为每车甘蔗

的加工时间。每辆货车w每小时的损失可以表示为 wLOSS ,其剩余寿命为 wLIFE 。

我们可以看到,在 优解中,生产线需要持续不间断工作——否则我们就可以通过将

提早进行下一次生产来减少蔗糖损失。这表示每车甘蔗完成加工的时刻都可以表示为

DURs ⋅ ,其中 0>s ,且为整数。 s 的 大值即为制糖厂将要工作的时间窗口数(每

个窗口长为 DUR ),即 ( )NL/NWceilNS = ,其中 ceil 表示向上取整。如果

NL/NW 为整数,则每条生产线将加工 NS 车甘蔗。否则,则有一些生产线会加工

1−NS 车甘蔗,但至少有一条生产线将加工 NS 车甘蔗。在任何情况下, 优解计划

的用时都是 DURNS ⋅ 小时。我们可以称 { }NS,,SLOTS K1= 为时间窗口的集合。

Page 112: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

101

必须为每车甘蔗分配一个时间窗口。我们定义一个二进制变量 wsprocess ,只有

在第w 车甘蔗分配给时间窗口 s 时其值才为 1(约束条件(6.4.1))。每车甘蔗都应有

一个与之对应的时间窗口(6.4.2),但由于有 NL 条并行的生产线,因此在每个时间

窗口中都可以同时处理 NL车甘蔗(6.4.3)。

SLOTSs,WAGONSw ∈∈∀ : { }10,processws ∈ (6.4.1)

WAGONSw∈∀ : 1=∑∈SLOTSs

wsprocess (6.4.2)

SLOTSs∈∀ : NLprocessWAGONSw

ws ≤∑∈

(6.4.3)

甘蔗的剩余质量寿命以小时单位,而不是以 DUR 小时为单位。因此一车甘蔗w

如果不希望完全变质,则允许向其分配的时间窗口 大值为 DUR/LIFEw 。(6.4.4)

式对每车甘蔗 w 给出了这个限制。注意,在此表达式中左边的时间窗口编号表示为

求和的形式:由于约束条件(6.4.2),只有使 1=wsprocess 的时间窗口标号 s 才会

计入求和。

WAGONSw∈∀ : DUR/LIFEprocesss wSLOTSs

ws ≤⋅∑∈

(6.4.4)

到时间窗口 s 时第w车甘蔗的总损失辆为 wLOSSDURs ⋅⋅ 。因此目标函数(蔗

糖总损失辆)可以用下面这个表达式(6.4.5)表示:

minimize ∑ ∑∈ ∈

⋅⋅⋅WAGONSw SLOTSs

wsw processLOSSDURs (6.4.5)

式(6.4.1)到(6.4.5)即定义了我们这个问题的模型。此线性问题属于 小费用

流问题类型。它与运输问题有一定关系(如第 10 章中的汽车租赁问题)。对于 小费

用流问题,用单纯形算法可以求得整数可行的 优线性规划解。因此我们可以将模型

中的整数约束条件替换为非负约束条件。

6.4.2 模型实现

下面是对此线性问题的 Mosel 实现。它使用函数 ceil 来计算时间窗口的 大值。

model "A-4 Cane sugar production"

uses "mmxprs"

declarations

NW = 11 ! 甘蔗货车数目

NL = 3 ! 生产线数目

WAGONS = 1..NW

Page 113: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

102

SLOTS = 1..ceil(NW/NL) ! 进行生产的时间窗口

LOSS: array(WAGONS) of real ! 损失率,单位为千克/小时

LIFE: array(WAGONS) of real ! 每车甘蔗的剩余寿命

DUR: integer ! 加工一车甘蔗所需的时间

process: array(WAGONS,SLOTS) of mpvar ! 如果在此时间窗口内进行加工则为 1

! 否则为 0

end-declarations

initializations from ‘a4sugar.dat’

LOSS LIFE DUR

end-initializations

! 目标函数

TotalLoss:= sum(w in WAGONS, s in SLOTS) s*DUR*LOSS(w)*process(w,s)

! 赋值

forall(w in WAGONS) sum(s in SLOTS) process(w,s) = 1

! 每个时间窗口内加工的货车数目

forall(s in SLOTS) sum(w in WAGONS) process(w,s) <= NL

! 原料寿命限制

forall(w in WAGONS) sum(s in SLOTS) s*process(w,s) <= LIFE(w)/DUR

forall(w in WAGONS, s in SLOTS) process(w,s) is_binary

! 求解此问题

minimize(TotalLoss)

6.4.3 结果

如果不对甘蔗的寿命进行限制,则可以求得 小损失为 1518 千克蔗糖。此时将

按照损失速度递减的顺序对每车甘蔗进行加工。如果增加寿命限制,则 小损失为

1620 千克。这时对应的加工方案显示于下表中(有若干个等效的解决方案)。

表格 6.9: 优加工方案

时间窗口 1 时间窗口 2 时间窗口 3 时间窗口 4

货车 3(74 千克) 货车 1(172 千克) 货车 9(114 千克) 货车 2(208 千克)

货车 6(108 千克) 货车 5(52 千克) 货车 10(168 千克) 货车 4(224 千克)

货车 7(124 千克) 货车 8(196 千克) 货车 11(180 千克)

Page 114: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

103

6.5 露天采矿

探测发现了一个露天铀矿。根据一些探测钻探的结果,发现这个矿可以分为若干

个可开采区。矿坑需要挖掘成阶梯形,以方便卡车开到矿坑底部。铀矿呈东西方向分

布。在西面有一个村庄,在东面是山脉,因此矿坑大小要受到它们限制。考虑了这些

限制之后,确定有 18 个可开采区,呈三层分布,总储量为 10,000 吨(如图 6.3)。为挖掘一个可开采区,首先需要掘开它上方的三个区块:其正上方的区块,以及其左

上和右上的区块(由于要形成梯形斜坡)。

图 6.3:露天矿山结构图

挖开第一层的区块每吨需要耗费 100 欧元,挖开的二层的区块每吨需要耗费 200欧元,挖开第三层的区块每吨需要耗费 300 元。但如果有区块是由含很多石英的石

头组成(显示为斜线区域),那么由于这些石头非常硬,因此每吨需要耗费 1000 欧

元。只有以灰色显示的区块才含有铀(1,7,10,12,17,18)。其市场价值分别

为 200,300,500,1000,和 1200 欧元/吨。第 18 区块,尽管也含有大量矿石,

但是此区块也和其他绘有斜线的区块一样,含有大量非常硬的石头。为使总收益达到

大,应掘开那些区块?

6.5.1 模型的数学表达

令 BLOCKS 代表这些区块的集合, bVALUE 为区块b 中每吨矿石的市场价格,

bCOST 为挖掘每吨石头的成本。则挖掘区块b 中的每吨石头带来的净收益可以表示

为 bb COSTVALUE − 。 区 块 挖 掘 的 顺 序 可 以 表 示 为 一 个 有 向 图

( )ARCS,BLOCKSG = ,其中 ARCS 代表连接两个区块的弧。弧 ( )a,b 即表示只有

在区块 a 已经挖掘之后才能挖掘区块 b 。例如,对于区块 16 则在图G 中有弧:

( )1016, , ( )1116, 和 ( )1216, ,而区块 10,11,12 也各有三条弧,如下图所示。

Page 115: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

104

为决定应挖掘哪些区块,我们引入二进制变量 bextract ,如果区块b 被挖掘,则

其取值为 1,否则为 0。这样就可以将这个问题描述为以下形式:

maximize ( )∑∈

⋅−BLOCKSb

bbb extractCOSTVALUE (6.5.1)

( ) ARCSa,b ∈∀ : ab extractextract ≤ (6.5.2)

BLOCKSb∈∀ : { }10,extractb ∈ (6.5.3)

需要 大化的目标函数(6.5.1)是从挖掘各个区块可以得到的总收益。约束条

件(6.5.2)将保证区块按照正确的顺序进行挖掘:如果b 被挖掘( 1=bextract ),

则 a 也应被挖掘( 1=aextract )。约束条件(6.5.3)定义了二进制变量。

图 6.4:区块 16 的挖掘先决关系图

可以将约束条件(6.5.2)替换为(6.5.4)的形式。在大规模的问题中,可能会

有很多其他变量和约束条件,因此用此表达式将能够减少约束条件的总数。这样改写

之后的约束条件比原先弱,即此问题被松弛了。在我们的例子中,这样做可能带来的

缺点是对于原先的问题表达,线性规划松弛的解就是整数解,但在进行如此松弛之后

可能就不是这样了。

( ) ARCSa,b,BLOCKSb ∈∃∈∀ :

( )

∑∈∃

≤⋅

ARCSa,bBLOCKSa

ab extractextract3 (6.5.4)

6.5.2 模型实现

下面是此线性规划模型的 Mosel 实现。使用二维数组对图进行编码,使得第二

层和第三层的每个区块都与其上方的三个节点相连。例如对于区块 16,则存在一行

Page 116: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

105

(16 1) 10 11 12,即为(16 1) 10 (16 2) 11 (16 3) 12 的简写。

model "A-5 Opencast mining"

uses "mmxprs"

declarations

BLOCKS = 1..18 ! 区块集合

LEVEL23: set of integer ! 第 2 层和第 3 层的区块

COST: array(BLOCKS) of real ! 区块的开采成本

VALUE: array(BLOCKS) of real ! 区块的价值

ARC: array(LEVEL23,1..3) of integer ! 标记开采顺序的弧

extract: array(BLOCKS) of mpvar ! 如果此区块已被开采则为 1,否则为 0

end-declarations

initializations from ‘a5mine.dat’

COST VALUE ARC

end-initializations

! 目标函数: 大化总收益

Profit:= sum(b in BLOCKS) (VALUE(b)-COST(b))* extract(b)

! 开采顺序

forall(b in LEVEL23)forall(i in 1..3) extract(b) <= extract(ARC(b,i))

forall(b in BLOCKS) extract(b) is_binary

! 求解此问题

maximize(Profit)

end-model

如前面所述,对于我们所使用的问题数学表达形式,对线性问题求得的解也是整

数解。一条普遍规则是,在首次尝试求解一个问题时,不要声明任何特殊类型的变量:

所研究的问题可能具有特殊的结果,使整数性约束冗余(对此问题的确如此),或者

对于特定的输入数据,在 优线性规划解中的所有变量都是整数值。你也可以在调用

优化算法时增加一个参数,以关闭整数性约束条件。例如在本例中你可以:

maximize(XPRS_LIN,Profit)

不加上整数性约束的另一个原因可能是所使用的优化软件对问题规模的限制

(Xpress-Optimizer 的学生版本只允许使用 800 个变量及约束条件,其中至多只允

许有 500个为混合整数变量或特殊有序集)。即使通过线性规划能够求得 优整数解,

但是如果定义了过多的整数变量,那么可能会导致问题无法求解。

6.5.3 结果

大收益为 4,000,000 欧元。应掘开区块 1 到 7,10 到 13,以及 17。区块 8,9,

Page 117: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

106

14 到 16,和 18 都将不被开挖。

6.6 电力生产

为满足每日电力需求(单位为兆瓦),可以选用四种不同类型的发电机。每日电

力需求如下表所示。

表格 6.10:每日用电需求(兆瓦)

时段 0am-6am 6am-9am 9am-12pm 12pm-2pm 2pm-6pm 6pm-10pm 10pm-12am

需求 12000 32000 25000 36000 25000 30000 18000

每种发电机都有一个 大发电能力,当接入电网时,其输出功率不应低于某一

小输出功率。所有发电机都存在一个启动成本,以及工作于 小功率状态时的固定的

每小时成本,并且如果功率高于 小功率,则超出部分的功率每兆瓦每小时还存在一

个成本,即边际成本。这些数据均列于下表中。

表格 6.11:发电机描述

可用数量 小输出功率

(MW)

大输出功率

(MW)

固定成本

(欧元/小时)

每兆瓦边际成本

(欧元/小时)

启动成本

型号 1 10 750 1750 2250 2.7 5000

型号 2 4 1000 1500 1800 2.2 1600

型号 3 8 1200 2000 3750 1.8 2400

型号 4 3 1800 3500 4800 3.8 1200

只有在每个时段开始时才允许启动或关闭发电机。与启动发电机不同,关闭发电

机不需要付出任何代价。在任意时刻,正在工作的发电机组必须留出 20%的发电能

力余量,以防用电量突然上升。问题是:在每个时段应分别使用哪些发电机才能够使

每天的总成本 小?

6.6.1 模型的数学表达

令 { }NT,,TIME K1= 为每天的时段集合,TYPES 为发电机型号集合。对于给

定的时段 t , tDEM 表示电网的用电量需求, tLEN (小时数)表示此时段长度。对

于任一发电机型号 p , pPMIN 和 pPMAX 分别表示它的 小和 大功率, pAVAIL

是可用的发电机数目。启动成本为 pCSTART , 小功率的每小时工作成本为

pCMIN ,每兆瓦每小时的边际成本为 pCADD 。

为对此模型进行数学描述,并处理不同类型的成本,我们需要三组变量。变量

ptstart 是在时段 t 开始时开始工作的型号 p 的发电机数量,且为整数值(6.6.1)。变

Page 118: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

107

量 ptwork 是在时段 t 内工作的型号 p 的发电机数量。此变量也为整数值,且不应超

过可用的此型号发电机数量 pAVAIL ,即有约束条件(6.6.2)。变量 ptpadd 表示型

号 p 的发电机在时段 t 内功率超出其 低功率之上的那部分。

TIMEt,TYPESp ∈∈∀ : Nstart pt ∈ (6.6.1)

TIMEt,TYPESp ∈∈∀ : { }ppt AVAIL,,,work K210∈ (6.6.2)

TIMEt,TYPESp ∈∈∀ : 0≥ptpadd (6.6.3)

对于一台型号 p 的发电机,其额外功率( 超出小功率之上的功率)不能超过

pp PMINPMAX − 。因此对于每个类型和每个时段,我们可以将发电机的额外功率

与正在工作的发电机数目关联起来:

TIMEt,TYPESp ∈∈∀ : ( ) ptpppt workPMINPMAXpadd ⋅−≤ (6.6.4)

为使每个时段内发电量都满足用电需求,因此有约束条件(6.6.5)。求和符号中

第一项是对所有各种发电机的 小功率进行求和,第二项是对所有发电机的额外功率

进行求和。

TIMEt ∈∀ : ( ) tTYPESp

ptptp DEMpaddworkPMIN ≥+⋅∑∈

(6.6.5)

在不启动新的发电机的前提下,当前正在工作的发电机的发电能力必须比实际用

电量高 20%,因此有:

TIMEt ∈∀ : tTYPESp

ptp DEM.workPMAX ⋅≥⋅∑∈

201 (6.6.6)

如果不会关闭发电机,则在时段 t 开始时开始工作的发电机数目应等于于在时段

t 和 1−t 中工作的发电机数量之差。但有些发电机可能会被关闭(由于对成本不会带

来影响,因此未说明),则开始工作的发电机数量应至少等于此差值(6.6.7)。针对

当日午夜和次日凌晨这两个时段,因此还有约束条件(6.6.8)。

{ }NT,,t,TYPESp K2∈∈∀ : 1−−≥ t,pptpt workworkstart (6.6.7)

TYPESp∈∀ : NT,ppp workworkstart −≥ 11 (6.6.8)

每日成本(6.6.9)中包括发电机启动成本, 小功率工作的成本,以及额外功

率的成本。后两项与工作的时段长度成正比。

minimize (6.6.9)

( )( )∑ ∑∈ ∈

⋅+⋅⋅+⋅TYPESp TIMEt

ptpptptptp paddCADDworkCMINLENstartCSTART

Page 119: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

108

式(6.6.1)到(6.6.9)即组成了此问题的混合整数模型的完整表达。

6.6.2 模型实现

可以将前面的数学模型转化为如下的 Mosel 程序。通过使用 Mosel 语言的内联

if 函数,约束条件(6.6.7)和(6.6.8)都可以通过一行代码来实现。注意,我们没

有将变量 start 定义为整数,这时由于此变量等于整数变量 work 的差值,如约束条

件(6.6.7)所示,因此它将自动取整数值。

model "A-6 Electricity production"

uses "mmxprs"

declarations

NT =7

TIME = 1..NT ! 时间段

TYPES = 1..4 ! 发电机类型

LEN, DEM: array(TIME) of integer !每个时段的长度和用电量

PMIN,PMAX: array(TYPES) of integer !发电机的 小和 大输出功率

CSTART: array(TYPES) of integer ! 发电机的启动成本

CMIN: array(TYPES) of integer ! 小功率的每小时成本

CADD: array(TYPES) of real ! 超出 小功率以上的每兆瓦每小时成本

AVAIL: array(TYPES) of integer ! 每种类型的发电机数量

start: array(TYPES,TIME) of mpvar ! 在一个时段开始时启动的发电机数量

work: array(TYPES,TIME) of mpvar ! 在一个时段中工作的发电机数量

padd: array(TYPES,TIME) of mpvar ! 超出 小输出功率之上的功率部分

end-declarations

initializations from ‘a6electr.dat’

LEN DEM PMIN PMAX CSTART CMIN CADD AVAIL

end-initializations

! 目标函数:每日总成本

Cost:= sum(p in TYPES, t in TIME) (CSTART(p)*start(p,t)+

LEN(t)*(CMIN(p)*work(p,t) + CADD(p)*padd(p,t)))

! 每个时段开始时启动的每种类型的发电机数量

forall(p in TYPES, t in TIME)

start(p,t) >= work(p,t) -if(t>1, work(p,t-1), work(p,NT))

! 对超出 小功率之上的功率的要求

forall(p in TYPES, t in TIME) padd(p,t) <= (PMAX(p)-PMIN(p))*work(p,t)

Page 120: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

109

! 满足用电需求

forall(t in TIME) sum(p in TYPES) (PMIN(p)*work(p,t) + padd(p,t)) >= DEM(t)

! 为安全保留 20%的发电能力余量

forall(t in TIME) sum(p in TYPES) PMAX(p)*work(p,t) >= 1.20*DEM(t)

! 对可用发电机数量的约束,必须为整数

forall(p in TYPES, t in TIME) do

work(p,t) <= AVAIL(p)

work(p,t) is_integer

end-do

! 求解此问题

minimize(Cost)

end-model

6.6.3 结果

对此问题的 优线性规划解是每日 小成本为 985164.3 欧元。 优的整数解为

每日 小成本 1,465,810 欧元。对于每个时段和每个型号的发电机,下表中列出了总

输出功率和超出 低功率之上的输出功率。

表格 6.12:发电机使用计划

型号 0am-6am 6am-9am 9am-12pm 12pm-2pm 2pm-6pm 6pm-10pm 10pm-12am

1 使用数量 3 4 4 7 3 3 3

总功率 2250 4600 3000 8600 2250 2600 2250

额外功率 0 1600 0 3350 0 350 0

2 使用数量 4 4 4 4 4 4 4

总功率 5750 6000 4200 6000 4950 6000 5950

额外功率 1750 2000 200 2000 950 2000 1950

3 使用数量 2 8 8 8 8 8 4

总功率 4800 16000 16000 16000 16000 16000 8000

额外功率 1600 6400 6400 6400 6400 6400 3200

4 使用数量 0 3 1 3 1 3 1

总功率 0 5400 1800 5400 1800 5400 1800

额外功率 0 0 0 0 0 0 0

通过观察此表格我们可以推测在何种情况下启动和停止发电机:对于型号 1 的

发电机,在时段 2 开始时关闭一台,在时段 4 开始时关闭三台,在时段 4 之后关闭

四台。而四台型号 2 的发电机都将连续工作。对于型号 3 的发电机,在时段 2 开始

时启动刘太,在时段 6 结束后关闭四台,在一天结束时再关闭两台。对于型号 4 的

发电机,在时段 2 开始时启动三台,到下一个时段时关闭两台,然后在下面的几个

时段这两台反复开闭,直到一天结束时,三台发电机都关闭。

Page 121: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

110

6.7 参考文献和进阶阅读

在历史上,混合问题是线性规划的第一个应用领域。在下面这些文献中你可以找

到本章前三个问题的参考材料:Glen 在[Gle80]中描述了一个为牛群混合饲料的问题,

Sutton 和 Coates 在[SC81]中就钢铁工业中的混合问题进行了研究,McColl 在

[McC69]中给出了线性规划在石油工业中的一个应用。

制糖厂问题属于流问题大家族,流问题在 Ahuja,Magnanti 和 Orlin 的著作

[AMO93]中有详细介绍。露天采矿问题 终可以转化为求解图的 大权重闭包问题,

此问题也可以用流算法求解(请参考 Ahuja 等的著作的第 19 章)。Williams 在[Wil93]中介绍了应如何在三维空间中对区块进行安排。

Garver 在[Gar63]中就已经研究过了发电问题。发电问题属于分配问题家族,其

目的是以 小代价满足每个时期的需求,且激活或释放资源也都需要代价(请参考

[Gar00])。与第 8 章中的生产计划问题相比,主要不同点在于成本,以及发电机组无

法工作于某一 小输出功率之下这一事实。可以对供电问题再进行具体化,例如水电

站,并往往与热电或核电厂联合,以更便于满足用电需求[SM74]。

Page 122: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

111

第 7 章 调度问题

调度问题是运筹学中的一类重要问题。调度问题主要研究在满足各种约束条件

(任务顺序,截止日期,有限资源等)的条件下,应如何执行一组任务才能够 小化

某个目标函数,例如总需时,未按时完成的任务数,等等。在许多领域中都会出现这

种问题,例如工程管理,工业生产,电信通讯,信息系统,运输,时间表制定等。除

了工程调度之外,大多数这种类型的问题在规模增大之后都很难求得 优解。然而,

规模较小的此类问题则可以借助现有的软件通过线性规划进行求解。

本章将只涉及工程调度和生产调度问题。在 7.1 节中,我们将研究一个建造体育

馆的例子,这是一个土木工程中工程调度的典型例子。然后我们将研究三个关于车间

管理的问题。第 7.2 节中将介绍一个组织为生产线形式的车间(流水线车间,flow shop),在其中所有产品都将以相同的顺序通过各项工序处理。在第 7.3 节的任务车

间(job shop)中,每种产品在此车间中各种机器上的加工顺序都不相同。在 7.4 节

中将处理涉及关键机器(critical machine)的问题,关键机器即整个车间运行的瓶颈。

在 7.5 节中我们将研究如何对一条放大器组装线上的工作负荷进行分配,以使生产率

达到 大。

本书中也研究了一些其他领域的调度问题:航空运输(第 11 章),电信通讯(第

12 章),以及时间表制定(第 14 章)。

7.1 体育馆建设

为了向本市居民提供更好的服务,某市政府决定修建一个小型体育馆。通过竞标,

一家本地的建筑公司获得了此合同,并且希望尽快完成此工程。在下表中列出了工程

中的主要任务。需时均以星期计。有些任务只有在某些其他任务完成之后才能进行。

此表格的 后两列对应于下面的问题 2。

问题 1: 早能在什么时候完成此工程?

问题 2:市政府希望能够提前完工(比问题 1 的答案提前)。为此,市政府决定

工期每缩短一周,则向此公司支付 30 千欧元的奖励。为缩短工期,建筑公司需要雇

佣更多工人,并租借更多设备。在下表中列出了每项任务能够缩短的 长时间( 大

缩短时间列),以及相关的每周额外支出。如果建筑公司希望使利润 大,那么应在

何时完成此工程?

7.1.1 问题 1 的数学表达

此问题是一个经典的工程调度问题。我们加入一个虚拟的任务,此任务耗时长度

为 0,对应于此工程的结尾。因此可以将任务集合写成 { }N,,TASKS K1= ,其中 N

Page 123: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

112

是我们所假定的结尾任务。令 iDUR 为任务 i 所需耗费的时间。我们使用先决关系图

(precedence graph) ( )ARCS,TASKSG = 来表示任务之间的先后关系,其中

ARCS 是弧的集合(弧 ( )j,i 表示任务 i 需要在任务 j 之前完成)。根据表 7.1 中所列

出的先决关系,可以很容易地构造出这样的一幅图。其中我们加入的虚拟任务需要在

所有任务都完成之后才能进行,并且在此后不会再有其他任务。

表格 7.1:体育馆施工数据

任务 描述 耗时 先决任务 大缩短时

每周额外支

1 工地布置 2 没有 0 -

2 场地平整 16 1 3 30

3 打地基 9 2 1 26

4 通路及其他道路网络 8 2 2 12

5 底层施工 10 3 2 17

6 主场地施工 6 4,5 1 15

7 划分更衣室 2 4 1 8

8 看台电气布置 2 6 0 -

9 顶部施工 9 4,6 2 42

10 照明系统 5 4 1 21

11 安装阶梯看台 3 6 1 18

12 封顶 2 9 0 -

13 更衣室 1 7 0 -

14 建造售票处 7 2 2 22

15 第二通路 4 4,14 2 12

16 信号设施 3 8,11,14 1 6

17 草坪与附属运动设施 9 12 3 16

18 交付使用 1 17 0 -

我们引入变量 istart 表示任务 i 的 早开始时间。唯一的约束条件是任务的先后

顺序。只有在其先决任务都完成之后,任务 j 才可以进行,即可以表示为约束条件

(7.1.1)式:如果在 i 和 j 之间有一条弧相连,则任务 i 的完成时间(starti+DURi)必须不大于任务 j 的开始时间。

( ) ARCSj,i ∈∀ : jii startDURstart ≤+ (7.1.1)

目标函数即 小化此工程的完成时间,即我们所加入的 后一个假想工程 N 的

完成时间。这样加入如下式之后即可以完成此模型的数学表达:

minimize Nstart (7.1.2)

TASKSi∈∀ : 0≥istart (7.1.3)

Page 124: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

113

图 7.1:任务之间的先决关系图

7.1.2 问题 1 的程序实现

可以很容易地将上述数学模型转化为 Mosel 程序。使用二维二值数组 ARC 表示

图中的弧,若弧 ( )j,i 存在,则元素 1=jARCi ,否则 0=jARCi 。在对此数组进行

定义时,我们不指定数组的索引集,而是使用关键字 range,从而定义一个动态数组,

只有从数据文件读入的数组元素才会存在。在数据文件中将只包含预定义的弧列表

(使用稀疏矩阵进行定义,在稀疏矩阵中,不需要定义所有的矩阵元素,这一点与紧

密矩阵不同)。注意,此问题中的目标函数只是一个变量(即虚拟的结尾任务)。

model "B-1 Stadium construction (First part)"

uses "mmxprs"

declarations

N = 19 ! 工程中的任务数( 后一个是虚拟的结尾任务)

TASKS=1..NARC: array(range,range) of real ! 邻接图矩阵

DUR: array(TASKS) of real ! 各个任务的耗时

start: array(TASKS) of mpvar ! 各个任务的开始时间

end-declarations

initializations from 'b1stadium.dat’

ARC DUR

end-initializations

! 任务之间的先决关系

forall(i,j in TASKS | ARC(i,j)=1) start(i) + DUR(i) <= start(j)

Page 125: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

114

! 求解第一个问题: 小化总耗时

minimize(start(N))

end-model

7.1.3 问题 1 的结果

执行此程序可以求得完成建造此体育馆需要 64 个星期,即 1 年又 3 个月。在图

7.2 中给出了一个可行的解决方案(由于任务 10 可以在区间[26, 59]中的任一时刻开

始而不会对总完成时间带来影响,因此存在多个可行方案)。在此柱状图中,每个任

务都用一个矩形表示,矩形长度与任务的耗时长度成正比。任务矩形在垂直方向上的

位置无关紧要。矩形中的阴影区域表示此任务可以缩短的 大时间(请参考问题 2)。

图 7.2:问题 1 的解

7.1.4 问题 2 的数学表达

第二个问题称为赶工情况下的工程调度(scheduling with project crashing)。为

缩短工程的总耗时,我们需要考虑前面的优化结果。定义变量 isave ,表示希望使第

i 项任务缩短的时间星期数。在表7.1中的“ 大缩短时间”列中给出了每个变量 isave

的上限。设此可缩短长度上限为 iMAXW (单位为星期)。则除了 后一个假想任务

之外,所有任务都必须满足约束条件(7.1.4)。

{ }N\TASKSi∈∀ : ii MAXWsave ≤ (7.1.4)

对于 后一项任务,变量 Nsave 表示此工程比问题 1 中求得的 优解能够缩短的

总时间星期数。新的完工时间 Nstart 必须等于问题 1 中求得的 短耗时减去 Nsave ,

即得到约束条件(7.1.5):

iN saveobjstart −= 1 (7.1.5)

Page 126: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

115

为将新的变量 isave 纳入考虑,需要对约束条件(7.1.1)进行修改。一项任务的新

完 成 时 间 等 于 其 开 始 时 间 加 上 任 务 长 度 然 后 减 去 缩 短 时 间 , 即

iii saveDURstart −+ 。将此约束条件重命名为式(7.1.6)。

( ) ARCSj,i ∈∀ : jiii startsaveDURstart ≤−+ (7.1.6)

在第二个问题中目标函数也要进行重新定义。现在我们希望使工程的利润 大。

工期每缩短一周,则可以得到奖金 BONUS 千欧元。但任务 i 每提前一周完成就需要

额外支出 iCOST 千欧元(表 7.1 中的每周额外支出列)。则新的目标函数为式(7.1.7)。

maximize { }

∑∈

⋅−⋅N\TASKi

iiN saveCOSTsaveBONUS (7.1.7)

这样式(7.1.6),(7.1.7),(7.1.3),(7.1.4),(7.1.5)就组成了此问题的新的

数学模型,且对变量 isave 都有非负条件约束。

7.1.5 问题 2 的程序实现

可以在上述问题 1 的模型基础上进行追加来来实现问题 2 的模型,只需在同一

个 Mosel 程序中进行。这样就可以首先得到问题 1 的解,然后无须任何人工交互就

在问题 2 中使用此解。

由于我们要对第一个模型进行一些追加修改,因此我们需要重复问题 1 的程序。

在第一部分基础上追加的内容有:

♦ 求解结果打印子程序:我们希望两次打印出问题的求解结果(即,安排各项

任务的开始时间)。为避免多次重写同样的代码,我们定义了一个子程序

(subroutine),在需要打印求解结果时只须调用此子程序即可。现在模型

的第三行将对函数 print_sol 进行声明,此函数将在程序 后进行定义。如

果需要在其定义之前就调用一个用户定义的子程序,则需要使用这种类型的

声明(使用关键字 forward)。子程序与 Mosel 模型的结构相似;在后面几

章中我们将看到更多子程序的例子。

♦ 对先决关系约束条件进行了命名:Mosel 将按对模型进行增量式定义。如果

只是在模型的第二部分中加入对先决关系约束条件的新定义,则之前对这些

约束条件的定义将仍然保留。通过对约束条件进行命名,然后重新为其进行

赋值,就可以覆盖原先的定义。

♦ 使用了实数 obj1 来存储第一个问题的解。

在求解第二个问题之后,可以使用函数 getsol(也可以使用 getobjval,我们使

用 getsol 的目的是为了弄清楚定义当前目标函数的约束条件是什么)。如果对约束条

件使用函数 getsol,则它将返回在当前解时约束条件的值(注意,约束条件存储为变

Page 127: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

116

量项-右值的形式,此函数将对此表达式进行求值)。

model "B-1 Stadium construction (Complete model)"

uses "mmxprs"

forward procedure print_sol

declarations

N = 19 ! 工程中的任务数( 后一项为虚拟的结尾任务)

TASKS=1..N

ARC: array(range,range) of real ! 邻接图矩阵

DUR: array(TASKS) of real ! 各项任务耗时

start: array(TASKS) of mpvar ! 各项任务开始时间

obj1: real ! 第一个问题的解

end-declarations

initializations from ‘b1stadium.dat’

ARC DUR

end-initializations

! 任务之间的先决关系

forall(i,j in TASKS | ARC(i,j)=1)

Prec(i,j):= start(i) + DUR(i) <= start(j)

! 求解第一个问题: 小化总耗时

minimize(start(N))

obj1:=getobjval

! 打印求解结果

print_sol

! **** 对问题进行扩展****

declarations

BONUS: integer ! 工期每缩短一周能获得的奖金

MAXW: array(TASKS) of real ! 每项任务 大缩短时间(星期数)

COST: array(TASKS) of real ! 每项任务每缩短一周需要的支出

save: array(TASKS) of mpvar ! 工期缩短的星期数

end-declarations

initializations from ‘b1stadium.dat’

MAXW BONUS COST

end-initializations

! 第二个目标函数

Page 128: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

117

Profit:= BONUS*save(N) -sum(i in 1..N-1) COST(i)*save(i)

! 重新定义任务之间的先决顺序

forall(i,j in TASKS | ARC(i,j)=1)

Prec(i,j):= start(j) -start(i) + save(i) >= DUR(i)

! 总耗时

start(N) + save(N) = obj1

! 大可缩短时间

forall(i in 1..N-1) save(i) <= MAXW(i)

! 求解第二个问题: 大化总利润

maximize(Profit)

! 打印求解结果

writeln("Total profit: ", getsol(Profit))

print_sol

!----------------------------------------------------------------

procedure print_sol

writeln("Total duration: ", getsol(start(N)), " weeks")

forall(i in 1..N-1)

write(strfmt(i,2), ": ", strfmt(getsol(start(i)),-3),

if(i mod 9 = 0,"\n",""))

writeln

end-procedure

end-model

7.1.6 问题 2 的结果

此问题的解表明,可以提前 10 星期完工,建筑公司可以获得的总利润为 87,000欧元。下图显示了每项任务新的开始时间(注意,存在多个可行计划)。

Page 129: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

118

图 7.3:问题 2 的解

7.2 流水线车间调度

有一个车间为汽车生产金属管件,在此车间中有三台机器,分别用于弯曲金属管,

焊接连接处,以及装配各单元。此车间需要生产六种加工件。其加工工序需时(分钟)

列于下表中。每个加工件都需要首先进行弯折,然后进行焊接, 后进行装配。在进

入工序之后,每项加工工序都不允许打断,但在两道工序之间可以等待一段时间。

表格 7.2:加工时间(分钟)

加工件 1 2 3 4 5 6

弯折 3 6 3 5 5 7

焊接 5 4 2 4 4 5

装配 5 2 4 6 3 6

每台机器每次只能处理一个加工件。在等候下一台机器处理时,不允许排在后面

的加工件“插队”到前面。这样如果在一开始为所有加工件建立了一个加工顺序,则

在每台机器上都将严格按照此顺序进行加工。应采取什么样的顺序才能使所有加工件

完成加工所需的总时间 短?

7.2.1 模型的数学表达

{ }NM,,MACH K1= }表示机器集合, { }NJ,,JOBS K1= 表示待加工的加工

件(任务)集合。一个加工件 j 在机器m 上所需的加工时间为 mjDUR 。每个加工件

都必须按照预定的顺序经过机器 NM,,K1 进行处理,不允许插队。因此决定加工件

的初始顺序即决定了整个加工过程方案。此加工方案的总需时就是机器 NM 完成

后一项工作的时间。

可以借助二值变量 jkrank 来定义任务序列,只有加工件 j 在起始队列中排序(位

置)为 k 时, jkrank 的值才为 1(7.2.1)。由于每项任务都需要安排一个排序顺序

(7.2.2),在每个排序顺序只能安排一项任务(7.2.3),因此起始位置序列 RANKS 与

任务集合 JOBS 相同。这些约束条件是典型的分配问题(请参考第 14 章分配人员到

不同工作站的例子)。

RANKSk,JOBSj ∈∈∀ : { }10,rank jk ∈ (7.2.1)

RANKSk ∈∀ : 1=∑∈JOBSj

jkrank (7.2.2)

JOBSj∈∀ : 1=∑∈RANKSk

jkrank (7.2.3)

Page 130: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

119

在这个问题中,根据任务排序计算操作的开始或完成时间相对比较困难。为求得

这些数值,我们引入两组变量 mkempty 和 mkwait (7.2.4)-(7.2.5)。变量 mkempty (m

属于MACH ,k 的值为 11 −NJ,,K )表示在机器m 上处理排序为 k 和 1+k 的任务

之间的等待时间,即机器m 在完成排序为 k 的加工件之后的空闲时间。变量 mkwait

(m 取值为 NM,,K1 , k 属于 RANKS )为排序为 k 的加工件在机器m 和 1+m 上

进行处理之间的等待时间。

在第一台机器处理加工件时不需要等待前面的机器完成加工,因此变量 kempty1

都为 0(7.2.6)。类似地,序列中的第一个加工件在所有机器上加工时都不需要等待

前面的加工件完成加工,因此变量 1mwait 的值也都是 0(7.2.7)。

11 −=∈∀ NJ,,k,MACHm K : 0≥mkempty (7.2.4)

RANKSk,NM,,m ∈−=∀ 11K : 0≥mkwait (7.2.5)

11 −=∀ NJ,,k K : 01 =kempty (7.2.6)

11 −=∀ NM,,m K : 01 =mwait (7.2.7)

为简化对下面的约束条件的数学表达,我们引入符号 mkdur 表示排序为 k 的任务

在机器 m 上进行加工所需的时间,其定义可以表示为式(7.2.8)。由于约束条件

(7.2.3),在此求和中只有一个 jkrank 取值为 1,因此将只计入其对应的加工件的处

理时间。使用此符号及变量 mkempty ,我们可以将目标函数写为(7.2.9)式的形式。

RANKSk,MACHm ∈∈∀ : ∑∈

⋅=JOBSj

jkmjmk rankDURdur (7.2.8)

minimize

∑∑ ∑∑∑−

=

= ∈

=

=

+⋅=+1

1

1

1

1

1

1

11

NJ

kk,NM

NM

m JOBSjjkmj

NJ

kk,NM

NM

mm emptyrankDURemptydur (7.2.9)

其中第一个求和得到 后一台机器(机器 NM )开始工作的时间:即第一项任

务在前面的所有机器上( 11 −NM,,K )完成加工所需的时间。第二个求和得到在

后一台机器上的总空闲时间。下图给出了这些量的示意。由于 后一台机器上的所有

处理的总时间长度为常数,因此我们不需要将这部分时间计入考虑。

Page 131: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

120

图 7.4:生产时间与空闲时间之间的关系

那么现在要做的就是将变量 mkwait 和 mkempty 与变量 jkrank 联系起来。为此,

我们引入变量 mkdnext ,即在机器m 上完成任务 k 和在机器 1+m 上开始任务 1+k 之

间的时间间隔。

图 7.5:计算总时间

借助图 7.5,我们很容易可以看出等式(7.2.10)成立。可以由此得出约束条件

(7.2.11)。

1111 −=−=∀ NJ,,k,NM,,m KK :

k,mk,mmk

k,mk,mmkmk

emptydurwaitwaitduremptydnext

11

11

++

++

++

=++=

(7.2.8)1111 −=−=∀ NJ,,k,NM,,m KK :

k,mJOBSj

k,jj,mmk

k,mJOBSj

k,jmjmk

emptyrankDURwait

waitrankDURempty

11

11

+∈

+

+∈

+

+⋅+

=+⋅+

(7.2.9)

这样 终的模型就可以用(7.2.1)到(7.2.7),(7.2.9),以及(7.2.11)表示。

由于变量 jkrank 必须为整数(更确切地说,必须为二值变量),因此这是一个混合整

数规划问题。

Page 132: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

121

7.2.2 模型实现

下面的 Mosel 程序即实现了上述的数学模型。为更便于求解出 终的调度方案,

可以加入变量 mkstart ,表示排序为 k 的任务在机器m 上的开始时间。这些变量都可

以通过另外的一组约束条件与变量 jkrank 关联起来。

model "B-2 Flow shop"

uses "mmxprs"

declarations

NM = 3 ! 机器数量

NJ = 6 ! 任务数量

MACH = 1..N

MRANKS = 1..N

JJOBS = 1..NJ

DUR: array(MACH,JOBS) of integer ! 一台机器上处理各任务所需的时间

rank: array(JOBS,RANKS) of mpvar ! 如果为 1,则任务 j 的顺序为 k,否则为 0

empty: array(MACH,1..NJ-1) of mpvar ! 在任务 k 和 k+1 之间的空闲时间

wait: array(1..NM-1,RANKS) of mpvar ! 任务 k 在机器 m 和 m+1 上处理之间的等待时间

start: array(MACH,RANKS) of mpvar ! 任务 k 在机器 m 上开始执行的时间(可选)

end-declarations

initializations from ‘b2flowshop.dat’

DUR

end-initializations

! 目标函数: 后一台机器上的总等待时间(=第一项任务之前的等待时间+任务之间的等待时间)

TotWait:= sum(m in 1..NM-1,j in JOBS) (DUR(m,j)*rank(j,1)) +

sum(k in 1..NJ-1) empty(NM,k)

! 每个排序位置上都有一项任务

forall(k in RANKS) sum(j in JOBS) rank(j,k) = 1

! 每个任务都被分配到一个排序位置

forall(j in JOBS) sum(k in RANKS) rank(j,k) = 1

! 排序为 k 的任务在机器 m 上完成执行的时间与在机器 m+1 上开始执行的时间之间的关系

forall(m in 1..NM-1,k in 1..NJ-1)

empty(m,k) + sum(j in JOBS) DUR(m,j)*rank(j,k+1) + wait(m,k+1) =

wait(m,k) + sum(j in JOBS) DUR(m+1,j)*rank(j,k) + empty(m+1,k)

Page 133: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

122

! 计算开始时间(为方便解释结果)

forall(m in MACH, k in RANKS)

start(m,k) = sum(u in 1..m-1,j in JOBS) DUR(u,j)*rank(j,1) +

sum(p in 1..k-1,j in JOBS) DUR(m,j)*rank(j,p) +

sum(p in 1..k-1) empty(m,p)

! 第一台机器的空闲时间为 0

forall(k in 1..NJ-1) empty(1,k) = 0

! 第一项任务的等待时间为 0

forall(m in 1..NM-1) wait(m,1) = 0

forall(j in JOBS, k in RANKS) rank(j,k) is_binary

! 求解此问题

minimize(TotWait)

end-model

可以注意到,在这里可以使用一类特殊有序集,从而不需要限制变量 jkrank 为

二值变量。这样上述程序中的对应行即可以用下面两行代替:

forall(j in JOBS) sum(k in RANKS) k*rank(j,k) is_sos1

或者

forall(k in RANKS) sum(j in JOBS) j*rank(j,k) is_sos1

在前者中,我们为每个任务定义一个一类特殊有序集,其中任务的排序号即作为

加权系数;在后者中,为每个排序位置建立一个一类特殊有序集,使用任务号作为加

权系数。在一类特殊有序集中,有且只有一个变量取值大于 0,并且由于约束条件

(7.2.2)和(7.2.3),此取值必定为 1。

7.2.3 结果

后一台机器的 小等待时间为 9。借助于变量 mkstart ,我们可以推导出总耗

时为 35。下表中给出了一种能够使耗时为此 小值的调度方案(有多种可行方案)。

表格 7.3:一种 优加工方案

序号 1 2 3 4 5 6

加工件号 3 1 4 6 5 2

机器 1开始 0 3 6 11 18 23

机器 2开始 3 6 11 18 23 29

机器 3开始 5 11 16 23 29 33

Page 134: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

123

7.3 任务车间调度

有一家公司收到三种类型墙纸的订单:第一种(墙纸 1)在蓝色背景上有黄色图

案,第二种(墙纸 2)在绿色背景上有蓝色和黄色图案;第三种(墙纸 3)在黄色背

景上有蓝色和绿色图案。在生产时,每种类型的墙纸都是一个连续的纸卷,并且将要

通过若干台机器,每台机器向其上印刷不同的颜色。墙纸通过机器的顺序取决于墙纸

的设计:对于墙纸 1,首先印刷蓝色背景,然后印刷黄色图案;对于墙纸 2,首先印

刷绿色背景,然后先印刷蓝色图案再印刷黄色图案;对于墙纸 3,首先印刷黄色背景,

然后先印刷蓝色图案再印刷绿色图案。

图 7.6:印刷机之间的生产流

每一个工序的处理时间取决于需要向其上印刷的对象。每种墙纸类型每种颜色的

印刷时间(分钟)列于下表中。

表格 7.4:每种颜色印刷需时

机器 颜色 墙纸 1 墙纸 2 墙纸 3

1 蓝色 45 20 12

2 绿色 - 10 17

3 黄色 10 34 28

每台机器同时只能处理一种墙纸,一种墙纸不能同时由多台机器进行处理,那么

应如何制定墙纸在机器之间的印刷计划才能使订单尽快完成?

7.3.1 模型的数学表达

令 JOBS 为一组任务(墙纸类型),MACH 为机器集合。使用变量 mjstart 表示

任务 j 在机器m 上的开始时间(假定在 0 时刻开始进行生产)。用 mjDUR 表示任务 j

在机器m 上的处理时间,变量 finish 表示完成整个生产计划所需的时间。由于我们

希望 小化完成生产所需时间,因此目标函数可以表示为式(7.3.1)。

minimize finish (7.3.1)

在所有类型的墙纸都完成印刷之后,生产计划即完成,即在每种墙纸的 后一个

Page 135: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

124

工序都完成之后计划即完成。因此计划的完成时间应满足下面的约束条件(7.3.2)-(7.3.4)。

3131 DURstartfinish +≥ (7.3.2)

3232 DURstartfinish +≥ (7.3.3)

2323 DURstartfinish +≥ (7.3.4)

在各道工序之间有两种约束条件:连接性约束(conjunctive constraint)表示对

于某种墙纸类型各道工序之间的先决次序,互斥性约束(disjunctive constraint)表

示一台机器在一个时刻只能执行一种操作。

我们首先考虑连接性约束。墙纸 1 将首先进入印刷蓝色的机器(机器 1),然后

进入印刷黄色的机器(机器 3)。这表示必须首先在机器 1 上完成对墙纸 1 的处理,

然后才可以在机器 3 上开始处理墙纸 1,因此应满足约束条件(7.3.5)。

311111 startDURstart ≤+ (7.3.5)

类似地,墙纸 2 首先在机器 2 上进行处理,然后到机器 1 上进行处理,然后到

机器 3 上进行处理,因此即有约束条件(7.3.6)和(7.3.7)。

122222 startDURstart ≤+ (7.3.6)

321212 startDURstart ≤+ (7.3.7)

对于墙纸 3,处理顺序为机器 3,机器 1,机器 2,因此可以得到下面的约束条

件(7.3.8)和(7.3.9)。

133333 startDURstart ≤+ (7.3.8)

231313 startDURstart ≤+ (7.3.9)

我们也需要对互斥性约束进行建模。机器 1 需要处理所有三种类型的墙纸。由

于一台机器在一个时刻只能进行一种操作,因此墙纸 1 和墙纸 2 必定有一个在另一

个之前处理。这种关系可以表示为下面的式子:

111212121111 tstarDURstartstartDURstart ≤+∨≤+

这两个互斥的约束条件可以表示为约束条件(7.3.10)和(7.3.11),其中 M 是

一个足够大的正数, y 是一个二值变量,在机器 1 上先处理墙纸 1 再处理墙纸 2 时,

y 取值为 1,否则为 0。

( )1121111 1 yMstartDURstart −⋅+≤+ (7.3.10)

Page 136: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

125

1111212 yMstartDURstart ⋅+≤+ (7.3.11)

我们来看看为什么可以这样表示。如果在机器 1 上墙纸 1 先于墙纸 2 进行处理,

则 1y 取 值 为 1 , 可 以 得 到 约 束 条 件 为 121111 startDURstart ≤+ 以 及

MstartDURstart +≤+ 111212 。第一个约束条件要求在机器 1 上必须完成处理墙纸

1 才能开始处理墙纸 2。无论 11start 和 12start 取何值,由于M 足够大,第二个约束

条件都将自动满足。反之,如果在机器 1 上墙纸 2 先于墙纸 1 进行处理,则 1y 取值

为 0 , 因 此 约 束 条 件 变 为 MstartDURstart +≤+ 121111 以 及

111212 startDURstart ≤+ 。这样第一个约束条件即自动满足,第二个约束条件将保

证在开始处理墙纸 1 之前已经完成处理墙纸 2。

按照这种方式,我们可以通过为每个互斥关系定义一个二值变量 dy

( ND,,d K1= )来表示同一台机器上两种相互斥的操作。因此可以得到下面的约

束条件(7.3.12)-(7.3.23)。

( )2131111 1 yMstartDURstart −⋅+≤+ (7.3.12)

2111313 yMstartDURstart ⋅+≤+ (7.3.13)

( )3131212 1 yMstartDURstart −⋅+≤+ (7.3.14)

3121313 yMstartDURstart ⋅+≤+ (7.3.15)

( )4232222 1 yMstartDURstart −⋅+≤+ (7.3.16)

4222323 yMstartDURstart ⋅+≤+ (7.3.17)

( )5323131 1 yMstartDURstart −⋅+≤+ (7.3.18)

5313232 yMstartDURstart ⋅+≤+ (7.3.19)

( )6333131 1 yMstartDURstart −⋅+≤+ (7.3.20)

6313333 yMstartDURstart ⋅+≤+ (7.3.21)

( )7333232 1 yMstartDURstart −⋅+≤+ (7.3.22)

Page 137: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

126

7323333 yMstartDURstart ⋅+≤+ (7.3.23)

约束条件(7.3.12)-(7.3.15)建立了机器 1 上的其他互斥关系,约束条件(7.3.16)和(7.3.17)建立了机器 2 上墙纸 2 和墙纸 3 的互斥关系,约束条件(7.3.18)-(7.3.23)建立了在机器 3 上各种墙纸之间的互斥关系。

为避免数值不稳定性,M 的取值不应过大。例如可以根据某些直观判断选择此

计划的某个上界UB 值作为 M 的值。此时需要向此数学模型加入下面的约束条件

(7.3.24),这样有助于减少树搜索的结点数目。

UBfinish ≤ (7.3.23)

在我们这个小实例中,我们将使用所有处理时间之和作为M 的值,这样虽然粗

略,但不失为一个安全的上界。

为完成对模型的数学表达,我们需要为开始时间变量加入非负约束(7.3.25),

并限定 dy 为二值变量(7.3.26)。

JOBSj,MACHm ∈∈∀ : 0≥mjstart (7.3.24)

{ }ND,,d K1∈∀ : { }10,yd ∈ (7.3.25)

通过使用单个下标来对操作(任务)进行重新编号(得到集合TASKS ),我们

可以得到一个更一般的模型数学表达。先决关系和互斥关系可以表示为一幅先决关系

图 ( )DISJS,ARCS,TASKSG = ,其中 ARCS 是先决关系弧集合,DISJS 是互斥关

系集合。如果 i 是 j 的直接先决任务,则在任务 i 和任务 j 有一条弧 ( )j,i 相连。互斥

对 [ ]j,i 则表示任务 i 和 j 是互斥的。借助于这些定义,可以得到下面的模型表述

(7.3.27)-(7.3.32)。

minimize finish (7.3.27)

TASKSj∈∀ : finishDURstart jj ≤+ (7.3.28)

( ) ARCSj,i ∈∀ : jii startDURstart ≤+ (7.3.29)

[ ] DISJj,i ∈∀ :

( )ijijjijjii yMstartDURstartyMstartDURstart −⋅+≤+∧⋅+≤+ 1 (7.3.30)

TASKSj∈∀ : 0≥jstart (7.3.31)

Page 138: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

127

[ ] DISJj,i ∈∀ : { }10,yij ∈ (7.3.32)

目标函数与前面相同。约束条件(7.3.2)-(7.3.4)可以总结为约束条件(7.3.28):计划完成的时间大于或等于每种墙纸的 后一项工序的完成时间,因此大于所有工序

的完成时间。约束条件(7.3.29)表示不同工序之间的连接关系(先决关系),约束

条件(7.3.30)表示不同工序之间的互斥关系。 后两组约束条件是对开始时间的非

负约束(7.3.31)以及互斥关系变量 ijy 的二值约束。

7.3.2 模型实现

下面的 Mosel 程序实现了前面(7.3.27)-(7.3.32)所表示的数学模型,它使

用单个索引集TASKS 标记所有操作的开始时刻和持续时间,而没有使用机器-墙纸类

型这样的二重索引。在本书网站上也给出了另一种实现方法,它使用了第一个数学模

型(式(7.3.1)-(7.3.25))中的双重索引。

各种类型墙纸的处理顺序表示为先决关系表式:如果任务 i 是任务 j 的直接先决

任务,则在此表中项目 ijARC 有定义。互斥性也用相似的方法进行定义:当且仅当任

务 i 和任务 j 需要在同一台机器上进行处理时(因此它们是互斥的),表中的项目

ijDISJ 才有定义。

model "B-3 Job shop"

uses "mmxprs"

declarations

TASKS=1..8 ! 任务(工序)集合

DUR: array(TASKS) of integer ! 任务在机器上的执行时间

ARC: dynamic array(TASKS,TASKS) of integer ! 先决关系图

DISJ: dynamic array(TASKS,TASKS) of integer ! 任务之间的互斥性

start: array(TASKS) of mpvar ! 各个任务的开始时间

finish: mpvar ! 计划完成时间

y: array(range) of mpvar ! 互斥性变量

end-declarations

initializations from ‘b3jobshop.dat’

DUR ARC DISJ

end-initializations

BIGM:= sum(j in TASKS) DUR(j) ! 为足够大的数值

Page 139: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

128

! 先决关系约束

forall(j in TASKS) finish >= start(j)+DUR(j)

forall(i,j in TASKS | exists(ARC(i,j)) ) start(i)+DUR(i) <= start(j)

! 互斥性约束

d:=1

forall(i,j in TASKS | i<j and exists(DISJ(i,j)) ) do

create(y(d))

y(d) is_binary

start(i)+DUR(i) <= start(j)+BIGM*y(d)

start(j)+DUR(j) <= start(i)+BIGM*(1-y(d))d+=1

end-do

! 对 后完成时间的限制

finish <= BIGM

! 求解此问题: 小化 后完成时间

minimize(finish)

end-model

在此模型的实现中使用了一些我们没有介绍过的 Mosel 语言特性:

在 declarations 块中,读者可能已经注意到了关键字 dynamic array 和 range。这两个关键字都表明对应的数组定义为动态数组。range 关键字表示数组索引集为未

知的连续整数序列(可能包括 0 或负值)。由于我们不需要一一列举出变量数组 y 中

的变量,因此不需要为其指定索引集合。对于数组 ARC 和 DISJ 也可以进行同样处

理,但是由于我们已经知道它们的索引集是集合TASKS 的子集(在稍后也将用于枚

举数组成员),因此我们可以将TASKS 作为其索引集。然而,集合TASKS 在声明时

已经直接定义为常量集合,这样使用它作为索引集的数组在创建时都将分配固定的大

小。而对于数组 ARC 和 DISJ ,它们中都只定义了很少几个成员,因此更好的方法

是强制它们动态地从文件中读入数据并进行初始化,关键字 dynamic 即做到了这一

点。

在 forall 循环中,将枚举所有的先决关系弧和互斥关系弧,我们可以使用函数

exists 来检测某个数组成员是否有定义。对于只定义了很少几个成员的数组(稀疏矩

阵),这是一种非常有效的枚举这些数组成员的方法。注意为有效使用 exists,在循

环中的索引集必须与数组定义中使用的索引集相同。

另一个新特性是在描述互斥性时使用的 forall-do 循环:目前为止我们只使用了

此循环的内联版本,这时循环中将只有一个语句。如果循环中含有多个程序语句,则

将使用循环的完整版本。

7.3.3 结果

对此问题进行求解可以得到完成时间为 97。所有任务的开始和结束时间列于下

Page 140: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

129

表中(有多个可行解)。

表格 7.5:操作开始时间

墙纸 1 墙纸 2 墙纸 3

蓝色 42-87 10-30 30-42

绿色 - 0-10 42-59

黄色 87-97 30-64 0-28

可以将此调度方案表示为柱状图的形式,也称为 Gantt 图,其中使用时间作为水

平轴。每个任务都表示为一个矩形,矩形的长度与此任务的时间成比例。同一台机器

上的所有任务都绘制于同一行中。

图 7.7:Gantt 图

7.4 瓶颈机器上的任务排序

在工厂车间中,经常会出现整个车间的生产能力取决于一台机器的情况(例如,

仅有一台的某型号机床,生产线上速度 慢的机器等)。这台机器就称为关键机器或

瓶颈机器。此时很重要的一点就是尽可能地优化此机器将要处理的任务计划。

此问题的目的是为在单台机器上的任务调度提供一个简单的模型,此模型可以结

合多种不同的目标函数进行使用。在这里我们将看到如何 小化总处理时间,平均处

理时间,以及总超时时间。

在一台机器上将要处理一组任务。任务的执行不具有抢先性(即一旦一个任务开

始执行,就不允许被打断)。对于每个任务 i ,都给出了它的发布时间和持续时间。

对于 后一个优化目标(总超时时间),也需要使用截止时间(规定的 后完成时间)

来对系统的超时长度进行度量,即度量任务完成时间超出规定时间的长度。下表中列

出了我们的问题要使用的各种数据。

我们希望求出下面这些目标的 优值:计划总需时(makespan)的 小值,平

均处理时间的 小值,或总超时时间的 小值。

表格 7.6:任务时间窗口和持续长度

任务 1 2 3 4 5 6 7

发布时刻 2 5 4 0 0 8 9

持续时间 5 6 8 4 2 4 2

规定完成时间 10 21 15 10 5 15 22

Page 141: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

130

7.4.1 模型的数学表达

我们将依次处理不同的目标函数,但模型主体将保持不变。为编写一个同时对应

于三个目标函数的模型,我们将使用二值变量 jkrank ( { }NJ,,JOBSk,j K1=∈ ),

如果任务 j 的位置(顺序)为 k ,则此变量取值为 1,否则取值为 0。每个顺序位置 k

上只能有一个任务,每个任务只能占用一个顺序位置。这样可以得到下面的约束条件

(7.4.1)和(7.4.2)。

JOBSk ∈∀ : 1=∑∈JOBSj

jkrank (7.4.1)

JOBSj∈∀ : 1=∑∈JOBSk

jkrank (7.4.2)

顺序位置 k 上的任务的处理时间可以表示为∑ ∈⋅

JOBSj jkj rankDUR (其中

jDUR 为上一节表格中给出的持续时间)。只有当顺序位置 k 上的任务为 j 时,变量

jkrank 的值才为 1。这样与任务 j 的时间长度相乘,我们就可以得到在顺序位置 k 上

的任务的时间长度。通过这种技巧我们可以写出问题的约束条件。如果 kstart 为顺序

位置 k 上的任务的开始时间,则此值必须至少等于此任务的发布时间(表示为

jREL )。因此可以得到约束条件(7.4.3):

JOBSk ∈∀ : ∑∈

⋅≥JOBSj

jkjk rankRELstart (7.4.3)

所有模型都要使用的另一个约束条件是,无法同时执行两个任务。只有在顺序位

置 k 上的任务完成执行之后,位置 1+k 上的任务才可以执行,因此有约束条件

(7.4.4)。

{ }11 −∈∀ NJ,,k K : ∑∈

++ ⋅+≥JOBSj

jkjkk rankRELstartstart 11 (7.4.4)

目标 1:第一个目标是 小化计划的完成时间,即 小化 后一个任务(顺序位

置为 k 的任务)的完成时刻。式(7.4.5)即对此目标进行了建模。完整的模型即为:

minimize ∑∈

⋅+JOBSj

NJ,jjNJ rankDURstart (7.4.5)

JOBSk ∈∀ : 1=∑∈JOBSj

jkrank (7.4.6)

JOBSj∈∀ : 1=∑∈JOBSk

jkrank (7.4.7)

Page 142: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

131

JOBSk ∈∀ : ∑∈

⋅≥JOBSj

jkjk rankRELstart (7.4.8)

{ }11 −∈∀ NJ,,k K : ∑∈

++ ⋅+≥JOBSj

jkjkk rankRELstartstart 11 (7.4.9)

JOBSk ∈∀ : 0≥kstart (7.4.10)

JOBSk,j ∈∀ : { }10,rank jk ∈ (7.4.11)

目标 2:为 小化平均处理时间,我们需要引入一个新的变量 kcomp (表示位置

k 上的任务的完成时间),以简化表达式。我们需要向问题加入如下这些约束条件,

以得到这些完成时间:

JOBSk ∈∀ : ∑∈

⋅+=JOBSj

k,jjkk rankDURstartcomp (7.4.12)

JOBSk ∈∀ : 0≥kcomp (7.4.13)

新的目标函数(7.4.14)将使平均处理时间 小化,亦即 小化完成所有任务需

要消耗的总时间。

minimize ∑∈JOBSk

kcomp (7.4.14)

式(7.4.14),(7.4.6),(7.4.13)即组成了第二个目标函数的完整数学表达。

目标 3:现在我们希望 小化总超时时间,首先也引入一些新的变量——这些变

量用于度量任务超出规定期限的时间长度。令 klate 为排序位置为 k 的任务的超时时

间。其值即等于任务 j 的完成时间与其预定时间之间的差值。如果此任务在预定时间

之前完成,则 klate 的值为 0。因此有约束条件(7.4.15)和(7.4.16)。

JOBSk ∈∀ : ⎟⎟⎠

⎞⎜⎜⎝

⎛⋅−= ∑

∈JOBSjjkjkk rankDUEcomp,maxlate 0 (7.4.15)

JOBSk ∈∀ : 0≥klate (7.4.16)

新的目标函数(7.4.17)将 小化所有任务的总超时时间:

minimize ∑∈JOBSk

klate (7.4.17)

这样约束条件(7.4.17),(7.4.6)到(7.4.13),以及(7.4.15)到(7.4.16)即

给出了此模型的完整数学表达。

Page 143: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

132

7.4.2 模型实现

下面的 Mosel 模型将对同一个问题进行三次求解,每次都使用不同的目标函数,

并将求解结果打印出。为简化表达,我们使用在第一个目标中已有的完成时间变量。

为计算任务的超时时间,此模型实现中利用了所有变量的默认非负约束。这表示如果

求出完成时间和预计时间之间的差值 klate 为负值,则 Xpress-Optimizer 会自动将此

变量值设置为 0。

model "B-4 Sequencing"

uses "mmxprs"

forward procedure print_sol(obj:integer)

declarations

NJ = 7 ! 任务数

JOBS=1..NJ

REL: array(JOBS) of integer ! 任务的发布时间

DUR: array(JOBS) of integer ! 任务的持续长度

DUE: array(JOBS) of integer ! 任务的规定完成时间

rank: array(JOBS,JOBS) of mpvar ! 如果任务 j 位于顺序位置 k 上,则取值为 1

start: array(JOBS) of mpvar ! 顺序位置 k 上的任务的开始执行时间

comp: array(JOBS) of mpvar ! 顺序位置 k 上的任务的完成时间

late: array(JOBS) of mpvar ! 顺序位置 k 上的任务的超时时间

finish: mpvar ! 整个计划的完成时间

end-declarations

initializations from ‘b4seq.dat’

DUR REL DUE

end-initializations

! 每个任务只能占用一个顺序位置,每个顺序位置上只能安排一个任务

forall(k in JOBS) sum(j in JOBS) rank(j,k) = 1

forall(j in JOBS) sum(k in JOBS) rank(j,k) = 1

! 任务序列

forall(k in 1..NJ-1)

start(k+1) >= start(k) + sum(j in JOBS) DUR(j)*rank(j,k)

! 开始时刻

forall(k in JOBS) start(k) >= sum(j in JOBS) REL(j)*rank(j,k)

Page 144: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

133

! 完成时刻

forall(k in JOBS) comp(k) = start(k) + sum(j in JOBS) DUR(j)*rank(j,k)

forall(j,k in JOBS) rank(j,k) is_binary

! 目标函数 1: 小化 优一个任务的完成时刻

forall(k in JOBS) finish >= comp(k)

minimize(finish)

print_sol(1)

! 目标函数 2: 小化平均完成时间

minimize(sum(k in JOBS) comp(k))

print_sol(2)

! 目标函数 3: 小化总超时时间

forall(k in JOBS) late(k) >= comp(k) -sum(j in JOBS) DUE(j)*rank(j,k)

minimize(sum(k in JOBS) late(k))

print_sol(3)

!----------------------------------------------------------------

!打印求解结果

procedure print_sol(obj:integer)

writeln("Objective ", obj, ": ", getobjval,

if(obj>1, " completion time: " + getsol(finish), "") )

write("\t")

forall(k in JOBS) write(strfmt(getsol(sum(j in JOBS) j*rank(j,k)),4))

write("\nStart\t")

forall(k in JOBS) write(strfmt(getsol(start(k)),4))

write("\nEnd\t")

forall(k in JOBS) write(strfmt(getsol(comp(k)),4))

write("\nDue\t")

forall(k in JOBS) write(strfmt(getsol(sum(j in JOBS) DUE(j)*rank(j,k)),4))

if(obj=3) then

write("\nLate\t")

forall(k in JOBS) write(strfmt(getsol(late(k)),4))

end-if

writeln

end-procedure

end-model

与本章的第一个问题的实现相同,我们定义了一个子程序用于打印 优解,在每

次优化运行之后都将调用此子程序。在这个例子中,我们希望根据优化目标以不同的

方式输出求解结果,因此将优化目标的编号作为此子程序的参数。我们使用两种版本

的 if 语句来选择输出何种信息,即内联的 if 语句和包含了语句块的 if-then 语句。

Page 145: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

134

读者可能有疑问为什么在这个例子中我们没有使用更清晰易懂的变量名,如

start 和 end,这是由于 end 是 Mosel 语言的保留关键字(请参考 5.2.3 节),这意味

着在 Mosel 程序中不允许重新定义 end 或 END。然而,可以使用大小写混合的形式,

例如 End。但是为了避免任何可能发生的混淆,我们不推荐使用这样的表达方式。

7.4.3 结果

此计划的 小总执行时间为 31, 小总完成时间为 103(平均值为 103/7 = 14.71)。在达到此 优值时任务的执行计划为 4→5→2→6→7→3→1。将完成时间

与预计时间比较我们可以发现,任务 1,2,3,6 都没有按时完成(总超时时间为 21)。小超时时间为 18。达到此超时时间的计划为 5→1→4→6→ 2→7→3,其中任务 4

和 7 的超时时间为 1,任务 3 的超时时间为 16,即实际完成时间为 31,而计划用时

为 15。此计划的平均完成时间为 15.71。

7.5 油画制造

有一家油画公司有一些大型客户,它们一直有稳定的需求,此公司每周需要为这

些客户制造 5 批油画,每批油画都完全相同。每批油画都在同一个制造过程中完成,

所有批油画都要使用同一支调和画笔,在绘制两批油画之间必须清洗此画笔。第 1到 5 批油画的绘制时间分别为 40,35,45,32,和 50 分钟。清洗时间取决于所使

用的颜色和颜料类型。例如,如果在使用水性颜料使用油性颜料,或者在使用深色后

使用浅色,则需要较长的清洗时间。下表中给出了清洗时间数组CLEAN ,其中

ijCLEAN 表示在第 i 批油画之后绘制第 j 批油画所需的清洗时间。

表格 7.7:清洗时间矩阵

1 2 3 4 5

1 0 11 7 13 11

2 5 0 13 15 15

3 13 15 0 23 11

4 9 13 5 0 3

5 3 7 7 7 0

由于此公司还有其他业务,因此希望尽量缩短完成这项每周固定的任务所需的时

间(绘制时间和清洗时间)。那么应采取什么顺序绘制这些批次的油画?所指定的顺

序将每周重复执行,因此总清洗时间中也应计入一周的 后一批油画与下周的第一批

油画之间所需的清洗时间。

7.5.1 模型的数学表达

我们可以尝试将此问题建模为一个分配问题,类似于分配人员到不同的工作岗位

上(第 14 章)或航班连接问题(第 11 章)。令 { }NJ,,JOBS K1= 为要生产的油画

Page 146: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

135

批次, jDUR 为第 j 批油画的绘制时间, ijCLEAN 为绘制第 i 批油画后绘制第 j 批

油画之前所需的清洗时间。我们可以引入决策变量 ijsucc ,当且仅当在 i 批油画之后

绘制 j 批油画时此变量值才为 1。这样我们就需要决定为每批油画分配其后绘制的下

一批油画,因此就将这个问题转化为经典的分配问题。

minimize ( )∑ ∑∈ ≠∈

⋅+JOBSi ij,JOBSj

ijiji succCLEANDUR (7.5.1)

JOBSi∈∀ : 1succ =∑≠∈ ij,JOSj

ij (7.5.2)

JOBSj∈∀ : 1succ =∑≠∈ ji,JOSi

ij (7.5.3)

ji,JOBSj,i ≠∈∀ : { }10,succij ∈ (7.5.4)

注意,由于在生产过程中一批油画将只绘制一次,因此不需要使用 ji = 的变量

ijsucc 。你也可以引入这样的变量,但强制规定CLEAN 矩阵的对角线元素取值为很

大的数值。约束条件(7.5.2)和(7.5.3)即保证每个批次只有一个前批次和一个后

批次。

目标函数(7.5.1)即所有批次 i 的处理时间和每个批次对 ( )j,i 之间的清洗时间

的和。由于约束条件(7.5.2)和(7.5.3)的限制,对于每个批次 i ,只有 j 为紧随

其后的批次时(即 1=ijsucc 时)才会将它们之间的清洗时间计入求和。

不幸的是,模型并不能保证求得的解为一个循环。例如求得的解可能使总时间为

239,此时的解决方案中包含两个子循环:1→3→2→1 和 4→5→4,这样的解是不

正确的。在线性规划中,可以采用一些巧妙约束条件使变量只组成一个循环。第一种

方法是向模型加入下面的约束条件(7.5.5)。

{ }NJ,,S K2⊆∀ : ( )

1−≤∑∈

ssuccSj,i

ij (7.5.5)

如果解中包含一个子循环,构成此子循环的批次子集为 S ,则 S 中值为 1 的

ijsucc 的和等于 S 中包含的批次数目。例如,前面的解中第一个子循环含有三个批次

(1,2,和 3)。通过降低集合的基数,约束条件(7.5.5)迫使批次序列“进入”和

“离开”集合 S 。这些约束条件将作用于所有不包含第一个批次(或另外某个固定批

次)的子集 S ,否则将可能无法得到我们希望的单个循环。但这样将使约束条件数与

批次数将成指数关系,即12 −NJ。因此我们选择一个较弱的约束条件,为每个批次定

义一个实数变量 jy yj,则得到 ( )1−⋅ NJNJ 个约束条件(7.5.7)。

Page 147: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

136

JOBSj∈∀ : 0≥jy (7.5.6)

ji,NJ,,j,JOBSi ≠=∀∈∀ K2 : ( )ijij succNJyy −⋅−+≥ 11 (7.5.7)

为理解这些约束条件,假定分配问题的解包含若干个子循环,我们选择其中一个

不包含批次 1 的自寻欢,如循环 4→5→4,则 ijy 取 1 时的约束条件(7.5.7)为:

11

54

45

+≥+≥

yyyy

结合这些约束条件,我们可以得到 11 454 +≥≥− yyy ,或 11≥− ,这是自相

矛盾的。因此若解可以划分为多个子循环,则在加入了新的约束条件(7.5.7)之后,

这样的解即不可行。反之,如果循环未分为多个子循环,则存在能够满足此约束条件

的 jy 值。当 jy 代表批次 j 在循环中的顺序时即可以满足此约束条件,例如如果第一

个绘制的批次是批次 1,则 11 =y 。对于取值为 1 的变量 ijsucc ,由此约束条件可以

得到 1+≥ ij yy ,这是正确的。对于取值为 0 的 ijsucc ,可以得到 1−≤− NJyy ji ,

由于 jy 取值为 1 到 NJ ,因此 iy 和 jy 的差值不会超过 1−NJ ,因此也可以满足这

个条件。

这样我们的油画绘制问题的数学模型就可以总结为(7.5.1)到(7.5.4)所表示

的分配问题,并具有额外的约束条件(7.5.6)和(7.5.7)。

7.5.2 模型实现

可以很容易地将上述数学模型转化为 Mosel 程序。

model "B-5 Paint production"

uses "mmxprs"

declarations

NJ = 5 ! 油画批次数目(任务数)

JOBS=1..NJ

DUR: array(JOBS) of integer ! 每个任务的用时长度

CLEAN: array(JOBS,JOBS) of integer ! 任务之间的清洗时间长度

succ: array(JOBS,JOBS) of mpvar ! 如果在 i 批之后绘制 j 批,则取值为 1,否则为 0

Page 148: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

137

y: array(JOBS) of mpvar ! 这些变量用于排除存在子循环的情况

end-declarations

initializations from ‘b5paint.dat’

DUR CLEAN

end-initializations

! 目标函数: 小化一个制造循环的时间

CycleTime:= sum(i,j in JOBS | i<>j) (DUR(i)+CLEAN(i,j))*succ(i,j)

! 每个批次只有一个先导批次和一个后续批次

forall(i in JOBS) sum(j in JOBS | i<>j) succ(i,j) = 1

forall(j in JOBS) sum(i in JOBS | i<>j) succ(i,j) = 1

! 避免子循环

forall(i in JOBS, j in 2..NJ | i<>j) y(j) >= y(i) + 1 -NJ * (1 -succ(i,j))

forall(i,j in JOBS | i<>j) succ(i,j) is_binary

! 求解此问题

minimize(CycleTime)

! 打印输出求解结果

writeln("Minimum cycle time: ", getobjval)

writeln("Sequence of batches:\nBatch Duration Cleaning")

first:=1

repeat

second:= integer(sum(j in JOBS | first<>j) j*getsol(succ(first,j)) )

writeln(" ",first, strfmt(DUR(first),8), strfmt(CLEAN(first,second),9))

first:=second

until (second=1)

end-model

在上面也列出了打印输出求解结果部分的代码,这里使用了一些新的特性:我们

使用了一个 repeat-until 循环,以按照其调度的顺序枚举出各个批次。对于每个批次

(first),我们都计算出它的后续批次(second),然后再对后续批次找出其后续批次。

当我们再次回到出发点(第 1 批次)时,此循环即结束。各个后续批次都将根据求

解结果中的后续变量计算出。这个求和的结果是实数类型,但具有整数值,因此我们

需要将它转化为整数类型。这里使用函数 integer 对实数值进行取整(很多情况下使

用函数 round 更好,函数 round 能够将实数值转化为与之 接近的整数值)。

7.5.3 结果

在此问题中 短循环时间为 243 分钟,对应的循环顺序为:1→4→3→5→2→1。

Page 149: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

138

此时绘制时间(固定值)为 202 分钟,清洗时间为 41 分钟。这个问题是一个高度组

合的问题:对于 NJ 批油画,存在 ( )1−NJ !个可能的循环。在这个简单的例子中,可

以手动列举出 24 个循环,但对于 10 批油画则为 9! = 362,880 个不同的顺序,而对

于 20 批油画,则为 19! ≈ 1.2×1017个顺序。

7.6 生产线平衡

有一家电子工厂有一条生产线生产一种放大器,此生产线由四个工作台组成。生

产放大器要经过 12 道工序,这些工序之间存在先决关系约束。下表列出了每道工序

需要花费的时间(分钟),并列出了所有的直接先决关系(表格中 PCB 是印刷电路

板的简称)。

制造管理人员希望在满足先决关系的条件下将这些工序分配到四个工作台上,以

使生产线得到平衡,从而使生产周期尽可能缩短,即缩短组装一台放大器所需的总时

间。每道工序都需要分配到一个工作台上,并且在进行此工序时不许打断。每个工作

台在一个时刻都只能进行一道工序。由于每个工作台上的每个工序都对每个放大器重

复执行一次,因此我们称一台放大器组装所需的总时间为一个生产周期。当一台放大

器完成组装之后,则工作台 1 到 3 上的放大器都将移动到下一个工作台上,并且在

第一个工作台上开始组装新一台放大器。

表格 7.8:任务列表和先决关系

任务 描述 耗时 先决任务

1 准备外壳 3 -

2 组装 PCB 与电源模块 6 1

3 组装 PCB 与预放大器 7 1

4 放大器滤波器 6 2

5 推挽电路 4 2

6 连接 PCB 8 2,3

7 预放大器集成电路 9 3

8 调整连接 11 6

9 预放大器散热器 2 4,5,8

10 保护栅格 13 8,11

11 静电保护 4 7

12 装上盖子 3 9,10

7.6.1 模型的数学表达

令TASKS 为任务集合, iDUR 为任务 i 的持续时间,MACH 为工作台集合(按

照工序流程进行标号)。先决条件关系可以表示为有向图 ( )ARCS,TASKSG = ,其

中 ARCS 是弧的集合。从任务 i 到任务 j 的弧 ( )j,i 即表示 i 是 j 的直接先决条件。

Page 150: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

139

为分配这些任务,我们定义二值变量 improcess ,当且仅当任务 i 分配到工作台

m 上时此变量才取值为 1。约束条件(7.6.1)将限制每个任务只能分配到一个工作

台上。

TASKSi∈∀ : 1=∑∈MACHm

improcess (7.6.1)

图 7.7:标出了持续时间的任务图

只有满足先决关系约束的分配方案才为正确方案,这意味着对于每条弧 ( )j,i ,

处理任务 i 的工作台序号必须小于或等于处理任务 j 的工作台序号。可以通过式

(7.6.2)表示此约束条件。注意任务 i 和 j 所对应的工作台标号都表示为分配变量的

和的形式,由于约束条件(7.6.1)的存在,只有 1=improcess 的工作台标号m 才会

被计入求和。

( ) ARCSj,i ∈∀ : ∑∑∈∈

⋅≤⋅MACHm

jmMACHm

im processkprocessk (7.6.2)

现在我们引入一个实数值变量 0≥cycle ,表示一个制造周期时间长度。约束条

件(7.6.3)表明此变量是分配到每个工作台上的工作负荷之和的上界。

MACHm∈∀ : cycleprocessDURTASKSi

imi ≤⋅∑∈

(7.6.3)

因此可以得到下面的数学模型,其中除了 cycle之外的所有变量均为二值变量。

目标函数(7.6.4)即表示需要 小化处理周期时间。

minimize cycle (7.6.4)

Page 151: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

140

TASKSi∈∀ : 1=∑∈MACHm

improcess (7.6.5)

( ) ARCSj,i ∈∀ : ∑∑∈∈

⋅≤⋅MACHm

jmMACHm

im processkprocessk (7.6.6)

MACHm∈∀ : cycleprocessDURTASKSi

imi ≤⋅∑∈

(7.6.7)

MACHm,TASKSi ∈∈∀ : { }10,processim ∈ (7.6.8)

0≥cycle (7.6.9)

在这个问题表达中,我们假定有这条生产线由 NM 个工作台组成,我们希望平

衡各个工作台上的工作负荷。在设计或重新设计生产线时,可能需要针对给定的市场

需求(每天需求的放大器个数)以及给定的制造周期时间来 小化组成新生产线所需

要的工作台数目。为使此问题有解,显然所有任务耗费时间总和不应超过给定的制造

周期时间。

为求解这个新的问题,我们可以仍然采用前面的模型,但去掉原先的目标函数,

并将变量 cycle替换为常数(所指定的周期时间)。然后尝试求解(7.6.5)到(7.6.9)

所代表的系统,为机器数目 NM 规定一下界,如所有任务需要时间总数除以制造周

期长度后向上取整。如果此系统无解,则应增大 NM 的数值,并重新进行求解。由

于存在平凡解,即工作台数目等于任务数,因此这一过程必定会收敛。

7.6.2 模型实现

下面的 Mosel 程序实现了(7.6.4)-(7.6.9)所定义的数学模型。这里提出了一

个多次出现的问题,即对图G 进行编码。一种方法是定义一个二值矩阵 B (称为邻

接图矩阵),其中当且仅当图G 中存在弧 ( )j,i 时, ijB 取值才为 1。这里采用了第二

种方法,即只列出存在的弧,因此对于G 这样的稀疏图能够减小计算时的内存消耗:

此图可以用表格 ARC 表示,表格中有两列,每条弧即对应于表格的一行。行 a 即代

表从 1aARC 出发到 2aARC 的弧。入第一行数据的两个数字为 1 和 2,表示弧 ( )21, ,

如果数字为 1 和 3,则表示弧 ( )31, ,以此类推。由于我们通过从文件读入数据对弧进

行动态初始化(即在程序中不指定弧的数目 RA),因此在数据文件 b6linebal.dat 中应给出数组 ARC 中的各个成员的索引。

model "B-6 Assembly line balancing"

uses "mmxprs"

declarations

MACH=1..4 ! 工作台集合

TASKS=1..12 ! 任务集合

Page 152: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

141

DUR: array(TASKS) of integer ! 任务需时

ARC: array(RA:range, 1..2) of integer ! 任务之间的先决关系

process: array(TASKS,MACH) of mpvar ! 如果任务分配到工作台上,则取值为 1,否则为 0

cycle: mpvar ! 一个制造周期长度

end-declarations

initializations from 'b6linebal.dat’

DUR ARC

end-initializations

! 每个任务都只能在一个工作台上执行

forall(i in TASKS) sum(m in MACH) process(i,m) = 1

! 任务顺序

forall(a in RA) sum(m in MACH) m*process(ARC(a,1),m) <=

sum(m in MACH) m*process(ARC(a,2),m)

! 制造周期长度

forall(m in MACH) sum(i in TASKS) DUR(i)*process(i,m) <= cycle

forall(i in TASKS, m in MACH) process(i,m) is_binary

! 小化制造周期长度

minimize(cycle)

end-model

7.6.3 结果

混合整数求解器求解出的 短周期长度为 20 分钟。在下表中列出了任务在工作

台上的分配以及由此得到的每个工作台的工作负荷。可以验证此分配方案满足先决关

系约束。

表格 7.9:具有 小周期时间的分配方案

工作台编号 1 2 3 4

分配到的工作 1,2,4,5 3,7,11 6,8 9,10,12

工作负荷 19 20 19 18

7.7 参考文献和进阶阅读

本章中除了体育馆建设之外的所有例子都是非常困难的组合问题,也称为

NP-hard 问题(请参考[GJ79]了解此术语的具体定义)。调度问题有多种不同的形式。

Carlier 和 Chretienne 的著作[CC88],Lopez 和 Roubellat 的著作[LR99],Blazewicz

Page 153: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

142

等的著作[BESW93]和 French 的著作[Fre82]都是这个领域的很好入门书籍。

体育馆建设问题(第 7.1 节)是一个工程调度问题,现在有很多软件工具都可以

轻松解决这种问题,例如 Microsoft 的 Project 软件,以及 Scitor-Le Bihan 的 PSN软件。问题 1 可以采用很简单的基于图的方法进行求解。工程的图可以采用两种不

同的方法进行编码。第一种方法使用弧来表示任务,使用节点表示工程的不同阶段。

这种图,称为 AOA(activities on arcs,用弧线表示活动),也用于 PERT 方法(Program Evaluation and Review Technique,计划评审技术)。在另一种表示方法中,我们使

用结点表示任务,这种方法称为 AON(activities on nodes,用结点表示活动),用

于势方法(method of potentials)[Pri94a][GM90]。

PERT 方法来源于美国,而势方法来源于法国。除了对图的编码方法之外,这两

种方法基本上是相同的,某些软件也同时提供了这两种方法。然而,AOA 表达无法

适用于工程调度之外的其他应用领域,例如生产调度问题。此时可以系统地使用 AON方法。

问题 2 涉及 PERT-费用问题,即工程赶工情况下的调度问题,此时目标变为在

任务耗时具有弹性且费用与耗时长度相关时使总费用 小化。根据所做出的假定,可

以采用多种模型描述:例如,每件任务的额外费用与缩短的天数成正比,或费用与任

务持续时间长度成反比。读者可以在 Wasil 的工作[WA88]中找到其他一些实际案例。

流水线车间问题(第 7.2 节)是一个经典的调度问题。我们所使用的问题数学表

达源自 Wagner 的论文[Wag59]。在 French 的著作[Fre82]的 132-135 页,Pinedo的著作[Pin95a]的 99-101 页也提供了其他一些求解方法。但令人好奇的是,在这些

工作中都没有提到(7.2.6)-(7.2.7)所对应的约束条件,而这些约束条件是得到正

确结果的必备条件。

流水线车间问题通常是 NP-hard 问题,数学规划只能求解涉及工序数小于约 30个的问题。对于规模较大的问题,可以使用简单的启发式算法如 NEH(根据作者

Nawaz,Enscore 和 Ham 的名字进行命名[NEH83])或元启发算法如禁忌搜索

[WH89]。双机器的问题较为简单,可以采用 Johnson 所给出的算法,在刚才引用的

两本书中也可以找到对此方法的介绍。

7.3 节中的问题是一个经典的调度问题,称为任务车间(job shop)问题。这个

问题通常是 NP-hard 问题。对于较大规模的问题来说,仅仅建模为混合整数模型是

不够的。然而,我们所给出的通用模型数学表达是 Applegate 和 Cook 的利用了割平

面法的结果[AC91],作者使用此方法对一些困难的例子也取得了令人感兴趣的结果。

但此问题通常由基于列表的启发式算法来进行求解,或使用一种基于先决关系图的精

确解法[CCE+93],[Fre82],[Pin95b]。注意我们给出的通用模型也适用于一般的流

水线车间问题(而 7.2 节中的模型只适用于置换流水线车间问题)。

对于单机器问题存在多种求解算法(第 7.4 节)。此实例的目的在于为这三种目

标提供通用的模型表达方式。在[LQ92],[Sev98]中可以找到其他一些使用了与任务

顺序相关的变量的模型。

油画绘制问题(第 7.5 节)是一系列每件任务之前的准备时间取决于执行顺序(顺

序相关的准备时间)的调度问题的代表。我们实际上使用了著名的旅行商问题(TSP)

的一种模型。在旅行商问题中,任务(每批油画)变成了城市,清洗时间变成了从一

Page 154: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

143

个城市到另一个城市所需要的时间。目标函数是 小化旅行商从城市 1 出发,访问

每个城市一次,并 终回到自己的城市所需要花费的费用。

这里我们考虑的是非对称的例子,即从批次 i 到批次 j 之间的清洗时间通常与从

批次 j 到批次 i 之间的清洗时间不同。在第 11 章中,我们将研究一个对称旅行商问

题,使用城市之间的距离作为两地之间的 短距离。此问题将使用一种不同的方法,

通过多次连续加入类型(5)的约束条件来进行求解。由于旅行商问题是 NP-hard 问

题,因此如果城市数目超过 20 个,则求解模型就需要非常长的时间。如果问题规模

超出此大小,则需要使用专用的树搜索方法[HK70]。在[Ros85][EM92]中可以找到这

些方法的演示版本,Syslo 在[SDK83]中给出了此方法的 Pascal 代码。对于具有数百

个城市的问题,必须放弃寻找 优解,而是使用启发式算法,其中有一些方法如禁忌

搜索(如[GTdw93]),或模拟退火算法([KGV83])都十分有效。在[Pri94a]中对这

样的启发式算法进行了详细解释。

我们所给出的生产线平衡问题(第 7.6 节)的两个版本( 小化制造周期时间或

所需工作台数目)都是 NP-hard 问题。如果不对先决关系加以约束,则第一个版本

的生产线平衡问题等同于具有多台并行机器的调度问题(请参考第 9 章中的货车装

载问题),而第二个版本的生产线平衡问题可以化为打包问题(第 9 章将文件保存到

磁盘的问题)。任务数为 20 左右的此类问题都可以采用数学规划进行求解,而超出

此规模的问题则应使用启发式算法,如 Dar-El 的方法[DE73],在 Buffa 和 Sarin 关于

生产计划的著作[BS87]的第 660-671 页对这种方法及另一种启发式方法一同进行了

介绍。School 近也就生产线平衡问题出版了一本专著[Sch99]。

Page 155: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions
Page 156: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

145

第 8 章 规划问题

在生产管理的语境中,规划这个词常常具有三种不同的意义:用于进行战略决策

的长期规划,战术层次的中期规划,以及出于运作决定的短期规划。长期规划关心企

业在若干年内的发展方向,例如第 10 章中的仓库选址问题。短期规划将为车间厂房

进行短期如几天内的详细生产决定。 重要的是,规划也包括调度问题,如第 7 章

中所介绍的问题。本章将专注于介绍战术层次的规划,我们暂且称之为生产规划。

这个层次的决策通常会涉及一到几个月的生产情况,以如一周长作为一个时间单

位进行决策。这是对生产系统的宏观管理:将不再考虑车间和机器的详细约束条件,

而是从整体上对企业进行规划。目标是找出在每个时期内 佳的生产数量,同时,在

多数实例中,还要 小化生产和存储的成本。

第 8.1 节中给出了一个简单的单类产品(自行车)生产规划的例子。下一节(8.2)节将处理多种产品的生产(多种类型的玻璃杯)。在 8.3 节中,我们将对玩具车及其

所有组件的生产进行规划。这是物料需求规划(material requirement planniing,MRP)的一个典型例子。下面两个问题则具有更为复杂的费用函数:在 8.4 节电子

元件的生产中将要增大生产规模,而改变生产规模也会带来额外的费用;在 8.5 节玻

璃纤维的生产中,费用支出要取决于具体的时期。第 8.6 节的问题与前面都不同:它

将研究如何将产品生产分配到具有不同产能和不同速度的机器上。

8.1 自行车生产规划

有一家公司生产儿童自行车。在下表中给出了明年预期的销售量(以千辆为单位

计)。此公司的生产能力为每个月 30,000 辆自行车。通过工人加班,可以将产量提

高 50%,但是会将每辆自行车的生产成本从 30 欧元提高到 40 欧元。

表格 8.1:明年的销售预期(千辆)

1 月 2月 3 月 4 月 5 月 6月 7月 8月 9月 10 月 11 月 12 月

30 15 15 25 33 40 45 45 26 14 25 30

当前自行车的库存量为 2,000 辆。对于库存中的每辆自行车,在每个月月底都需

要支出 5 欧元的存储费用。我们假定此公司的库存能力是无限的(即虽然此公司的

实际库存能力是有限的,但不会给我们这个例子带来限制)。现在是一月一日,在下

面的十二个月里面每个月应生产和存储多少辆自行车才能够满足此销售预期,并 小

化总成本?

8.1.1 模型的数学表达

我们需要求解的变量是在第 t 月内的正常工作时间内和加班时间内分别生产的

自行车数目 tpnorm 和 tpover ,以及在每个月月底时库存中的自行车数目 tstore 。令

Page 157: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

146

{ }121 ,,MONTHS K= 表示时段集合。目标函数是 小化总成本,即生产的成本(在

正常工作时间内和在加班时间内)以及库存成本。我们用CNORM 和COVER 分别

表示在正常时间和在加班时间内一辆自行车的生产成本,CSTOCK 表示每辆自行车

每个月的库存成本。这样我们就可以将目标函数表示为式(8.1.1)。

minimize ( )∑∈

⋅+⋅+⋅MONTHSt

ttt storeCSTOCKpoverCOVERpnormCNORM (8.1.1)

在第 t 月,可以出售的自行车数量即为在 1−t 月月底时的自行车库存总量加上在

第 t 月正常工作时间和加班时间内生产的自行车总量。此总量必定等于在第 t 月中自

行车的销售量加上在第 t 月月底自行车的库存量。这一 关键的关系称为库存平衡方

程,它是生产规划问题数学模型的一个重要组成部分。

我们设初始库存量为 ISTOCK ,第 t 月预期的销售需求为 tDEM 。则第一个月

的平衡约束可以表示为式(8.1.2):

1111 storeDEMISTOCKpoverpnorm +=++ (8.1.2)

约束条件(8.1.3)为后续月份建立了此关系:

1≠∈∀ t,MONTHSt : ttttt storeDEMstorepoverpnorm +=++ −1 (8.1.3)

在正常工作时间内的生产能力不能超过给定的生产能力CAP,在加班时间内的

生产能力上限为此正常生产能力的 50%;因此有约束条件(8.1.4)和(8.1.5)。

MONTHSt ∈∀ : CAPpnormt ≤ (8.1.4)

MONTHSt ∈∀ : CAP.povert ⋅≤ 50 (8.1.5)

后,我们应注意到所有变量均为非负(约束条件(8.1.6))。

MONTHSt ∈∀ : 000 ≥≥≥ ttt store,pover,pnorm (8.1.6)

8.1.2 模型实现

可以将数学模型转化为如下的 Mosel 程序。

model "C-1 Bicycle production"

Page 158: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

147

uses "mmxprs"

declarations

TIMES = 1..12 ! 时段范围

DEM: array(TIMES) of integer ! 每个月的需求

CNORM,COVER: integer ! 正常工作时间/加班时间内的生产成本

CSTOCK: integer ! 每辆自行车每个月的库存成本

CAP: integer ! 每个月正常工作时间内的产能

ISTOCK: integer ! 初始库存

pnorm:array(TIMES) of mpvar ! 在正常工作时间内生产的自行车数量

pover:array(TIMES) of mpvar ! 在加班时间内生产的自行车数量

store:array(TIMES) of mpvar ! 每个月自行车的库存量

end-declarations

initializations from ‘c1bike.dat’

DEM CNORM COVER CSTOCK CAP ISTOCK

end-initializations

! 目标函数: 小化生产成本

Cost:= sum(t in TIMES) (CNORM*pnorm(t) + COVER*pover(t) + CSTOCK*store(t))

! 满足每个月的需求量

forall(t in TIMES)

pnorm(t) + pover(t) + if(t>1, store(t-1), ISTOCK) = DEM(t) + store(t)

! 每个月正常生产时间和加班时间内的产能限制

forall(t in TIMES) do

pnorm(t) <= CAP

pover(t) <= 0.5*CAP

end-do

! 求解此问题

minimize(Cost)

end-model

在这个模型实现中,我们使用了内联的 if 函数来将第一个月以及后续月份的平衡

约束条件表示为同一个约束条件。对于 t=1,则此表达式变为:

pnorm(1) + pover(1) + ISTOCK = DEM(1) + store(1)

而对于其他月份,我们可以得到:

pnorm(t) + pover(t) + store(t-1) = DEM(t) + store(t)

Page 159: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

148

8.1.3 结果

生产和库存的 小总成本为 11,247,000 欧元。下表列出了明年每个月的生产计

划(单位为千辆),其中的第一行为每个月的预计需求量。在一月到四月以及九月到

十二月,只需在正常工作时间内进行生产就可以满足需求。在四月,为满足五月的高

需求量,需要库存 3000 辆自行车。在六月到八月,需要加班工作才能够满足需求。

表格 8.2:每个月的生产量和库存量(单位为千辆)

1 月 2 月 3 月 4 月 5月 6月 7月 8月 9月 10 月 11 月 12 月

预期需求 30 15 15 25 33 40 45 45 26 14 25 30

正常时间

内产量

28 15 15 28 30 30 30 30 26 14 25 30

加班时间

内产量

- - - - - 10 15 15 - - - -

库存量 - - - 3 - - - - - - - -

注意在实践中我们可能不希望使用这样的解决方案:在每个月月底的需求量几乎

总是 0,因此如果需求量突然增长(例如,天气一直很好的时候需求量就会上升),

则此公司就会遇到麻烦了。

8.2 玻璃杯生产

在法国北部有一家公司主要生产饮水用玻璃杯。当前此公司销售六种不同类型的

玻璃杯(V1 到 V6),这些杯子按照 1000 个为一批进行生产,此公司希望为下面 12个月的生产做出规划。可以生产小数数目批(不足 1000 个)。下表列出了未来 12 个

星期预期每种类型的杯子的需求量。

表格 8.3:规划期间内需求量(以 1000 个杯子为一批计)

星期 1 2 3 4 5 6 7 8 9 10 11 12

V1 20 22 18 35 17 19 23 22 29 30 28 32

V2 17 19 23 20 11 10 12 34 21 23 30 12

V3 18 35 17 10 9 21 23 15 10 0 13 17

V4 31 45 24 38 41 20 19 37 28 12 30 37

V5 23 20 23 15 19 22 18 30 28 7 15 10

V6 22 18 20 19 18 35 0 28 12 30 21 23

已知每种类型杯子的初始库存量以及 终要求保留的库存量(以 1000 个杯子为

单位)。已知每种杯子的每一批的生产成本和库存成本(单位为欧元),以及需要的工

人和机器工作时间(小时)以及需要的储存空间(单位为货箱数)。

限制工人每周的总工时不能超过 390 小时,机器每周的总工时不能超过 850 小

时。库存空间足够保存 1000 个货箱。那么在每个时期内每种类型的杯子应各生产多

少个才能够使生产和库存成本 小化?

表格 8.4:六种类型杯子的数据

生产成本 库存成本 初始库存 终库存 工人工时 机器工时 储存空间

Page 160: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

149

V1 100 25 50 10 3 2 4

V2 80 28 20 10 3 1 5

V3 110 25 0 10 3 4 5

V4 90 27 15 10 2 8 6

V5 200 10 0 10 4 11 4

V6 140 20 10 10 4 9 9

8.2.1 模型的数学表达

此问题是 8.1 节中自行车生产问题的推广形式:我们现在有多种产品,每种产品

都要使用相同的资源。

为简化此模型的表达方式,我们按照顺序依次考虑各个时期。令 PRODS 为产

品(杯子类型)集合, { }NT,,WEEKS K1= 为时期集合。记 ptDEM 为在时间段 t 内

产品 p 的需求量。在上面的表 8.3 中即给出了这些需求量。另外分别用 pCPROD 和

pCSTOCK 表示玻璃杯类型 p 的生产和库存成本。此成本对于各个时期都相同,但

是可以很容易地加入一个对应于此时期的索引来建模各个时期具有不同成本的情况。

pTIMEW 和 pTIMEM 分别表示生产一个单位的产品 p 所需的工人工时和机器

工时, pSPACE 为此产品一个单位的储存空间。已知每种产品的初始库存为

pISTOCK , 终希望保留的库存为 pFSTOCK 。在上面的表 8.4 中列出了这些数据。

我们分别用CAPW 和CAPM 表示工人和机器的工时上限,CAPS 表示存储空间的

上限。

为求解此问题,我们需要使用变量 ptproduce 表示类型 p 的杯子在时段 t 内的生

产量。用变量 ptstore 表示每种产品 p 在每个时段 t 结尾时的库存量。按照约定,可

以认为初始库存量 pISTOCK 为在时段 0 结尾时的库存量,即 0pstore ,这样我们就

可以将库存平衡约束条件表示为式(8.2.1):

WEEKSt,PRODSp ∈∈∀ : ptptt,pt,p DEMproducestorestore −+= −1 (8.2.1)

这些库存平衡约束条件要求在时段 t 结尾时产品的库存量 ptstore等于在前一时

段结尾时的库存量 1−t,pstore加上在时段 t 内的生产量 ptproduce

然后再减去此时段

Page 161: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

150

的需求量 ptDEM。

此公司希望在此规划期结束时仍然保留一些库存。对 终库存量的约束条件可以

表示为式(8.2.2):

PRODSp∈∀ : pNT,p FSTOCKstore ≥ (8.2.2)

现在我们可以写出每个时段的产能和库存容量约束条件。下面的约束条件将保证

所使用的人力资源(8.2.3),机器时间(8.2.4),以及存储空间(8.2.5)都不会超过

各自的上限。

WEEKSt ∈∀ : CAPWproduceTIMEWPRODSp

ptp ≤⋅∑∈

(8.2.3)

WEEKSt ∈∀ : CAPMproduceTIMEMPRODSp

ptp ≤⋅∑∈

(8.2.4)

WEEKSt ∈∀ : CAPSproduceSPACEPRODSp

ptp ≤⋅∑∈

(8.2.5)

现在就可以将要求 小化的成本函数表示为式(8.2.6)。此函数即各个时期内各

种产品的生产成本和存储成本之和。

minimize ( )∑ ∑∈ ∈

⋅+⋅PRODSp WEEKSt

ptpptp storeCSTOREproduceCPROD (8.2.6)

终这个问题的完整数学模型即可以表示为(8.2.1)式到(8.2.6)式,另外还

要加上产量(8.2.13)和库存量(8.2.14)的非负约束条条件。

minimize ( )∑ ∑∈ ∈

⋅+⋅PRODSp WEEKSt

ptpptp storeCSTOREproduceCPROD (8.2.7)

WEEKSt,PRODSp ∈∈∀ : ptptt,pt,p DEMproducestorestore −+= −1 (8.2.8)

PRODSp∈∀ : pNT,p FSTOCKstore ≥ (8.2.9)

WEEKSt ∈∀ : CAPWproduceTIMEWPRODSp

ptp ≤⋅∑∈

(8.2.10)

WEEKSt ∈∀ : CAPMproduceTIMEMPRODSp

ptp ≤⋅∑∈

(8.2.11)

WEEKSt ∈∀ : CAPSproduceSPACEPRODSp

ptp ≤⋅∑∈

(8.2.12)

WEEKSt,PRODSp ∈∈∀ : 0≥t,pproduce (8.2.13)

WEEKSt,PRODSp ∈∈∀ : 0≥t,pstore (8.2.14)

Page 162: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

151

8.2.2 模型实现

可以下面的 Mosel 程序实现前面给出的数学模型。

model "C-2 Glass production"

uses "mmxprs"

declarations

NT =12 ! 规划期间内的时间周数

WEEKS = 1..NT

PRODS = 1.. 6 ! 产品集合

CAPW,CAPM: integer ! 工人和机器的工时上限

CAPS: integer ! 库存容量

DEM: array(PRODS,WEEKS) of integer ! 每周每种产品的需求数据

CPROD: array(PRODS) of integer ! 各种产品的生产成本

CSTOCK: array(PRODS) of integer ! 各种产品的库存成本

ISTOCK: array(PRODS) of integer ! 初始库存量

FSTOCK: array(PRODS) of integer ! 低 终库存量

TIMEW,TIMEM: array(PRODS) of integer ! 每个单位产品需要的工人和机器工时

SPACE: array(PRODS) of integer ! 每个单位产品需要的存储空间

produce: array(PRODS,WEEKS) of mpvar ! 每周各种产品的生产量

store: array(PRODS,WEEKS) of mpvar ! 每周各种产品的库存量

end-declarations

initializations from ‘c2glass.dat'

CAPW CAPM CAPS DEM CSTOCK CPROD ISTOCK FSTOCK TIMEW TIMEM SPACE

end-initializations

! 目标函数:生产和库存成本总和

Cost:=

sum(p in PRODS, t in WEEKS) (CPROD(p)*produce(p,t) + CSTOCK(p)*store(p,t))

! 库存平衡

forall(p in PRODS, t in WEEKS)

store(p,t) = if(t>1, store(p,t-1), ISTOCK(p)) + produce(p,t) -DEM(p,t)

! 终库存量

forall(p in PRODS) store(p,NT) >= FSTOCK(p)

! 产能与库存容量约束

forall(t in WEEKS) do

sum(p in PRODS) TIMEW(p)*produce(p,t) <= CAPW ! 工人工时

Page 163: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

152

sum(p in PRODS) TIMEM(p)*produce(p,t) <= CAPM ! 机器工时

sum(p in PRODS) SPACE(p)*store(p,t) <= CAPS ! 存储空间

end-do

! 求解此问题

minimize(Cost)

end-model

与以前一样,我们在上面的模型程序的库存平衡约束条件中也使用了 if 函数。也

可以像数学模型中一样,使用 0pstore代表初始的库存量。由于 store 是一个变量数

组,因此我们仍然需要使用数组 ISTOCK 从文件读入数据,然后将这些数据赋值给

时期 0 的库存量变量。

declarations

store: array(PRODS,0..NT) of mpvar ! 在每周结尾时的库存量

end-declarations

! 库存平衡

forall(p in PRODS, t in WEEKS)

store(p,t) = store(p,t-1) + produce(p,t) -DEM(p,t)

! 赋值初始库存量

forall(p in PRODS) store(p,0) = ISTOCK(p)

在这个模型中,很容易对目标函数进行修改,例如修改使得只考虑生产成本(目

标函数的第一部分)或只考虑库存成本(目标函数的第二部分)。

注意:在此模型的程序实现中,可能有些人会想使用 prod 作为生产量变量名,

或使用 PROD 作为产品集合名,但由于 prod 是 Mosel 语言的保留关键字,因此这

样做都是不允许的(请参考 5.2.3 节中的 Mosel 保留关键字完整列表)。

8.2.3 结果

对此问题求解可以得到 低总成本为 185,899 欧元。

表 8.5 列出了在规划期间内各种类型的玻璃杯每周的生产量以及每周末尾时的

库存量。有一些生产和库存量是小数,但每个单位产品对应于 1000 个杯子,因此这

些数据可以保留小数点后三位数字而仍然有意义,这样就使得得到的杯子数为整数,

而不会给总成本带来多大影响。

以在第一周内生产的杯子数目为例:8,760 个杯子 1,18,000 个杯子 3,16,000个杯子 4,47,680 个杯子 5,12,000 个杯子 6,以及 0 个杯子 2(初始库存即可以满

足本周这种杯子的需求量)。通过更仔细地观察约束条件我们可以发现,多数时期都

完全使用了可用的人力资源(在第一周使用了 351 个人工工时,在后面几周内都使

用了 390 个人工工时),在某些期间内也使用了所有的机器工时(第 1-3 周和第 5 周),

Page 164: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

153

但是存储空间始终有盈余。

表格 8.5:每种类型杯子的销售量和生产量(以 1000 个为单位)

星期 1 2 3 4 5 6 7 8 9 10 11 12

1 生产 8.76 5.48 0.56 30.2 27.36 8.64 23 20 29 30 28 42

库存 38.76 22.24 4.8 - 10.36 - - - - - - 10

2 生产 0 16 23 20 11 10 12 34 21 23 30 22

库存 3 - - - - - - - - - - 10

3 生产 18 35 17 10 9 21 23 15 10 0 13 27

库存 - - - - - - - - - - - 10

4 生产 16 45 24 38 41 20 19 37 28 12 30 47

库存 - - - - - - - - - - - 10

5 生产 47.86 14.64 35.08 14.35 23.48 22.77 43.75 0 26.5 2.75 0 0

库存 24.68 19.32 31.4 30.75 44.23 45 70.75 40.75 39.25 35 20 10

6 生产 12 18 20 19 18 35 0.75 27.25 12 49 29.25 5.75

库存 - - - - - - 0.75 - - 19 27.25 10

与 8.1 节中的自行车生产问题相比,在这个问题中对 终要求的库存量也有限

制。在生产规划模型中,指定 终库存量是很有技巧的事情。如果不指定 终库存,

则模型通常会在规划时期结束时使库存量为 0,而在实际生产中这种情况是无法接受

的。如果 终库存量与初始库存量不同,如此例所示,则必须谨慎地对平均成本进行

解释,这是因为库存降低会带来一些收益,而库存提高则会带来相反的效应。

8.3 物料需求规划

Minorette 公司生产两种大型儿童玩具车:蓝色集装箱卡车和红色油罐卡车。每

种类型的玩具车都由 13 个部件组装而成。图 8.1 列出了这些部件的分解结果(也称

为 Gozinto 图或零件爆炸),下面的表 8.6 列出了各种组件的价格。

表格 8.6:组件价格

轮子 棒材 保险杠 底盘 驾驶室 车门窗

0.30 欧元 1 欧元 0.20 欧元 0.80 欧元 2.75 欧元 0.10 欧元

风挡 蓝色集装箱 红色油罐 蓝色发动机 红色发动机 车头灯

0.29 欧元 2.60 欧元 3 欧元 1.65 欧元 1.65 欧元 0.15 欧元

Page 165: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

154

图 8.1:组件分解(Gozinto 图)

其中轮轴,底盘,蓝色或红色驾驶室可以由此公司自己组装,也可以转包给别的

公司。下表列出了自己组装和转包这些组件的成本以及此公司的产能。在组装成本中

未计入购买原料的费用。

表格 8.7:转包和组装成本,组装产能

轮轴 组装好的底盘 组装好的驾驶室 蓝色卡车 红色油罐车

转包 12.75 欧元 30 欧元 3 欧元 - -

自己组装 6.80 欧元 3.55 欧元 3.20 欧元 2.20 欧元 2.60 欧元

产能 600 4000 3000 4000 5000

下个月 Minorette 公司预期这两种玩具车的需求量均为 3000 辆。目前库存量为

0。那么 Minorette 公司购买或转包这些组件的数量各为多少才能够在满足需求的同

时又能够 小化生产成本?

8.3.1 模型的数学表达

令 ITEMS 代表所有产品集合, FINAL 代表 终产品集合, ASMBL 代表自己

组装得到的产品,PREPROD 代表在用于组装其他产品的中间产品。 qpREQ 表示在

组装产品 q 需要的组件 p 的数量。例如,对于一个轮轴,我们需要两个轮子和一条

棒材,即 2=wheel,axleREQ , 1=steelbar,axleREQ 。

令 pCBUY 为购买物品 p 要支付的价格。由于转包一件产品即表示从制造商那里

购入此产品,因此我们认为此成本等于购买非自己组装的中间产品的价格,即转包这

些部件的成本。

用 pCPROD 表示子集组装产品 p 的成本。我们需要确定的变量是要自己组装的

产品 p 的数量 pPRODUCE ,以及购入(或分包)的中间产品 p 的数量 pbuy 。这样

Page 166: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

155

就可以得到如下的数学模型:

minimize ∑∑∈

⋅+∈

⋅ASMBLp

ppPREPRODp

pp produceCPRODbuyCBUY (8.3.1)

FINALp∈∀ : pp DEMproduce ≥ (8.3.2)

PREPRODp∈∀ : (8.3.3)

ASMBLp∈ : ∑∈

⋅≥+ASMBLq

qqppp produceREQproducebuy

ASMBLp∉ : ∑∈

⋅≥ASMBLq

qqpp produceREQbuy

ASMBLp∈∀ : pp CAPproduce ≤ (8.3.3)

ASMBLp∈∀ : Nproducep ∈ (8.3.4)

PREPRODp∈∀ : Nbuy p ∈ (8.3.5)

目标函数(8.3.1)将 小化生产成本,即购入价格或转包费用与自己组装的费

用之和。约束条件(8.3.2)表明生产出的 终产品数量(红色和蓝色卡车)必须大

于或等于各自的需求量。约束条件(8.3.3)将使生产或购入的物品 p 的总数量能够

满足生产所有包含 p 的组件q 的需要。

约束条件(8.3.4)建立了每件产品 p 的组装产能限制。约束条件(8.3.5)和(8.3.6)是对这些变量的整数性约束。

注意,可以为所有物品都定义采购和组装成本,从而得到对上述模型的另一种表

达方式:无法自己组装的中间产品的组装成本将记为“infinity”,并且 终产品的购

入价格也将设置为“infinity”。在定义了这些成本之后,就可以为所有物品定义变量

pproduce 和 pbuy ,在目标函数(1)和约束条件(3)中只需将所有变量进行求和

——成本值为“infinity”将迫使对应的变量取值为 0。尽管这种表达方式很容易写出,

但它向模型中引入了较大的系数值,可能会引起数值不稳定性,因此应尽量避免采用。

8.3.2 模型实现

下面的 Mosel 模型实现了上述(8.3.1)到(8.3.6)的数学模型。所有数据和索

引集合都将在数据文件中定义,并在执行程序时动态进行初始化。

model "C-3 Toy production"

uses "mmxprs"

declarations

Page 167: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

156

ITEMS: set of string ! 所有产品集合

FINAL: set of string ! 终产品集合

ASMBL: set of string ! 组装得到的产品集合

PREPROD: set of string ! 中间产品集合

CAP: array(ASMBL) of integer ! 组装线产能

DEM: array(FINAL) of integer ! 终产品需求量

CPROD: array(ASMBL) of real ! 组装成本

CBUY: array(ITEMS) of real ! 采购成本

REQ: array(ASMBL,PREPROD) of integer ! 组装一件产品需要的物品

end-declarations

initializations from ‘c3toy.dat’

DEM CBUY REQ

[CPROD, CAP] as ‘ASSEMBLY’

end-initializations

finalize(ASMBL); finalize(PREPROD); finalize(FINAL); finalize(ITEMS)

declarations

produce: array(ASMBL) of mpvar ! 自己组装的物品数量

buy: array(PREPROD) of mpvar ! 购买的物品数量

end-declarations

! 目标函数:总成本

Cost:=sum(p in PREPROD) CBUY(p)*buy(p) + sum(p in ASMBL) CPROD(p)*produce(p)

! 满足需求

forall(p in FINAL) produce(p) >= DEM(p)

! 组装品平衡

forall(p in PREPROD) buy(p) + if(p in ASMBL, produce(p), 0) >=

sum(q in ASMBL) REQ(q,p)*produce(q)

! 组装产能限制

forall(p in ASMBL) produce(p) <= CAP(p)

forall(p in PREPROD) buy(p) is_integer

forall(p in ASMBL) produce(p) is_integer

! 求解此问题

minimize(Cost)

end-model

与本书中给出的大多数其他模型相比,在这个模型实现中我们没有在 Mosel 程

Page 168: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

157

序中直接指定索引集合,而是从动态地从文件初始化所有数据。只有在数据已经读入

并且索引集已经完成初始化之后才定义变量——即,变量数组在创建时即具有固定的

大小。如果在数据数组的同一个 declarations 块中定义这些变量,则变量数组将与数

据数组一样定义为动态数组。但与数据数组不同,如果变量数组为动态,则需要使用

create 函数显式创建其中的每个成员变量。因此可以用如下的方法实现此 Mosel 程序,但我们需指出,上述的数组大小为固定值的版本效率更高一些。

declarations

ITEMS: set of string ! 所有产品集合

FINAL: set of string ! 终产品集合

ASMBL: set of string ! 组装得到的产品集合

PREPROD: set of string ! 中间产品集合

CAP: array(ASMBL) of integer ! 组装线产能

DEM: array(FINAL) of integer ! 终产品需求量

CPROD: array(ASMBL) of real ! 组装成本

CBUY: array(ITEMS) of real ! 采购成本

REQ: array(ASMBL,PREPROD) of integer ! 组装一件产品需要的物品

produce: array(ASMBL) of mpvar ! 自己组装的组装品数量

buy: array(PREPROD) of mpvar ! 购入的组装品数量

end-declarations

initializations from ‘c3toy.dat’

DEM CBUY REQ

[CPROD, CAP] as 'ASSEMBLY'

end-initializations

forall(p in ASMBL) create(produce(p))

forall(p in PREPROD) create(buy(p))

在这个例子中,数组 CPROD 和 CAP 的数据都包含在同一个数据记录

ASSEMBLY 中,因此这两个数组将使用关键字 as 来一同读入,在关键字 as 后面即

应附上此数据记录的名称。

8.3.3 结果

为满足需求, 小总成本为 238,365 欧元。下面两个表格列出了购入,转包,

或自己组装的各种产品数量。

表格 8.8:购入的中间产品数量

轮子 棒材 保险杠 底盘 驾驶室 车门窗

1200 600 600 300 0 0

风挡 蓝色集装箱 红色油罐 蓝色发动机 红色发动机 车头灯

0 3000 3000 3000 3000 12000

Page 169: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

158

表格 8.9:组装件自己生产与转包数量

轮轴 组装好的底盘 组装好的驾驶室 蓝色卡车 红色卡车

自己组装 600 300 0 3000 3000

转包生产 0 5700 6000 - -

8.4 电子元件生产规划

为增加利润,一家小公司希望提高其 畅销产品的产量。这家公司的主要业务之

一是生产 IC 卡和电子徽章。这家公司也生产这些卡和徽章的各个元件。因此对这些

元件的生产进行良好的规划就成了此工厂取得成功的决定因素。在这个例子中对这些

元件的需求都来源于此公司内部,因此很容易对其进行预测。

在未来的六个月内,计划生产四种元件,型号分别为 X43-M1,X43-M2,Y54-N1,Y54-N2。这些元件的产量受到产能变化的影响,并且每次产能改变后都需要重新进

行控制和调整,因此会带来不可忽略的费用。因此公司希望 小化这些改变带来的费

用,以及生产和库存的成本。

在下表中列出了每种产品每个时期内的需求量,生产和库存成本,初始库存量,

以及 后希望保留的库存量。当产量发生变化时,需要对机器和控制系统进行重新调

整。由此带来的费用与产量较前一月的改变量(提高或上升)成正比。产量每提高一

个产品单位,则需要支出 1 欧元;产量每降低一个产品单位,只需要支出 0.50 欧元。

表格 8.10:四种产品的数据

产品需求 成本 库存量

月 1 2 3 4 5 6 生产 储存 初始 终

X43-M1 1500 3000 2000 4000 2000 2500 20 0.4 10 50

X43-M2 1300 800 800 1000 1100 900 25 0.5 0 10

Y54-N1 2200 1500 2900 1800 1200 2100 10 0.3 0 10

Y54-N2 1400 1600 1500 1000 1100 1200 15 0.3 0 10

为 小化由于产量改变引起的费用,以及生产和库存成本,应采取何种生产方

案?

8.4.1 模型的数学表达

此模型与 8.2 节中的模型有许多相似之处。我们用相似的方法定义变量和常量。

令 PRODS 为元件集合, { }NT,,MONTHS K1= 为规划的时段, ptDEM 表示在时

段 t 内产品 p 的需求量, pCPROD 和 pCSTOCK 分别表示生产和存储一个单位的产

品 p 的成本, pISTOCK 和 pFSTOCK 分别为产品 p 的初始库存量和要求的 终库

存量。

Page 170: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

159

变量 ptproduce 和 ptstore 分别表示在时间 t 内生产出的产品 p 数量以及在时段

t 结尾时储存的产品 p 的数量。约定 pp ISTOCKstore =0 ,则库存平衡约束条件可

以表示为式(8.4.1), 终的库存量约束条件可以表示为式(8.4.2)。

MONTHSt,PRODSp ∈∈∀ : ptptt,pt,p DEMproducestorestore −+= −1 (8.4.1)

PRODSp∈∀ : pNT,p FSTOCKstore ≥ (8.4.2)

为度量产量的改变,我们需要使用另外一组变量 treduce和 tadd

,分别表示在

时段 t 内产量的减少量或增加两。产量的改变即在时段 t 内和在时段 1−t 内生产出的

产品数目之间的差值。如果此数值为正数,则产量增长;如果为负数,则产量降低。

可以用变量 tt reduceadd −来表示产量的变化。

由于产量不可能同时又增长又降低,因此这两个变量必定有一个自动取值为 0,而此时另一个变量即表示产量的增长或降低。这样就可以得到方程(8.4.3)。

{ }NT,,t K2∈∀ : ttPRODSp

t,pPRODSp

pt reduceaddproduceproduce −=− ∑∑∈

−∈

1 (8.4.3)

目标函数与问题 8.2 类似,但是还需要加上由于产量变化带来的额外成本。我们

用变量CADD 和CRED 分别表示由于产量增长和降低一个单位带来的额外费用。产

量变化带来的额外费用与与产量变化的数值成正比。这样就得到了目标函数的第二部

分(8.4.4)。

minimize ( )∑ ∑∈ ∈

⋅+⋅PRODSp MONTHSt

ptpptp storeCSTOREproduceCPROD

( )∑=

⋅+⋅+NT

ttt addCADDreduceCRED

2

(8.4.4)

注意,由于在规划中的第一个时期不存在产量的增长或降低,因此不存在变量

1reduce 或 1add 。

这样(8.4.3)和(8.4.4),再加上所有变量的非负约束(8.4.9)和(8.4.10),就组成了此问题的完整线性规划系统。

minimize ( )∑ ∑∈ ∈

⋅+⋅PRODSp MONTHSt

ptpptp storeCSTOREproduceCPROD

( )∑=

⋅+⋅+NT

ttt addCADDreduceCRED

2

(8.4.5)

Page 171: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

160

MONTHSt,PRODSp ∈∈∀ : ptptt,pt,p DEMproducestorestore −+= −1 (8.4.6)

PRODSp∈∀ : pNT,p FSTOCKstore ≥ (8.4.7)

{ }NT,,t K2∈∀ : ttPRODSp

t,pPRODSp

pt reduceaddproduceproduce −=− ∑∑∈

−∈

1 (8.4.8)

{ }NT,,t K2∈∀ : 00 ≥≥ tt add,reduce (8.4.9)

MONTHSt,PRODSp ∈∈∀ : 00 ≥≥ t,pt,p store,produce (8.4.10)

8.4.2 模型实现

我们在前面已经提到,这个问题的模型很接近 8.2 节中的一个问题。可以看出它

们的 Mosel 程序之间也存在相似之处。

model "C-4 Electronic components"

uses "mmxprs"

declarations

NT = 6 ! 时期数(月)

MONTHS = 1..NT

PRODS = 1..4 ! 元件集合

DEM: array(PRODS,MONTHS) of integer ! 每个月元件的需求量

CPROD: array(PRODS) of integer ! 生产成本

CSTOCK: array(PRODS) of real ! 存储成本

CADD,CRED: real ! 增加/降低产量带来的支出

ISTOCK,FSTOCK: array(PRODS) of integer ! 初始和 终库存量

produce: array(PRODS,MONTHS) of mpvar ! 每个月的产量

store: array(PRODS,MONTHS) of mpvar ! 每个月月底的库存量

reduce: array(MONTHS) of mpvar ! 每个月产量的下降值

add: array(MONTHS) of mpvar ! 每个月产量的增加值

end-declarations

initializations from ‘c4compo.dat’

DEM CPROD CSTOCK CADD CRED ISTOCK FSTOCK

end-initializations

! 目标函数:生产,存储,以及改变产量带来的总成本

Cost:= sum(p in PRODS, t in MONTHS) (CPROD(p)*produce(p,t) +

CSTOCK(p)*store(p,t)) +

sum(t in 2..NT) (CRED*reduce(t) + CADD*add(t))

Page 172: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

161

! 库存平衡约束条件(同时满足需求)

forall(p in PRODS, t in MONTHS)

store(p,t) = if(t>1, store(p,t-1), ISTOCK(p)) + produce(p,t) -DEM(p,t)

! 产量改变

forall(t in 2..NT)

sum(p in PRODS) (produce(p,t) -produce(p,t-1)) = add(t) -reduce(t)

! 保证 终库存量

forall(p in PRODS) store(p,NT) >= FSTOCK(p)

! 求解此问题

minimize(Cost)

end-model

8.4.3 结果

通过求解此问题,我们得到 低总成本为 683,929 欧元。前四个时期每个时期

的总产量为 7060 个单位,在第 5 个时期总产量降低到 6100 个单位,并保持此水平

直到 后一个时期。下表列出了一个对应的生产方案(存在多个可行方案)。

表格 8.11: 优生产方案

1 2 3 4 5 6

X43-M1 1490 3000 2000 400 2000 2550

X43-M2 1300 800 800 1000 1100 910

Y54-N1 2150 1500 3640 1060 1200 2130

Y54-N2 2120 1760 620 1000 1800 510

总计 7060 7060 7060 7969 6100 6100

除了 后一个时期因为要求 后留有一定库存之外,其他时期的库存量都维持在

较低的水平。库存中从来都没有产品 X43-M1 和 X43-M2。只有在时段 3 和时段 6 库

存中才有产品 Y54-N1(分别为 740 和 30 单位);在时段 1,时段 2,时段 5,以及

时段 6 时库存中都有产品 Y54-N2,分别为 720,880,700,和 10 个单位。

8.5 玻璃纤维生产规划

有一家公司生产玻璃纤维,产量以立方米为单位计算。这家公司希望对未来六个

星期的生产进行规划。产能有一定上限,且在每个时期产能的上限都不同。规划所覆

盖的整个期间的每周需求量都已知。不同时期的生产和存储的费用也不相同。下表中

列出了这些数据。

表格 8.12:每周各项数据 星期 产能(m3) 需求(m3) 生产成本(欧元/m3) 储存成本(欧元/m3)

Page 173: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

162

1 140 100 5 0.2

2 100 120 8 0.3

3 110 100 6 0.2

4 100 90 6 0.25

5 120 120 7 0.3

6 100 110 6 0.4

应采取怎样的生产方案才能够 小化生产和存储的总成本?

8.5.1 模型的数学表达

这个问题与前面的问题区别不是很大,可以很容易地采用类似于本章前面的问题

的数学表达来求解此问题。为使问题表达有些变化,我们将使用转运流

(transshipment flow)的表达方式。在第 10 章的运输问题中将讨论此类问题的其他

模型。首先,我们绘制一个网络图,以表示此问题(图 8.2)。此网络中包含六个对

应于每个时期内的生产量的结点,以及六个对应于每个时期内的需求量的结点。通常

如果有 NT 个时期,则有 NT⋅2 个结点。

生产量结点组成了图的上半部分。根据其对应的时期,将这些结点用 1 到 11 的

奇数索引表示。每个结点都有一个权值 nCAP ,表示此时期内的产能上限。需求量结

点位于图的下半部分,并根据对应的时期将其用 2 到 12 的偶数值进行索引。每个需

求量结点 n 都有一个权值 nDEM ,表示此时期内的需求量。在每个生产量结点与同

一时期的需求量结点之间都有一条弧相连,此弧的费用即为此时期内的生产成本。另

外有一组弧连接每个需求结点与下一个时期的需求结点,且此弧的权值为存储成本。

图 8.2:用网络表示此问题

生产计划即对应于此网络中的一个流。令 mnflow表示弧 ( )n,m 上的流。在垂直

弧上的流就表示对应时期内生产的玻璃纤维量。在水平弧上的流表示带到下一个时期

的产品量(库存量)。目标是计算出能够满足需求且不超过产能限制的 小费用流。

由于弧上没有通过量限制,因此 终得到的模型是一个转运问题。用 mnCOST表示弧

( )n,m 上的费用,则可以得到如下的目标函数(流的总费用):

Page 174: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

163

minimize ( )∑∈

⋅ARCSn,m

mnmn flowCOST (8.5.1)

对于每个时期,带到下一个时期的产品量(库存量)等于此时期开始时的库存量

加上此时期内的产量再减去此时期内的需求量。由于在第一个时期中不存在初始库

存,因此就得到约束条件(8.5.2)式,即在时期 1 结尾时的库存量(弧 ( )42, 上的流)

等于在时期 1 内的产量(弧 ( )21, )减去需求量 2DEM 。

21224 DEMflowflow −= (8.5.2)

通用的库存平衡等式为式(8.5.3),它适用于除了 后一个时期之外的其他所有

时期。对于每个偶数索引 n ,在 1−n 和 n 之间的流表示在时期 2/n 内的产量,而在

2−n 和 n 之间的流表示从前一时期带来的库存。在 n 和 2+n 之间的流表示在每个时

期结尾时的库存。 LAST 表示图中的 后一个结点(序号 大的结点)。

为偶数n,LAST,,n 24 −=∀ K : nn,nn,nn.n DEMflowflowflow −+= −−+ 122 (8.5.3)

对于 后一个时期,由于我们 终不希望保留库存,因此可以得到约束条件

(8.5.4)。

012 =−+ −− LASTLAST,LASTLAST,LAST DEMflowflow (8.5.4)

同时需要满足产能约束(8.5.5)。

为奇数n,LAST,,n 11 −=∀ K : nn.n CAPflow ≤+1 (8.5.5)

这样就得到了下面的数学模型。由于对此线性问题的 优解已经能够自动保证流

变量 mnflow为整数(在本书中未包含推导出此结论的线性规划理论),因此不再需要

声明流变量 mnflow为整数。

minimize ( )∑∈

⋅ARCSn,m

mnmn flowCOST (8.5.6)

21224 DEMflowflow −= (8.5.7)

为偶数n,LAST,,n 24 −=∀ K : nn,nn,nn.n DEMflowflowflow −+= −−+ 122 (8.5.9)

012 =−+ −− LASTLAST,LASTLAST,LAST DEMflowflow (8.5.9)

Page 175: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

164

为奇数n,LAST,,n 11 −=∀ K : nn.n CAPflow ≤+1 (8.5.10)

( ) ARCSn,m ∈∀ : 0≥mnflow (8.5.11)

8.5.2 模型实现

由上述的数学模型可以得到如下的 Mosel 程序。需求量和产能数据(即结点权

值)都封装到同一个数组WEIGHT 中,并使用结点序号对其进行索引。使用二维数

组 ARC 对此图进行编码,如果 ( )n,m 是此图中的一条弧,则数组元素 mnARC 有定义。

数组元素值即对应于此弧的费用。数组 ARC 将以稀疏矩阵的形式在数据文件

c5fiber.dat 中进行定义。

model "C-5 Fiberglass"

uses "mmxprs"

declarations

NODES: range ! 生产和需求结点

! 奇数为产能结点,偶数为需求量结点

ARC: array(NODES,NODES) of real ! 流的弧上费用

WEIGHT: array(NODES) of integer ! 结点权值(产能/需求量)

flow: array(NODES,NODES) of mpvar ! 弧上的流

end-declarations

initializations from ‘c5fiber.dat’

ARC WEIGHT

end-initializations

forall(m,n in NODES | exists(ARC(m,n))) create(flow(m,n))

! 目标函数:生产和存储的总成本

Cost:= sum(m,n in NODES | exists(ARC(m,n))) ARC(m,n)*flow(m,n)

! 满足需求(流平衡约束条件)

forall(n in NODES | isodd(n)=FALSE)

if(n<getlast(NODES), flow(n,n+2), 0) =

if(n>2, flow(n-2,n), 0) + flow(n-1,n) -WEIGHT(n)

! 产能约束

forall(n in NODES | isodd(n)) flow(n,n+1) <= WEIGHT(n)

! 求解此问题

minimize(Cost)

Page 176: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

165

end-model

在这个 Mosel 程序中,变量都定义为动态数组,因此需要在了解了变量的索引

范围之后再对其进行创建,即在从文件读入网络的弧数据之后再定义这些变量。

我们提醒读者,如果已经命名了稀疏数组的索引集,并且此索引集与声明此数组

时的索引集名称相同,则可以使用函数 exists 让 Mosel 只枚举稀疏矩阵中有定义的

元素。

在上面的程序实现中使用了两个新的函数:isodd 将验证某个整数值为奇数还是

偶数;getlast 将返回数组的 后一个元素(即,具有 大索引值的元素)。

8.5.3 结果

Mosel 程序计算出的 优解为总成本 3,988 元,每个时期生产和存储的玻璃纤维

数量如表 8.13 所示。

表格 8.13:每周产量和库存量

星期 1 2 3 4 5 6

生产量 140 80 110 100 110 100

库存量 40 0 10 20 10 0

8.6 将生产任务分配到机器上

有一个生产管理人员决定下个时期生产 10 批产品,他现在需要决定怎样将这些

生产任务分配到其掌管的车间中的不同机器上。此车间内的五台可用机器都可以加工

这些产品,但由于它们是在不同时期生产的,因此其加工速度各不相同。此外,由于

存在维护和调整期,在规划的时期内每台机器只能工作有限时间(小时数)。表 8.14列出了所有机器加工各批产品所需的时间以及此机器可用的工时数。

表格 8.14:加工需时和可用工时(小时)

产品批次

机器 1 2 3 4 5 6 7 8 9 10 可用工时

1 8 15 14 23 8 16 8 25 9 17 18

2 15 7 23 22 11 11 12 10 17 16 19

3 21 20 6 22 24 10 24 9 21 14 25

4 20 11 8 14 9 5 6 19 19 7 19

5 8 13 13 13 10 20 25 16 16 17 20

各批次产品的生产成本取决于处理此批次的机器。每台机器每小时运行成本取决

于其采用的技术,此机器的制造年代,以及其他耗费(如电能,机油等),和操作此

机器所需的人员。.表 8.15 列出了生产成本,单位为千欧元。应将每批产品各分配到

哪台机器上进行处理才能使总生产成本 小?

表格 8.15:各台机器各个批次的生产成本(千欧元)

产品批次

Page 177: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

166

机器 1 2 3 4 5 6 7 8 9 10

1 17 21 22 18 24 15 20 18 19 18

2 23 16 21 16 17 16 19 25 18 21

3 16 20 16 25 24 16 17 19 19 18

4 19 19 22 22 20 16 19 17 21 19

5 18 19 15 15 21 25 16 16 23 15

8.6.1 模型的数学表达

这个问题属于推广的分配问题。令MACH 为机器集合,PRODS 为要生产的产

品批次集合。用 mpDUR 表示批次 p 在机器m 上生产所需的时间, mpCOST 表示批次

p 在机器m 上生产的成本。 mCAP 表示机器m 的 大可用工时(小时)。引入二值变

量 mpuse ,当且仅当批次 p 在机器m 上生产时 mpuse 取值才为 1。目标函数为(8.6.1)

式,即 小化总生产成本。

minimize ∑ ∑∈ ∈

⋅MACHm PRODSp

mpmp useCOST (8.6.1)

我们需要保证每个批次都分配到一台机器,因此就有了第一组约束条件(8.6.2)。这是经典分配问题的典型约束条件,如第 11 章中航班连接的问题。

PRODSp∈∀ : 1=∑∈MACHm

mpuse (8.6.2)

每台机器可用工时数都有限制,此限制将由关系(8.6.3)描述。在这些约束条

件中,我们将同一台机器加工所分配到的各个批次所需时间相加,并要求此和不超过

此机器上的 大总可用工时数。这种类型的约束条件属于背包问题的约束条件(请参

考第 9 章)。

MACHm∈∀ : mPRODSp

mpmp CAPuseDUR ≤⋅∑∈

(8.6.3)

则可以得到完整的模型为:

minimize ∑ ∑∈ ∈

⋅MACHm PRODSp

mpmp useCOST (8.6.4)

PRODSp∈∀ : 1=∑∈MACHm

mpuse (8.6.5)

MACHm∈∀ : mPRODSp

mpmp CAPuseDUR ≤⋅∑∈

(8.6.6)

PRODSp,MACHm ∈∀∈∀ : { }10,usemp ∈ (8.6.7)

Page 178: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

167

8.6.2 模型实现

可以很容易地将这个简洁的数学模型转化为 Mosel 程序。

model "C-6 Machine assignment"

uses "mmxprs"

declarations

MACH = 1..5 ! 机器集合

PRODS = 1..10 ! 产品批次集合

CAP: array(MACH) of integer ! 机器可用工时数

DUR: array(MACH,PRODS) of integer ! 生产所需时间

COST: array(MACH,PRODS) of integer ! 生产成本

use: array(MACH,PRODS) of mpvar ! 如果任务分配到机器上,则取值为 1,否则为 0

end-declarations

initializations from ‘c6assign.dat’

DUR CAP COST

end-initializations

! 目标函数:总生产成本

Cost:= sum(m in MACH, p in PRODS) COST(m,p)*use(m,p)

! 每批产品只能分配到一台机器

forall(p in PRODS) sum(m in MACH) use(m,p) = 1

! 机器的可用工时限制

forall(m in MACH) sum(p in PRODS) DUR(m,p)*use(m,p) <= CAP(m)

forall(m in MACH, p in PRODS) use(m,p) is_binary

! 求解此问题

minimize(Cost)

end-model

8.6.3 结果

通过求解此问题,我们可以得到总成本为 173 千欧元。下表列出了一种分配方

案(此目标函数值可以对应于多个分配方案):

Page 179: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

168

表格 8.16: 优分配方案

机器 分配到的产品批次 总用时

1 1,9 17

2 2,5 18

3 3,6,8 25

4 7,10 13

5 4 13

8.7 参考文献和进阶阅读

关于生产规划方面有很多相关文献,包括研究论文和专著,例如 Hax 和 Candea的著作[HC84]和 Buffa 和 Taubert 的著作[BT79]。 近 Vob 和 Woodruff 关于供应链

管理的著作[VW02]中使用 Mosel 和其他建模语言提供了对一些典型问题的实现。

在历史上,规划问题 初几乎是完全针对库存管理而提出的。目的就是要回答两

个问题:定购多少,以及何时定购,才能使库存量保持为一定值。第一个模型即经济

订货批量(Economic Order Quantity)模型。它使用 Wilson 提出的简单数学公式来

求解生产的数量,并考虑订货的成本,存储的成本,以及所考察时期内的需求量。第

二个问题将根据经济订货量,需求,以及所考察时期的长度进行回答。但是这种类型

的模型只有在满足一定条件时才为正确,即需求量确定(已知)且不会随时间变化,

且计算中所使用的参数为常数且不依赖于所定购的数量,且能够立刻进行补给。这些

缺点都促使人们开发出一种多时期的模型(multi-period model),在其中将时间轴离

散化为一系列时间段。通过使用时间段对定购量进行索引,这样就可以使用线性规划

对这些模型进行求解。

在 简单的多时期模型中,费用与定购量成比例(通常为生产和库存费用)。也

就是说,不存在固定费用,如生产一批产品前的设备调整费用。通常对可用资源量(人

力资源,机器工时等)有约束。在 8.1 节的自行车生产问题就是此范畴的一个单类产

品实例。8.5 节的玻璃纤维生产中成本取决于具体的时段,因此可以用流对其进行建

模。8.2 节的玻璃杯生产问题是此类问题的一个典型的多类产品实例。在所有这些基

本模型中可用的人力资源都保持为固定(固定劳动力模型)。这种类型的模型首先出

现于 Bowan 的论文中[Bow56]。

现在我们来看看具有比例成本的多类产品模型。研究者 先研究的是可变劳动力

模型,例如[HH60]。稍后对加班时间费用,员工招募费用,许可费用以及培训费用

也都有了相应的模型。8.4节中的电子元件生产问题也是对此类问题的一种有趣扩展,

在其中产量改变会带来一些额外支出。多阶段生产规划系统[JM74],[Can77]是在另

一层次上对此类问题的推广。

在生产规划中,批量规划(lot sizing)问题自成一族,在本章中未提及此类问题。

这些问题非常困难,其特征是在每次重新开始生产某种产品时存在一个设置成本

(setup cost)。这些成本来自于将批量划分为若干个子批次,并且都将计入生产成

本。唯一简单的情况是只考虑一种产品,且产能无限。此时可以使用 Silver 和 Meal提出的启发式算法[SPP98]进行近似求解,或通过 Wagner 和 Whitin 采用的动态规划

方法[ww58]求得 优值。在这些较难的问题扩展中,我们要提到产能不受限的多产

品情形[Kao79],以及 Walker[wal76]所提出的对有限产能问题的启发式解法,和

Page 180: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

169

Lasdon 和 Terjung 的列生成(column generation)方法。

在 1970 年代生产规划领域出现了两个“时髦”的概念:MRP(物料需求规划)

方法和及时供应(Just-in-Time)。MRP(Material Requirement Planning)是由 IBM的 Orlicky 发明的[Orl75]。这种计算机化的库存管理系统的优点在于它能够将制造一

件产品所需要的子产品,组件,和原材料都纳入考虑。这样就得到了一个能够回答前

面的两个问题(定购多少,何时定购)的主生产计划(Master Production Schedule)。在物料需求规划中使用线性规划则是更以后的事情;本章 8.3 节玩具车生产的问题就

是这样的一个例子。

及时供应(JIT)在更大意义上是一个哲学概念或理想状况,它的目的是消除任

何时间浪费或资源浪费。及时供应将降低库存量,并尝试在正确的时刻生产出所要求

数目的产品,以提高库存更新速度。要实现及时供应不是简单的事情,但常常会带来

生产率的很大提高。这个概念相当诱人,但却极少能够真正实现。

一个很少提及的问题是不同层次上的生产规划和调度之间的冲突。在规划中为了

降低复杂度,需要将具体操作看作一个整体,而不考虑其中的细节,但这样做的原因

更多是由于当为几个月长的时间段进行规划时,由于无法精确了解订单数目,因此考

虑过多细节没有意义。由于规划不关心这样的细节,没有考虑到车间内的具体各种约

束条件,因此规划的结果往往在实际生产调度中无法执行。 近出现的一些方法

[DPL94]可以避免这些问题。

第 8.6 节中的问题可以总结为分配问题,它实际上并不是生产规划问题。但是当

将通过规划求出的产品批次分配到具有不同产能和生产率的机器或车间时就会出现

这个问题,因此我们仍然将它安排在这一章。更大规模的问题需要采用专用方法进行

求解,例如 Fisher 等人提出基于树的搜索方法[FJVW86],在其中使用了线性规划的

拉格朗日松弛。

Page 181: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions
Page 182: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

171

第 9 章 装载和切割问题

装载或打包问题将要研究如何将不同大小的物体装载到容积已知的容器内。根据

具体的应用环境,物体和容器可能为不同对象:将程序载入到内存中,将文件保存到

磁盘上,将盒子放到集装箱中或架子上,等等。

“打包”(pack)通常用于不可分割的物体,这些物体可以共存于同一个容器中

(例如卡车上装的箱子);而“装载”(load)应用于流体(罐子中的液体和气体,水

泥罐中的水泥粉末等),这些对象可以分割,但不能混装在同一个容器中。

切割问题(cutting stock problem)与此很类似,但目标是将一组物体从总体中

分割出,如从线轴上截下一段电缆,切割玻璃,金属版,或照片胶卷,从金属块上切

下小块金属等。装载和切割问题总称为放置问题(placement problem)。

在 简单的这类问题中,大小和容量仅有一个维度(如箱子的重量,文件的字节

数,电缆的长度等),且所有容器都具有相同的容量。显然,也存在容器和对象类型

为多个,且维度为二维,三维,甚至更高的问题。通常维度均为几何维度(金属板,

箱子等),或各种物理属性(重量,容积等)。

这些问题的共同目标是 大程度地填充此容器(容器无法容纳所有物体),或使

用 小的容器装下所有物体,或使负荷平衡。在切割材料时,一个目的是 小化废料

损失(trim loss),或留下尽可能大的剩余量,以用于将来切割出其他物体。

在 9.1 节中将讨论第一个问题,即装载问题,在其中将向货车装货物,并使负载

平衡。第 9.2 节中的问题将考虑如何向驳船上装货。在 9.3 节中将考虑储存罐装载问

题,需要将一批液体装入一些储存罐中(其中有些储存罐已经装有一些液体了),以

便保留 多的空储存罐。第 9.4 节要讨论的主题是如何将文件保存到磁盘。 后两个

问题将处理从大金属板上切下矩形金属片(9.5 节)和切下用作课桌腿的金属棒的问

题。这个问题是模式选择(pattern selection)问题的典型例子,即原整体只存在有

限种切割方案(模式)。

9.1 货车载荷平衡

有三节铁路货车车厢,其 大允许载重均为 100 公担(1 公担=100 千克),将使

用这三节车厢运输 16 个箱子。下表中列出了这些箱子的重量,单位为公担。应如何

将箱子分配到各个货车上,才能使每节货车实际载重均不超过 大允许载重,且使装

载量 大的车厢的装载量 小?

表格 9.1:箱子属性

箱子 1 2 3 4 5 6 7 8

重量 34 6 8 17 16 5 13 21

箱子 9 10 11 12 13 14 15 16

重量 25 31 14 13 33 9 25 25

Page 183: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

172

在建立数学规划模型之前,你可能希望了解是否可以使用这样的启发式方法对问

题进行求解:在所有箱子都装到车上之前,我们选择 重的尚未装车的箱子,并将它

放到实际载重 轻的货车上。

9.1.1 模型的数学表达

这个问题类似于装箱问题(请参考 9.3 节的储存罐装载问题和 9.4 节的文件备份

问题)。这里容器(货车)数量固定,目标函数是 小化 大的负载。在装箱问题中,

容器(箱子)的容量是固定的,但目标函数是 小化所使用的箱子数目。

令 BOXES 为箱子集合,WAGONS 为货车集合, bWEIGHT 为箱子b 的重量,

WMAX 为货车的 大允许载重量。可以使用二值变量 bwload 表示箱子向货车的分配

情况,当且仅当箱子b 装载到货车w上时, bwload 才取值为 1。

在这个问题中我们希望 小化货车的 大实际载重量。这种目标函数有时也称为

小化 大值(minimax)目标。类似地,也存在 大化 小值(maximin)问题,

即目标函数为使某个 小值 大化,如第 11 章将人员分配到工作岗位上。minimax或 maximin 优化问题也称为瓶颈问题。在线性模型中表述瓶颈问题的方法往往都是

相同的:

♦ 我们定义一个非负变量 weightmax ,表示所有货车的实际载重的 大值。

♦ 可以将 weightmax 设置为每辆货车载重量的上界,从而得到一组约束条件。

♦ 目标函数即 小化 weightmax 。

按照这个思路,在 优解中 weightmax 将取值为载重量 大的货车的载重量值。

我们可以得出下面的 0-1 问题。约束条件(9.1.2)将保证每个箱子都装载到一个货

车上。约束条件(9.1.3)将指定货车载重量的上限为 weightmax 。目标函数为(9.1.1),

即 小化 weightmax 。(9.1.4)指定除 weightmax 之外的所有变量均为二值变量。

minimize weightmax (9.1.1)

BOXESb∈∀ : 1=∑∈WAGONSw

bwload (9.1.2)

BOXESb∈∀ : weightmaxloadWEIGHTWAGONSw

bwb ≤⋅∑∈

(9.1.3)

Page 184: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

173

WAGONSw,BOXESb ∈∀∈∀ : { }10,loadbw ∈ (9.1.4)

0≥weightmax (9.1.5)

对于两个容器(货车)的情况,可以定义一个简单得多得数学模型。这时问题可

以转化为将箱子划分为两组,使其重量尽量接近。在 理想的例子中,可以得到两组

箱子重量均为 2/TOTALW ( ∑ ∈=

BOXESb bWEIGHTTOTALW表示所有箱子的总

重量)。因此可以将问题简化为选择放置在第一个货车上的箱子,使其总重量尽可能

逼近 2/TOTALW (从下逼近)。为此我们可以定义二值变量 bload,当且仅当箱子b

放置到货车 1 上时, bload取值才为 1,若箱子b 放到货车 2 上,则

0=bload(或

11 =− bload)。未放置到货车 1 上的箱子即放置到货车 2 上。因此如果的一辆货车

的实际载重量为 Δ−2/TOTALW ,则第二辆货车的载重量即为 Δ+2/TOTALW 。

minimize ∑ ∈BOXESb bWEIGHT (9.1.6)

2/TOTALWloadWEIGHTBOXESb

bb ≤⋅∑∈

(9.1.7)

BOXESb∈∀ : { }10,loadb ∈ (9.1.8)

这种尝试尽可能充分地填充单个容器(这里即为第一个货车,其容量上限为

2/TOTALW )的问题称为背包问题(请参考 9.2 节的驳船装载问题)。

9.1.2 模型实现

根据式(9.1.1)到(9.1.4)所表示的数学模型,可以很容易地写出对应的 Mosel程序。在下一节对结果的讨论中将会解释为什么向模型表达式中加入 大重量变量的

下界。

在定义和求解此混合整数规划问题之前,我们需要验证一下是否可以通过启发式

方法来找到满足给定的载重量限制WMAX 的解。这种启发式的方法要求将箱子按照

重量递减的顺序进行排列。因此可以使用 Shell 排序方法来实现一个排序启发算法:

♦ .首先将全部记录分成 1d 个组,在各个组内进行直接插入排序。

♦ 然后取 2d ( 12 dd < ),重复上述分组和排序(可能要多次重复此步骤)。

♦ 终 1=id ,即所有记录成为一个组,此时进行 后一次插入排序即可。

Page 185: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

174

在每次分组时分组数目之间的差值称为增量值。一种较好的增量选取方法是进行

循环,如 11 =i , 131 +⋅=+ kk ii , K,,k 21= 。

我们在实现此排序算法时假定数组的各个元素使用数字 N,,K1 进行索引。

model "D-1 Wagon load balancing"

uses "mmxprs"

forward function solve_heur:real

forward procedure shell_sort(A:array(range) of integer)

declarations

BOXES = 1..16 ! 箱子集合

WAGONS = 1..3 ! 货车集合

WEIGHT: array(BOXES) of integer ! 箱子重量

WMAX: integer ! 每辆火车载重上限

load: array(BOXES,WAGONS) of mpvar ! 如果箱子装载在货车上,则取值为 1

! 否则为 0

maxweight: mpvar ! 载重量 大的货车的载重

end-declarations

initializations from ‘d1wagon.dat’

WEIGHT WMAX

end-initializations

! 启发式求解此问题,当解足够好时中止程序

if solveheur<=WMAX

thenwriteln("Heuristic solution fits capacity limits")

exit(0)

end-if

! 每个箱子都装到一辆货车上

forall(b in BOXES) sum(w in WAGONS) load(b,w) = 1

! 限制每辆货车的载重量

forall(w in WAGONS) sum(b in BOXES) WEIGHT(b)*load(b,w) <= maxweight

! 对 大实际载重量的约束

maxweight <= WMAX

maxweight >= ceil((sum(b in BOXES) WEIGHT(b))/3)

forall(b in BOXES,w in WAGONS) load(b,w) is_binary

Page 186: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

175

! 小化 大载重量

minimize(maxweight)

!----------------------------------------------------------------

! 启发式求解:每次将 重的尚未装载的箱子装到目前载重 小的货车上

function solve_heur:real

declarations

ORDERW: array(BOXES) of integer ! 以降序排列的箱子重量

Load: array(WAGONS,range) of integer ! 已装车的箱子

CurWeight: array(WAGONS) of integer ! 货车的当前载重量

CurNum: array(WAGONS) of integer ! 当前每辆货车装载的箱子数

end-declarations

! 将箱子重量复制到数组 ORDERW 中,并将其排序为递减顺序

forall(b in BOXES) ORDERW(b):=WEIGHT(b)

shellsort(ORDERW)

! 使用 LPT 启发将箱子分配到各个货车上

forall(b in BOXES) do

v:=1 ! 找到装载量 小的货车

forall(w in WAGONS) v:=if(CurWeight(v)<CurWeight(w), v, w)

CurNum(v)+=1 ! 增加货车 v 上的箱子数目

Load(v,CurNum(v)):=b ! 向此货车上装载一个箱子

CurWeight(v)+=ORDERW(b) ! 更新货车的当前重量

end-do

returned:= max(w in WAGONS) CurWeight(w) ! 返回解值

end-function

!----------------------------------------------------------------

! 使用 Shell 排序将数组元素递减排列

procedure shell_sort(A:array(range) of integer)

N:=getsize(A)

inc:=1 ! 设置增量值

repeat

inc:=3*inc+1

until (inc>N)

repeat ! 对所有分组进行循环排序

inc:=inc div 3

forall(i in inc+1..N) do ! 直接插入排序外层循环

Page 187: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

176

v:=A(i)

j:=i

while (A(j-inc)<v) do ! 直接插入排序内层循环

A(j):=A(j-inc)

j -= inc

if j<=inc then break; end-if

end-do

A(j):= v

end-do

until (inc<=1)

end-procedure

end-model

在这个 Mosel 程序中,我们首次使用了一个函数(function)(目前为止我们所

定义的子程序都是过程,即没有返回值)。除了使用关键字 function 而不是 procedure外,在子程序原型中也声明了返回值类型(这里为 real),并且在函数体中将返回值

负值给 returned。

在 Shell 排序算法的实现中,我们也遇到了一些新特性:

♦ 函数 getsize 将返回数组或集合的大小(即所定义的元素数目)。

♦ 主排序循环汇中使用了 Mosel 语言提供的三种类型的循环:repeat-until,forall,以及 while。与 forall 循环类似,while 循环也有一种内联形式,此内

联形式将只应用于单个语句,而完整版本的 while-do 循环可以循环执行一

段语句。

♦ 可以使用 break语句来中断一个或多个循环。在我们这个例子中,使用 break语句来中断内层的 while 循环。由于我们只是跳出一个循环,因此可以写成

break 1。如果写成 break 3,则将跳出三层循环,即跳到 repeat-until 循环

之外。

在这个程序中引入的另一个 Mosel 语言特性是 exit 函数,它可以用于中止模型

的执行:如果用启发式方法完成了对此问题的求解,则没有必要定义后面的数学模型,

因此不需要启动优化算法。

9.1.3 结果

启发式算法返回的 大载重为 101 公担(另外两个货车的载重均为 97 公担)。

这表明启发式算法无法满足货车的载重量限制(不超过 100 公担),因此我们需要使

用优化算法来找出是否有可能装载所有这些箱子。

如果我们不对变量 weightmax 规定下界就运行上面的数学模型,则混合整数搜

索要搜索数十万个结点之后才能完成(在一台 Pentium III 计算机上需要花费好几分

钟),这时由于此时模型的表达比较弱(即,存在许多等价解,而这些解只是箱子的

Page 188: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

177

顺序不同)。其实很快就找到了 优的混合整数规划解,但验证此解为 优却花费了

很长时间。

理想情况为每辆货车的载重量相同,因此可以得到 大重量的下界为

3/WEIGHTBOXESb b∑ ∈

。由于所有箱子重量都是整数,而且无法将箱子分割,因

此可以将此下界向上取整(通过函数 ceil)。这样就有 ceil( 3/WEIGHTBOXESb b∑ ∈

) =

ceil(295/3) = 99。根据这个下界,当混合整数规划搜索找到一个值为 99 的整数可行

解时,即停止搜索。由于箱子无法分割,因此并不能轻易看出一定存在满足每个货车

载重上限 100 公担的整数解。

表格 9.2:货车装载方案

货车 总重量 箱子

1 99 2,3,7,9,12,14,16

2 98 4,5,6,8,11,15

3 98 1,10,13

除了对 大重量施加上述的下界约束之外,也可以调整优化器的截断(cutoff)值:当在分支定界搜索中找到一个整数可行解时,优化器即使用此值作为目标函数的

新的上界。由于在这个问题中只能得到整数解,因此可以将此上界减去一个接近于 1的值,来迫使优化器寻找下一个整数解。我们在模型中调用优化算法之前加入如下语

句:

setparam("XPRS_MIPADDCUTOFF",-0.99999)

这样当混合整数搜索找到值为 99 的解时,优化器即设置新的上界为 99 –

0.99999 = 98.00001。而根线性规划的 优解为 98.33333(不对 weightmax 施加下

界约束),比这个上界大,因此搜索即结束。

表 9.2 中给出了一种能够使目标函数值达到 优值 99 的装载方案。

9.2 驳船装载

在莱茵河中有个船东拥有一艘驳船,其货舱容量约为 1500 立方米。长期以来他

一直从事小麦运输。他有七个老客户,这些客户差不多都总是在固定的地方装船和卸

货。船东在长期经验中总结出了运输成本,并根据自己的个人偏好与客户就小麦的运

价达成了协议。下表总结了这七个客户的这些信息。每个客户都希望运输一定批次的

小麦,每批小麦的量用立方米计。下表列出了船东为每批小麦收取的运费。表格的

后一列是船东每运输一立方米小麦的成本。运输距离不同,则成本也不同。

表格 9.3:待运小麦批次信息

客户 待运小麦量

(批)

每批大小

(m3)

每批运费

(欧元)

运输成本

(欧元/立方米)

1 12 10 1000 80

2 31 8 600 70

Page 189: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

178

3 20 6 600 85

4 25 9 800 80

5 50 15 1200 73

6 40 10 800 70

7 60 12 1100 80

船东的目标是使运输利润 大,每批小麦都是可以分割的。

问题 1:首先假定每个客户要运输的小麦数量均为无限,则应运输哪个客户的小

麦?

问题 2:如果考虑到每个客户可以提供的小麦量有限,那么此船东应采取何种策

略?

问题 3:如果每批小麦都不可以拆分,那么应采取何种方案?

9.2.1 模型的数学表达

在这一节中对上述三个问题都给出数学模型。在每一个问题中,目标都是 大化

船东的利润。令CAP 为此驳船的货舱容量。记CLIENTS 为客户集合, cAVAIL 为

客户 c 要运输的小麦批数, cSIZE 为此客户每批小麦的量, cPRICE 为向此客户收取

的运费, cCOST 为每立方米此客户的小麦的运输成本。使用所给定的数据,我们就

可以计算出船东运输此客户 c 的每一批小麦能够获得的利润。通过(9.2.1)式可以

很容易地求出此利润:从向客户收取的运费中扣除此客户每批小麦的运输成本即为每

批小麦的利润。

CLIENTSc∈∀ : cccc SIZECOSTPRICEPROF ⋅−= (9.2.1)

使用此方程也可以计算出运输其他客户的每批小麦能够给船东带来的利润,如下

表所示。

表格 9.4:运输每批小麦的利润

客户 1 2 3 4 5 6 7

利润/批(欧元) 200 40 90 80 105 100 140

利润/m3(欧元) 20 5 15 8.8889 7 10 11.6667

我们引入决策变量 cload,表示运输客户 c 的小麦的批次数。由于一批小麦可以

拆分,因此这些变量可以取小数值。此模型只有一个约束条件,即限制运输的小麦总

量不超过货舱容积(约束条件(9.2.3))。使用上面求出的利润数据,我们可以很容

易地写出目标函数(9.2.2):

maximize ∑∈

⋅CLIENTSc

cc loadPROF (9.2.2)

Page 190: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

179

CAPloadSIZECLIENTSc

cc ≤⋅∑∈

(9.2.3)

CLIENTSc∈∀ : 0≥cload (9.2.4)

如果需要将每个客户拥有的小麦批次数也计入考虑,则只需加入约束条件

(9.2.5),即运输的小麦批次数 cload不超过可以提供的批次数。

CLIENTSc∈∀ : cc AVAILload ≤ (9.2.5)

此时可能无法分割每批小麦,即变量 cload只能取整数值。因此向模型加入约束

条件(9.2.6)。

CLIENTSc∈∀ : Nloadc ∈ (9.2.6)

9.2.2 模型实现

为简化对目标函数的表述,在下面数学模型的 Mosel 实现中,将像前面一节一

样分别计算每个客户的利润。 终得到一个非常简单的模型,这个模型中只包含一个

约束条件。其他约束条件将逐渐加入到此问题的定义中。在每次优化之后,我们调用

过程 print_sol 来显示求解结果。

model "D-2 Ship loading"

uses "mmxprs"

forward procedure print_sol(num:integer)

declarations

CLIENTS = 1..7 ! 客户集合

AVAIL: array(CLIENTS) of integer ! 每个客户拥有的小麦批数

SIZE: array(CLIENTS) of integer ! 每批小麦大小

PRICE: array(CLIENTS) of integer ! 向客户收取的运费

COST: array(CLIENTS) of integer ! 每个客户的运输成本

PROF: array(CLIENTS) of integer ! 每个客户的利润

CAP: integer ! 驳船货舱容积

load: array(CLIENTS) of mpvar ! 为每个客户运输的批次数

end-declarations

initializations from ‘d2ship.dat’

AVAIL SIZE PRICE COST CAP

Page 191: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

180

end-initializations

forall(c in CLIENTS) PROF(c):= PRICE(c) -COST(c)*SIZE(c)

Profit:= sum(c in CLIENTS) PROF(c)*load(c)

! 驳船货舱容积限制

sum(c in CLIENTS) SIZE(c)*load(c) <= CAP

! 问题 1:客户拥有的小麦批次数为无限

maximize(Profit)

print_sol(1)

! 问题 2:客户拥有的小麦批次数有限

forall(c in CLIENTS) load(c) <= AVAIL(c)

maximize(Profit)

print_sol(2)

! 问题 3:运输的批次数必须为整数

forall(c in CLIENTS) load(c) is_integer

maximize(Profit)

print_sol(3)

!----------------------------------------------------------------

! 打印输出求解结果

procedure print_sol(num:integer)

writeln("Problem ", num, ": profit: ", getobjval)

forall(c in CLIENTS)

write( if(getsol(load(c))>0 , " " + c + ":" + getsol(load(c)), ""))

writeln

end-procedure

end-model

9.2.3 结果

我们将依次查看这三个问题的结果。在第一个问题中,优化器返回总利润为

30,000 欧元,只为客户 1 运输 150 批次小麦。其他客户需要寻找其他的运输商。这

个答案非常明显:应只选择单位体积小麦带来利润( cc SIZE/PROF ,此值请参考

表 9.4 的第二行) 大的客户。

Page 192: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

181

但实际上,每个客户需要运输的小麦是有限的。第二个问题受的约束比第一个问

题多,求解结果为目标函数值降为 17,844.44 欧元。要为 5 个客户提供服务,各个运

量如下表所示。此时我们也需要通过逻辑分析出这样的结果。船只的货舱容积足以容

纳单位容积利润 高的客户的所有小麦,因此我们继续服务第二好的客户(即单位容

积利润第二高的客户),以此类推,直到货舱完全装满。当货舱装满后此过程即停止,

因此 后一批小麦可能没有完全装载。

在我们的例子中,客户按照单位容积利润降序排列为 1,3,7,6,4,5,2。因此将运输客户 1,3,7,6 的所有小麦,占用货舱容积总计为 1360 立方米。剩余

的 140 立方米容积将用于装载客户 4 的小麦,即 15.5556 批。

表格 9.5:小麦运输方案

客户 1 2 3 4 5 6 7

问题 1 150 0 0 0 0 0 0

问题 2 12 0 20 15.5556 0 40 60

问题 3 12 0 20 15 1 39 60

如果要求装载的小麦批数必须为整数值(问题 3),则此解与问题 2 的解很相似,

只需少量改动。为客户 1,3,7 运输的小麦量保持不变。只为客户 4 运输 15 批小麦,

只为客户 6运输 39批小麦,为客户 5运输 1批小麦。此时目标函数值相应降为 17,805欧元。注意通常情况下允许批次数为小数与不允许批次数为小数时具体装载的批次可

能有很大区别。这种问题称为背包问题。

9.3 储存罐注液

5 艘油船抵达了一个化工厂。这些油船中装有液体载荷,这些液体不允许混合:

1200 吨苯,700 立方米丁醇,1000 立方米丙醇,450 立方米苯乙烯,1200 立方米

四氢呋喃(THF)。在此化工厂里有九个不同大小的存储罐。有一些存储罐已经装有

一些液体。下表列出了每储存罐的属性(单位为吨)。应将这些船中装载的液体分别

装载到哪个储存罐中才能使未使用的储存罐容量 大(问题 1),或怎样才能使保留

未用的储存罐数目 多?

表格 9.6:储存罐属性

罐子编号 1 2 3 4 5 6 7 8 9

容量 500 400 400 600 600 900 800 800 800

当前内容 - 苯 - - - - THF - -

体积 0 100 0 0 0 0 300 0 0

9.3.1 模型的数学表达

令TANKS 为存储罐集合,LIQ 为液体产品集合。我们可以用 lARR 表示将要到

达此工厂的液体 l 的体积。用 tCAP 表示存储罐 t 的容积,此存储罐内已经储存有体积

Page 193: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

182

为 tQINIT 的液体 tTINIT (只有当 0>tQINIT 时此变量才有定义)。所有容积都用立

方米计。根据以下性质即可以写出模型的表达式:液体 l 应优先装入已经含有此液体

的存储罐,然后再考虑其他存储罐,这种解决方案是 优的。

为验证此论断的正确性,假定体积为 x 的液体 l 将要装入空存储罐a ,而另一个

存储罐b 已经装有一些液体 l ,剩余容积为 0>y 。若 yx > ,则如果先填充存储罐b ,

然后再将剩余的 yx − 的液体装入存储罐a ,这样不会改变未使用的存储罐数目或其

总容积。如果 yx ≤ ,则可以将体积为 x 的液体全部注入存储罐b ,从而不需要使用

存储罐 a 。因此优先填充存储罐b 直到此存储罐装满或液体已完全装入这个方案至少

与其他方案一样好。

在经过这样的优先注入之后,我们仍然需要考虑的问题是如何将体积为表达式

(9.3.1)所定义的 lREST 的液体注入其他空存储罐。 lREST 即为在原先装有部分液

体的存储罐已经装满后剩余的液体体积。我们假定 lREST 大于 0,否则就可以从问题

中去掉那些已经完全注满的存储罐以及那些已经完全注入的液体。

LIQl ∈∀ : ( )∑=

−−=

lTINITTANKSt

ttll

t

QINITCAPARRREST (9.3.1)

我们引入二值变量 ltload,只有对那些第一步的优先注入之后仍然为空的存储罐

t 此变量才有定义(9.3.5)。 ltload为 1 则表示液体 l 将要注入存储罐 t 。约束条件

(9.3.4)将保证每个空的存储罐至多只注入一种液体。约束条件(9.3.3)保证用于

装液体 l 的存储罐的总容积足够大。目标函数(9.3.2)将 小化已经使用的存储罐的

总容积,以回答问题 1,即 大化那些仍然为空的存储罐的总容积。为 大化未使用

的存储罐数目,只须从(9.3.2)式的求和中去掉系数 tCAP。

minimize ∑ ∑∈

=∈

⋅LIQl

QINITTANKSt

ltt

t

loadCAP0

(9.3.2)

LIQl ∈∀ : l

QINITTANKSt

ltt RESTloadCAP

t

≥⋅∑=

∈0

(9.3.3)

0=∈∀ tQINIT,TANKSt : 1≤∑∈LIQl

ltload (9.3.4)

Page 194: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

183

9.3.2 模型实现

下面的 Mosel 程序实现了前一小节所创建的数学模型。由于变量 ltload 只对那些

在 初完全为空的存储罐有定义,因此在对这些变量的求和中不需要测试条件

0=tQINIT 。

model "D-3 Tank loading"

uses "mmxprs"

forward procedure print_sol

declarations

TANKS: range ! 存储罐集合

LIQ: set of string ! 液体集合

CAP: array(TANKS) of integer ! 存储罐容积

TINIT: array(TANKS) of string ! 初始存储罐内容物类型

QINIT: array(TANKS) of integer ! 初始存储罐已用容量

ARR: array(LIQ) of integer ! 送达工厂的化学物质的体积

REST: array(LIQ) of integer ! 在注满初始不为空的存储罐之后剩余的液体量

load: array(LIQ,TANKS) of mpvar ! 如果液体注入容器,取值为 1,否则为 0

end-declarations

initializations from ‘d3tanks.dat’

CAP ARR

[TINIT, QINIT] as ‘FILLED’

end-initializations

finalize(LIQ)

forall(t in TANKS | QINIT(t)=0, l in LIQ) do

create(load(l,t))

load(l,t) is_binary

end-do

! 注满初始不为空的存储罐,并计算各种液体的剩余量

forall(l in LIQ)

REST(l):= ARR(l) -sum(t in TANKS | TINIT(t)=l) (CAP(t)-QINIT(t))

! 目标函数 1:已占用的存储罐的总容量

TankUse:= sum(l in LIQ, t in TANKS) CAP(t)*load(l,t)

Page 195: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

184

! 目标函数 2:已占用的存储罐数目

TankNum:= sum(l in LIQ, t in TANKS) load(l,t)

! 不同种类的液体不应混合

forall(t in TANKS) sum(l in LIQ) load(l,t) <= 1

! 空存储罐中注入的液体量不能超过其容量

forall(l in LIQ) sum(t in TANKS) CAP(t)*load(l,t) >= REST(l)

! 使用目标函数 1 求解此问题

minimize(TankUse)

print_sol

! 使用目标函数 2 求解此问题

minimize(TankNum)

print_sol

!----------------------------------------------------------------

! 打印求解结果

procedure print_sol

writeln( "Used capacity: ", getsol(TankUse) +

sum(t in TANKS | QINIT(t)>0) CAP(t),

" Capacity of empty tanks: ", sum(t in TANKS) CAP(t) –

getsol(TankUse) –

sum(t in TANKS | QINIT(t)>0) CAP(t))

writeln("Number of tanks used: ", getsol(TankNum) +

sum(t in TANKS | QINIT(t)>0) 1)

forall(t in TANKS)

if(QINIT(t)=0) then

write(t, ": ")

forall(l in LIQ) write( if(getsol(load(l,t))>0 , l, ""))

writeln

else

writeln(t, ": ", TINIT(t))

end-if

end-procedure

end-model

9.3.3 结果

在进行求解时,我们需要考虑到我们的模型只考虑了那些在 初完全为空的存储

Page 196: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

185

罐:程序计算出的目标函数值应加上 初已经含有部分液体的容器的容量(或数量)。

对于第一个目标函数,我们可以得到使用掉的总容积为 5200 立方米,存储罐 4仍然为空,即仍然有 600 立方米容积为空(可以有多种方案达到此目标)。表 9.7 显

示了此时其他存储罐中的液体分布方案,如果这些存储罐未完全注满,则还会留有部

分空余容积。

表格 9.7: 优存储罐注入方案

液体类型 存储罐 剩余容积

苯 2,6 0

丁醇 9 100

丙醇 3,5 0

苯乙烯 1 50

THF 7,8 100

图 9.1 是对此解决方案的图形表示,其中未使用的存储罐容积用灰色区域表示,

初始已占用的容积用虚线表示。

图 9.1: 优注入方案

在第一个目标函数的 优解决方案中,总计使用了 8 个存储罐。使用第二个目

标函数对此问题进行求解可以发现 8 就是使用的存储罐的 少个数。

9.4 文件备份

在出发去度假之前,你希望将你的一些 重要的文件备份到软盘上。每个空白软

盘的容量是 1.44MB。你需要备份的十六个文件的大小分别为: 46KB,55 KB,62 KB,87 KB,108 KB,114 KB,137 KB,164 KB,253 KB,364 KB,372 KB,388 KB,406 KB,432 KB,461 KB,和 851 KB。

假定你无法使用压缩软件,但软盘数量足够,那么应如何将这些文件分配到每一

张软盘上才能使使用的软盘数目 少?

9.4.1 模型的数学表达

令 FILES 为需要备份的文件集合, { }ND,,DISKS K1= 为软盘集合。令CAP为

Page 197: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

186

软盘的容量, fSIZE 为文件 f 的大小,单位均为 KB。我们引入变量 fdsave ,如果

文件 f 将要保存到软盘 d 上,则 fdsave 取值为 1,否则取值为 0。我们也定义一个变

量 duse ,如果软盘 d 上保存了文件,则此变量为 1,否则为 0。

目标是 小化所使用的软盘数目,即 小化变量 duse 的和,同时应满足如下约

束条件:

a). 一个文件只能保存到一个软盘上。由此约束条件可以得到关系式(9.4.1)。

FILESf ∈∀ : 1=∑∈DISKSd

fdsave (9.4.1)

b). 软盘的容积是有限的,因此可以写出关系式(9.4.2)。

DISKSd ∈∀ : dFILESf

fdf useCAPsaveSIZE ⋅≤⋅∑∈

(9.4.2)

此约束条件右边的变量 duse将在变量 fdsave

和 duse之间建立联系:如果 fdsave

取值为 1,则文件 f 保存到软盘 d 上,因此软盘 d 被使用,变量 duse取值为 1。关

系式(9.4.2)即限定只要有一个变量 fdsave( FILESf ∈ )取值为 1,则变量 duse

必定取值也为 1。因此可以得到如下混合整数规划模型:

minimize ∑∈DISKSd

duse (9.4.3)

FILESf ∈∀ : 1=∑∈DISKSd

fdsave (9.4.4)

DISKSd ∈∀ : dFILESf

fdf useCAPsaveSIZE ⋅≤⋅∑∈

(9.4.5)

FILESf,DISKSd ∈∈∀ : { }10,save fd ∈ (9.4.6)

DISKSd ∈∀ : { }10,used ∈ (9.4.7)

可以减少此问题中使用的变量数目:我们仍然使用前面模型中的布尔变量

fdsave(但不再使用变量 duse

),然后引入一个新的变量 diskuse,对应于使用的软

盘数量。则可以得到模型的第二种表达方式如下:

minimize diskuse (9.4.8)

FILESf ∈∀ : ∑∈

⋅≥DISKSd

fdsaveddiskuse (9.4.9)

Page 198: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

187

FILESf ∈∀ : 1=∑∈DISKSd

fdsave (9.4.10)

DISKSd ∈∀ : CAPsaveSIZEFILESf

fdf ≤⋅∑∈

(9.4.11)

FILESf,DISKSd ∈∈∀ : { }10,save fd ∈ (9.4.12)

0≥diskuse (9.4.13)

在这种情况下目标函数为(9.4.8),它非常简单。我们假定文件先写入编号为

1=d 的软盘,然后第 2 张软盘,以此类推。则根据约束条件(9.4.1)到(9.4.10)

包含文件 f 的软盘的编号为 k ,且 k 可以用(9.4.14)计算出:

: ∑∈

⋅=DISKSd

fdsavedk (9.4.14)

diskuse 必须至少等于所使用的软盘的 大编号,即约束条件(9.4.9)。约束条

件(9.4.10)表示一个文件只能保存到一张软盘上,因此等价于前一模型的约束条件

(9.4.1)。表达式(9.4.11)是磁盘容量的约束条件。

终,所有变量 fdsave 都必须为二值变量,变量 diskuse 必须为非负值(由于在

优解中将自动使此变量取整数值,因此不再需要对其施加整数性约束)。在这个模

型中, 小化目标函数即尽量减小变量 diskuse 的值,并对文件进行备份,使所使用

的软盘的 大编号尽量小。这个模型比前一个模型少用了 ND个 Boolean 变量。

9.4.2 模型实现

下面的 Mosel 程序实现了上述第二个数学模型(式(9.4.8)到(9.4.13))。注

意,根据给定的文件大小,我们可以试探性地计算出备份所有文件所需的磁盘数目上

限。我们将所有文件大小除以每张软盘的容量,然后将其向上取整。如果与软盘容量

相比要保存的文件都比较小,如本例,则可以使用这样计算出的数值作为使用软盘数

目的上界。对于一般的情况,使用磁盘数目的唯一上界是要保存的文件数目。(例如

5 个文件大小均为 0.75MB: 7537505 .. =⋅ ,除以 1.44 后向上取整得到 3,但是由

于每张软盘只能存放一个这样大的文件,因此我们实际上需要 5 张软盘。)

model "D-4 Bin packing"

uses "mmxprs"

declarations

ND: integer ! 软盘数目

FILES = 1..16 ! 文件集合

DISKS: range ! 软盘集合

Page 199: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

188

CAP: integer ! 软盘容量

SIZE: array(FILES) of integer ! 要保存的文件容量

end-declarations

initializations from ‘d4backup.dat’

CAP SIZE

end-initializations

! 提供足够数量的软盘

ND:= ceil((sum(f in FILES) SIZE(f))/CAP)

DISKS:= 1..ND

declarations

save: array(FILES,DISKS) of mpvar ! 如果文件保存到软盘上则取 1,否则取 0

diskuse: mpvar ! 使用的软盘数量

end-declarations

! 限制使用的软盘数量

forall(f in FILES) diskuse >= sum(d in DISKS) d*save(f,d)

! 每个文件都只能保存到一张软盘上

forall(f in FILES) sum(d in DISKS) save(f,d) = 1

! 软盘的容量限制

forall(d in DISKS) sum(f in FILES) SIZE(f)*save(f,d) <= CAP

forall(d in DISKS,f in FILES) save(f,d) is_binary

! 小化使用的软盘总数

minimize(diskuse)

end-model

9.4.3 结果

在 优解中,使用了三张软盘。文件在软盘上的分布方式如下表所示(存在多个

可行方案)。

表格 9.8:文件在磁盘上的分配方式

软盘 文件大小(KB) 使用空间(MB)

1 46 87 137 164 253 364 388 1.439

2 55 62 108 372 406 432 1.435

3 114 461 851 1.426

在这样的问题中,目标函数很弱,问题肯定可行,此时可以通过破除问题的对称

Page 200: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

189

性来提高分支定界法的搜索速度。对文件和磁盘的编号都是随意的,因此如果我们指

定将某个文件分配到某张软盘上也不失一般性,例如我们可以将 大的文件分配到第

一张软盘上。这种打破对称性的方法在组合问题中非常有效,有时这种方法能够避免

线性规划松弛搜索一部分整数不可行的方案。

9.5 金属板切割

在一个金属板加工车间内将要从尺寸为 48 分米×96 分米(dm)的大块矩形金

属板上切割下小块的金属板。此车间接到订单要求生产 8 块大小为 36 分米×50 分米

的矩形金属板,13 块大小为 24 分米×36 分米的矩形金属板,以及 15 块大小为 18分米×30 分米的矩形金属板。这些金属板都需要从现有的大块金属板上切割下。为

生产出满足订单要求的金属板, 少可以使用多少块大块金属板?

9.5.1 模型的数学表达

这个问题属于一类高度组合的问题,需要利用对每块大金属板只存在有限种小矩

形金属板切割组合方案这一事实。可以很容易地列举切割出这些方案,如图 9.2 列出

了十六种切割方案。图中显示的都是 大切割组合方案,即在其上无法再次切割下小

的矩形块。此图只显示了每种组合方案的多种可行方式中的一种。

令 SIZES 为不同大小的矩形集合, PATTERNS 为在此图中给出的切割组合方

案。对于每个大小的矩形,都已经给定了需求量 sDEM 。每个切割组合方案都有一

个成本 pCOST (如果希望 小化所使用的大金属板数目,则 1=pCOST )。表 9.9

定义的矩阵 spCUT 即列出了各种切割组合方案。

表格 9.9:切割组合方案总结

尺寸 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

36×50 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

24×36 2 1 0 2 1 0 3 2 1 0 5 4 3 2 1 0

20×60 0 0 0 2 2 2 1 1 1 1 0 0 0 0 0 0

18×30 0 1 3 0 1 3 0 2 3 5 0 1 3 5 6 8

在完成枚举所有切割方案之后,即可以很容易地写出此问题的数学模型。我们需

要计算出在满足订单需求时以每种组合方案切割的金属板数目,并且使消耗的金属板

数目 小。

我们引入整数变量 puse (9.5.3),表示以组合方案 p 切割的金属板数目。约束

条件(9.5.2)指定每种类型矩形各切出多少个才能够满足订单需求。目标函数(9.5.1)即切割大金属板的总成本(或总数目)。

minimize ∑∈

⋅PATTERNSp

pp useCOST (9.5.1)

Page 201: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

190

SIZESs∈∀ : sPATTERNSp

psp DEMuseCUT ≥⋅∑∈

(9.5.2)

PATTERNSp∈∀ : Nusep ∈ (9.5.3)

图 9.2:16 种切割方案图示

9.5.2 模型实现

下面的 Mosel 程序即实现了上述的数学模型。

model "D-5 Sheet metal cutting"

uses "mmxprs"

declarations

PATTERNS = 1..16 ! 切割组合方案集合

Page 202: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

191

SIZES = 1..4 ! 矩形尺寸

DEM: array(SIZES) of integer ! 各种尺寸的矩形的需求量

CUT: array(SIZES,PATTERNS) of integer ! 切割组合方案

use: array(PATTERNS) of mpvar ! 使用每种切割组合方案切割的大金属板数目

end-declarations

initializations from ‘d5cutsh.dat'

DEM CUT

end-initializations

! 目标函数:切割的大金属板总数

Sheets:= sum(p in PATTERNS) use(p)

! 满足需求

forall(s in SIZES) sum(p in PATTERNS) CUT(s,p)*use(p) >= DEM(s)

forall(p in PATTERNS) use(p) is_integer

! 求解此问题

minimize(Sheets)

end-model

9.5.3 结果

求解得出的 后整数解为使用 11 张大金属板,其中按照第一种切割方案切割 6张金属板,按第 2 种和第 3 种方案各切割 1 张,按第 6 种方案切割 2 张,按第 10 种

方案切割 1 张(注意,存在多种等价的解决方案)。按照这种解决方案,切割出的小

矩形金属板数目恰好能够满足订单需求。我们 小化了使用的大金属板总数,同时小

金属板产量恰等于需求量,但在更大的例子中并不总能得到这样的理想结果。

在枚举出各种切割组合方案之后,就可以采用非常简洁的通用数学模型。在实际

应用中,很难手工枚举出所有组合方案,此时可以采用一些专用的程序来进行,以避

免发生遗漏。

9.6 切割用作课桌腿的铁棒

SchoolDesk 公司为幼儿园,小学,中学,和大学生产各种大小的课桌。所有课

桌腿的直径都相同,但长度不同: 矮的课桌腿为 40 厘米,中等高度的为 60 厘米,

大的为 70 厘米。这些课桌腿都将从长度为 1.5 米和 2 米的铁棒切割出来。此公司

收到一份 108 张小课桌,125 张中课桌,和 100 张大课桌的订单。应如何生产才能

够使废料 少?

Page 203: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

192

9.6.1 模型的数学表达

这个问题与前面切割金属板的例子很类似。模型的表达都需要利用每种铁棒只存

在少量几种切割方案这一事实。较短的铁棒长度为 1.5 米,可以切割为两条 70 厘米

长的桌腿,剩余的 10 厘米无法用作其他任何类型的桌腿。这种铁棒也可以切割为一

条 60 厘米和一条 70 厘米的桌腿,剩余 20 厘米废料。下表列举出了所有可能的切割

方案。

令 SIZES 为课桌腿的长度集合, sDEM 为大小为 s 的课桌的需求量。由于每张

课桌有四条桌腿,因此需要将需求量乘以 4 才能得到需要的课桌腿数目。

集合 1PAT 和 2PAT 分别是第一种和第二种铁棒的切割组合方案集合,将它们

合并为所有组合方案集合 21 PATPATPATTERNS U= 。我们记 bLEN 为第b 种铁

棒的长度。

表格 9.10:每种类型铁棒的可能切割方案

桌腿类型 损耗

切割方案

编号 40 厘米 60 厘米 70 厘米 (厘米)

铁棒 1 1 0 0 2 10

(1.5 米) 2 0 1 1 20

3 2 0 1 0

4 0 2 0 30

5 2 1 0 10

6 3 0 0 30

铁棒 2 7 0 1 2 0

(2 米) 8 0 2 1 10

9 1 0 2 20

10 3 0 1 10

11 0 3 0 20

12 5 0 0 0

目标函数是 小化废料量,即所使用的铁棒总长度与实际切割出的课桌桌腿总长

度之间的差值。我们使用变量 puse表示切割方案 p 使用的次数,则目标函数(9.6.1)

的前两项即表示使用掉的铁棒的总长度, 后一项表示定购的课桌桌腿的总长度。

minimize ∑∑∑∈∈∈

⋅⋅−⋅+⋅SIZESs

sPATp

pPATp

p sDEMuseLENuseLEN 42

21

1 (9.6.1)

SIZESs∈∀ : sPATTERNSp

pps DEMuseCUT ⋅≥⋅∑∈

4 (9.6.2)

PATTERNSp∈∀ : Nusep ∈ (9.6.3)

在此目标函数中,对应于课桌桌腿总长度的项是常数,对 小化操作没有影响,

Page 204: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

193

因此可以将它略去。在约束条件(9.6.2)中, psCUT表示在切割方案 p 中切割出的

长度为 s 的桌腿数量,此约束条件将保证切割出的桌腿数量能够满足需求。约束条件

(9.6.3)将使变量 puse只能取非负值。

9.6.2 模型实现

可以将上述数学模型转化为以下的 Mosel 程序。注意,使用了运算符+来计算两

个集合(PAT1 和 PAT2)的并集。

model "D-6 Cutting steel bars"

uses "mmxprs"

declarations

PAT1 = 1..6; PAT2 = 7..12 ! 切割组合方案集合

PATTERNS = PAT1 + PAT2 ! 所有切割组合方案

SIZES: set of integer ! 课桌高度

DEM: array(SIZES) of integer ! 不同高度课桌的需求量

CUT: array(PATTERNS,SIZES) of integer ! 切割方案

LEN: array(range) of integer ! 原始铁棒长度

use: array(PATTERNS) of mpvar ! 按各个切割方案切割的铁棒数

end-declarations

initializations from ‘d6cutbar.dat'

DEM CUT LEN

end-initializations

! 目标函数:废料总长度

Loss:= sum(p in PAT1) LEN(1)*use(p) + sum(p in PAT2) LEN(2)*use(p) –

sum(s in SIZES) 4*DEM(s)*s

! 满足需求量

forall(s in SIZES) sum(p in PATTERNS) CUT(p,s)*use(p) >= 4*DEM(s)

forall(p in PATTERNS) use(p) is_integer

! 求解此问题

minimize(Loss)

end-model

在这个模型中我们不仅仅像很多其他例子一样使用了整数区间作为索引集合

Page 205: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

194

(PAT1,PAT2,PATTERNS,以及集合 LEN 的未命名索引集),而且也使用了一个

整数集合,即 SIZES。set of integer 的形式比 range 集合更一般,后者总是只包含

连续的整数值。在这个例子中,我们希望 SIZES 只包含三种不同的高度(而不包含

低高度值和 高高度值之间的其他整数值)。这是直接将数据用作索引值的一种良

好方式。

9.6.3 结果

通过优化求解出 小废料总长度为 2020 厘米。将使用 2 根 1.5 米长的桌腿(使

用切割方案 1 和 3 各一次)和 385 根 2 米长的桌腿(使用 195 次切割方案 7,7 次

切割方案 8,97 次切割方案 11,86 次切割方案 12)。通过这种切割方案组合方式,

所生产出的桌腿数量恰好能够满足课桌的定购需求。

9.7 参考文献和进阶阅读

本章中的所有问题都是 NP-hard 问题,而数学规划方法只能求解规模不甚大的

此类问题。9.1 节中的货车装载问题属于在m 台相同的机器上调度 n 个非抢先的任务

的问题,也称为m 处理机调度问题。 小化所有货车的 大载荷即对应于 小化调

度方案的总时间消耗。若将此问题表示为线性规划,则很难处理机器数目超过 3 个,

任务数超过 30 个的问题。对于两台机器的问题,可以采用复杂度为 ( )nBO 的动态规

划方法(一种递归优化方法)[MT90]来求解 100 个任务以内的此类问题( B 为所有

任务的总时间)。

可以使用一些专用的树搜索方法来处理 100 个任务以内的问题[HW95]。当优化

方法太长时,采用 LPT(Longest Processing Time, 长处理时间)启发式算法可

以找到很好的解,在此算法中每次迭代时都将具有 长处理时间的任务安排到负荷

轻的机器上。LPT 方法求得的解与 优解之间的比率仅为m31

34− [Gra69]。我们在

9.1 节中已经看到,使用 Mosel 语言可以很容易地实现 LPT 方法:启发算法求得的

解与 优解很接近,但对于给定的容量约束来说,仍然不够好(这正证明了优化的有

效性!)。在我们的 LPT 方法实现中使用了 Shell 排序算法,在[PFTVed]中可以找到

此算法及其他一些排序算法的详细介绍。

9.2 节中的驳船装载问题属于背包问题;此类问题都只有一个约束条件,即背包

容量约束。具有小数变量的背包问题很容易求解:只需按照每单位容量代价递减的顺

序对容器进行填充。整数背包问题是 NP-hard 问题,但是可以采用动态规划方法或

树搜索方法来求解相当规模的此类问题[SDK83],[MT79]。

在 Christofides 等人的著作[CMT79a]中描述了存储罐注入问题。在此著作中介

绍了一种可以用于大规模实例(35 种液体,70 个储存罐)的树搜索方法,以及一种

用于动态情形的算法,在动态情形种需要将液体注入和导出操作的顺序也计入考虑。

在 9.4 节中介绍的将文件备份到软盘上的问题也称为装箱问题,在其中需要搜索

找到将 n 个物体装入 多m 个容量相同的箱子的方法,并使使用的箱子数目 少,

Page 206: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

195

其中物体 i 的重量为 iW 。这是一个 NP-hard 问题。通常可以采用启发式方法求解。

感兴趣的读者可以参考 Coffman 等人的论文[CGJ96],或 Martello 和 Toth 的著作

[MT90]。

第 9.5 节和 9.6 节描述的都是切割问题,它们是高度组合的问题,通常都含有大

量的变量。约束条件变化有很多种,如切割必须从一个边界到另一个边界(断头台切

割,guillotine cut)。

在这些问题的优化方法中,有一些是基于树的方法,例如[HZ96]。Gilmore 和

Gomory([GG61]和[GG63])引入了另一种精确方法,称为列生成方法(column generation),这种方法 早用于解决一维问题。在这种方法中,首先求解一个只包

含原先完整数学规划问题的部分列子集的问题,而原问题自身可能太大而无法完全生

成。然后逐步加上进基列(promising columns)。如果这种方法能够有效作用,则只

需生成完整模型列的一小部分就可以找到 优解。

对于大规模的问题,需要使用元启发算法如禁忌搜索 [LMV99]或遗传算法

[Jak96]。具有相同材料损耗的方案可能具有不同的切割成本。请参考[CA99]了解一

些 小化此成本的方法。在 9.5 节中问题表达为集合覆盖问题,类似于第 12 章中的

蜂窝电话基站设置问题。这种模型表达方式效率相对较高,能够很好地解决方案数不

超过 100 个的情形,但是如果要切割的矩形比原始的金属板要小很多,则会出现非

常多种不同的方案,这时此方法能够处理的方案数还是太少。Sweeney 等人就装载

和切割问题给出了一份详尽的参考文献列表[SRP92],其中列出了 400 多个参考文

献。

Page 207: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions
Page 208: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

197

第 10 章 陆路运输

在公路和铁路运输以及第 11 章中将要研究的航空运输中,都存在很多优化问题。

这陆路运输网络与航空运输网络之间的主要区别在于陆路运输的网络更为密集,参与

者更多。边境的开放和运输商之间的强烈的竞争都使得优化方法成为降低运输成本从

而能够从竞争中胜出得关键因素。

第 10.1 节将给出一个车辆租赁问题,在其中为保持理想的车队大小,需要将汽

车在各个租赁代理处之间转运,并需要使费用 小。在 10.2 节中描述了一个在不同

运输方式之间进行分配的问题:需要将给定量的货物从网络中的一个结点运输到另一

个结点,在此网络中存在多种运输方式,每种方式的成本和运输能力均已知。第 10.3节将处理一个战略层次的经典问题,即如何为仓库选址才能够 小化开办仓库和向客

户运输的成本。在 10.4 节中,我们将解决一个 优化燃油运输路径的问题。在第 10.5节中描述了一个多种运输方式组合(联合运输)的问题,此问题与 10.2 节中的问题

的不同之处在于更换运输方式时也会带来一定费用支出。本章的 后一节中将研究一

个如何对整个车队进行规划的问题。

10.1 汽车租赁

有一家小型汽车租赁公司,此公司有 94 辆可供出租的汽车,分布于 10 个代理

点中。每个代理点的位置都将以地理坐标 X 和 Y 的形式给出,单位为千米。我们假

定两个代理点之间的距离约为它们之间欧氏距离(即 短距离)的 1.3 倍。下表给出

了各个代理点的位置坐标,以及第二天早晨汽车租赁的需求量和前一天晚上各个代理

点拥有的汽车数。

表格 10.1:车辆租赁代理点信息

代理点 1 2 3 4 5 6 7 8 9 19

X 坐标 0 20 18 30 35 33 5 5 11 2

Y 坐标 0 20 10 12 0 25 27 10 0 15

汽车需求量 10 6 8 11 9 7 15 7 9 12

当前拥有量 8 13 4 8 12 2 14 11 15 7

假定汽车转运的成本为每辆车每千米 0.50 欧元,请找出如何在各个代理点之间

调度分配汽车才能够满足各处的需求,并且使转运成本 低。

10.1.1 模型的数学表达

对于代理点集合 AGENTS 中的每个代理点 a 我们都用 aX和 aY

表示其地理坐

标。 aREQ表示在代理点 a 处汽车的需求量, aSTOCK

为此代理点当前的汽车保有

Page 209: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

198

量。这两个值之间的差值即表示此处汽车数富余(如果为正数值),或者不足量(负

值)。此问题即找出车辆富余的代理点集合 EXCESS 和车辆不足的代理点集合

NEED 之间的 小费用车辆流。由于总富余量等于总不足量,因此必定存在能够满

足各处需求的车辆流。首先,我们定义变量 abmove表示在两个代理点之间的车辆流:

NEEDb,EXCESSa ∈∈∀ : Nmoveab ∈ (10.1.1)

每个车辆富余的代理点都需要将其富余的车辆发送到别处(10.1.2),每个车辆

不足的代理点都需要从别处接受到数量等于不足数量的车辆(10.1.3)。

EXCESSa∈∀ : aaNEEDb

ab REQSTOCKmove −=∑∈

(10.1.2)

NEEDb∈∀ : bbEXCESSa

ab STOCKREQmove −=∑∈

(10.1.3)

目标函数即 小化总转运成本(10.1.4),其中COST 表示每辆车每转运 1 千米

的成本, abDIST表示在两个代理点a 和b 之间的距离。

minimize ∑ ∑∈ ∈

⋅⋅EXCESSa NEEDb

abab moveDISTCOST (10.1.4)

小费用流问题是一个运输问题(transportation problem),其特征在于都有一

组来源的,拥有数量有限的资源,以及一组需要此资源的目的地。对于 小费用流问

题,通常可以采用单纯形算法求解线性规划从而找到整数解。因此约束条件(10.1.1)可以用简单的非负约束条件取代。

10.1.2 模型实现

上述数学模型可以实现为下面的 Mosel 程序。在读入数据之后,我们首先检查

当前汽车的总保有量是否等于汽车的需求量,如果不相等,则停止此程序。如果相等,

则分别找出车辆富余和车辆不足的代理点集合。在下面声明决策变量数组和距离矩阵

时将用到这两个集合。

model "E-1 Car rental"

uses "mmxprs"

declarations

AGENTS = 1..10 ! 汽车租赁代理点

REQ: array(AGENTS) of integer ! 汽车需求数量

STOCK: array(AGENTS) of integer ! 当前汽车保有量

Page 210: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

199

X,Y: array(AGENTS) of integer ! 租赁代理点位置坐标

COST: real ! 转运一辆汽车每千米成本

NEED: set of integer ! 汽车数不足的代理点

EXCESS: set of integer ! 汽车数富余的代理点

end-declarations

initializations from ‘e1carrent.dat'

REQ STOCK X Y COST

end-initializations

if sum(a in AGENTS) (STOCK(a)-REQ(a)) <> 0 then

writeln("Problem is infeasible")

exit(0)

end-if

! 计算出汽车数富余和汽车数不足的代理点集合

forall(a in AGENTS)

if STOCK(a) -REQ(a) < 0 then

NEED += {a}

elif STOCK(a) -REQ(a) > 0 then

EXCESS += {a}

end-if

finalize(NEED); finalize(EXCESS)

declarations

DIST: array(EXCESS,NEED) of real ! 代理点之间的距离

move: array(EXCESS,NEED) of mpvar ! 代理点之间的汽车转运情况

end-declarations

! 计算代理点之间的距离

forall(a in EXCESS,b in NEED)

DIST(a,b):= 1.3*sqrt((X(a)-X(b))^2 + (Y(a)-Y(b))^2)

! 目标函数:总转运成本

Cost:= sum(a in EXCESS,b in NEED) COST*DIST(a,b)*move(a,b)

! 汽车数富余的代理点

forall(a in EXCESS) sum(b in NEED) move(a,b) = STOCK(a) -REQ(a)

! 汽车数不足的代理点

forall(b in NEED) sum(a in EXCESS) move(a,b) = REQ(b) -STOCK(b)

forall(a in EXCESS,b in NEED) move(a,b) is_integer

Page 211: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

200

! 求解此问题

minimize(Cost)

end-model

在这个模型实现中我们使用了指数运算符^。注意,我们也可以用 r^0.5 来表示

r ,这与使用预定义的 Mosel 函数 sqrt(r)是相同的。

10.1.3 结果

优化器将计算出 低总转运成本为 152.64 欧元。下表列出了达到此 低成本时

在代理点之间转运汽车的具体方案,此方案能够得到我们所需的 终汽车分布。

表格 10.2:车辆转运的 优方案

-> 1 3 4 6 7 10 富余量

2 0 1 0 5 1 0 7

5 0 0 3 0 0 0 3

8 0 0 0 0 0 4 4

9 2 3 0 0 0 1 6

不足量 2 4 3 5 1 5

10.2 选择运输方式

在法国西南部有一家公司,这家公司需要将 180 吨存放于仓库 D1 到 D4 中的化

学产品运输到 3 个回收中心 C1,C2 和 C3。仓库 D1 到 D4 分别储存有 50,40,35,和 65 吨化学产品,总计为 190 吨。可以选用两种运输方式:公路运输和铁路运输。

仓库 D1 只能通过公路向回收中心 C1 和 C2 进行运输,运费分别为 12 欧元/吨和 14欧元/吨。仓库 D2 只能向回收中心 C2 运输,可以选择通过铁路或公路,运费分别为

12 欧元/吨和 14 欧元/吨。仓库 D3 可以通过公路向回收中心 C2 运输(9 欧元/吨),

或通过铁路或公路向回收中心 C3 运输,运费分别为 4 欧元/吨和 5 欧元/吨。仓库 D4可以通过铁路或公路向回收中心 C2 运输,运费分别为 11 欧元/吨和 14 欧元/吨,或

者通过铁路或公路向回收中心 C3 运输,运费分别为 10 欧元/吨和 14 欧元/吨。

此公司与铁路公司签订的化学物品运输合同规定,每次运输量至少应为 10 吨,

多为 50 吨。除了标准的安全规章之外,对公路运输不存在其他特殊的限制。那么

此公司应如何运输这 180 吨化学物品才能够使总运费 低?

10.2.1 模型的数学表达

我们将把此问题建模为一个具有固定总通过量的 小费用流问题(minimum

cost flow problem)。我们先来构造一幅图 ( )ARCS,NODESG = 。首先向结点集合

Page 212: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

201

NODES 中加入一组结点,代表各个仓库,然后再加入一组结点,代表回收中心(参

照图 10.1)。弧集合 ARCS 中包含了在所有仓库和回收中心之间可能存在的连接。运

输方案即对应于图G 中的一个流,即在每一条弧 ( )j,i 上的流 ijflow。弧 ( )j,i 具有一

个 小通过量 ijMINCAP(除铁路运输其他均为 0),一个 大通过量 ijMAXCAP

(即

运力上限,除铁路运输外均为无穷大),以及每吨的运输成本 ijCOST。

从一个仓库到一个处理中心之间的两种运输方式需对应两条不同的弧。在这样的

图中,两个结点之间至多有 p 条弧,称为 p -图。这样的图无法编码为(二维)矩阵:

例如费用矩阵中的元素 ijCOST只能表示一个费用。为将此图转化为两个结点之间至

多有一条弧的图,可以为仓库 i 和处理中心 j 之间的每种运输方式都创建一个假想的

结点。例如,在仓库 D2(结点 3)和处理中心 C1(结点 12)之间存在一条公路连

接和一条铁路连接。为避免生成具有两条弧 ( )123, 的 2-图,我们可以创建一个结点 6

对应于铁路运输,以及一个结点 7 对应于公路运输。则铁路运输即变为路径 ( )1263 ,, ,

公路运输即变为 ( )1273 ,, 。只为弧 ( )63, 和 ( )73, 设置通过量和费用。

Page 213: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

202

图 10.1:运输网络图

在此图中未将仓库的存储量纳入考虑。为此,我们创建一个源结点(假想的结点

1),此结点将用弧 ( )d,1 连接到每个仓库结点 d 上,且此弧的通过量为 dMAXCAP1 ,

对应于仓库 d 处的存储量。因此离开仓库 d 的流不会超过此值。为方便数学模型的

表达,我们也创建一个宿结点(假想的结点 15),并且连接到每个处理中心结点上。

这样 终得到的图即可以表示为图 10.1,其中每条弧 ( )j,i 都对应于一个三元组

( )ijijij COST,MAXCAP,MINCAP 。“-”表示通过量为无穷大。

在此数学模型中包含了流守恒约束条件(10.2.2),也称为 Kirchhoff 定理:每个

结点处的入流都等于此结点处的出流(除了源和宿结点之外)。每条弧上的流都至少

取值为 ijMINCAP(约束条件(10.2.3)),且不超过 大通过量 ijMAXCAP

(约束条

件(10.2.4))。式(10.2.5)对总流量加以约束,即 180=MINQ 吨。这样就迫使离

开源(结点 1)的流总量等于MINQ 。由于在此网络中流保持守恒,因此也可以使

用宿结点的入流总量等于 MINQ 作为约束条件。在这个约束条件中,我们可以将等

Page 214: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

203

号替换为≥号,由于在 小化总成本时也将 小化总流量,因此此时总运输量将取此

下界值。

后要解释一下目标函数(10.2.1)。 ijCOST是每吨的运费成本,因此通过弧

( )j,i 运输的流 ijflow的费用为 ijij flowCOST ⋅

。因此 小化总运费即 小化所有弧

上的总费用。

终,通过定义这样的图,我们可以得到相当简洁的数学模型。注意,在约束条

件(10.2.3)中也隐含给出了变量非负的约束条件。

minimize ( )∑∈

⋅ARCSj,i

ijij flowCOST (10.2.1)

SINK,SOURCEi,NODESi ≠∈∀ : ( ) ( )

∑∑∈∈

=ARCSj,i

ijARCSj,i

ji flowflow (10.2.2)

( ) ARCSj,i ∈∀ : ijij MINCAPflow ≥ (10.2.3)

( ) ARCSj,i ∈∀ : ijij MAXCAPflow ≤ (10.2.4)

( )MINQflow

ARCSi,SOURCEi,SOURCE =∑

(10.2.5)

除了这种基于图的问题数学表达之外,也可以将使用方式m 从仓库 d 运输到目

标 c 的运量表示为决策变量 dcmtrasnport,对每个可能出现的三元组 ( )m,c,d 都建立

这样的决策变量,从而得到另一种问题表达方式。这样总运量就可以表示为所有有定

义的变量 dcmtrasnport的和,目标函数即所有可行的三元组 ( )m,c,d 对应的

dcmdcm trasnportCOST ⋅的和。每种运输方式的 小和 大运力限制将表示为对应变

量 dcmtrasnport的上界和下界约束条件,这一点与上述的(10.2.3)和(10.2.4)很

相似。对于我们这个问题,这种表达方式可能比基于图的模型表达要容易一些。但在

后面的模型实现和进一步的讨论中,我们仍然使用这种更一般的 小费用流模型,即

(10.2.1)到(10.2.5)给出的模型。

10.2.2 模型实现

从这个问题可以引出一个经典的问题,即图的编码。可以将图定义为 NN × 的

矩阵形式,其中 N 为结点总数,并为每对由弧相连的结点 ( )j,i 都定义一个流变量。

然而,对于稀疏图,如我们所使用的这个图,更常用(效率也更高)的方法是将图表

示为弧的列表的形式。在下面的 Mosel 程序实现种就使用了这种表示方法。弧

Page 215: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

204

( )j,ia = 将用标号 a 进行索引,而不是用对应的结点对 ( )j,i 进行索引。弧的列表为

二维数组 A,其中iAa =1 ,

iAa =2 。在读入数据后(即弧集为已知)将定义流变

量。注意在下面的实现中,未采用数字对结点进行编号,而是用名称“Source”,“D2”,“C4”等,这样能够能够方便对结果进行解释。

model "E-2 Minimum cost flow"

uses "mmxprs"

declarations

NODES: set of string ! 结点集合

MINQ : integer ! 运输总量

A: array(ARCS:range,1..2) of string ! 弧

COST: array(ARCS) of integer ! 每条弧的运输成本

MINCAP,MAXCAP: array(ARCS) of integer ! 弧的 小和 大通过量

end-declarations

initializations from ‘e2minflow.dat’

A MINQ MINCAP MAXCAP COST

end-initializations

finalize(ARCS)

! 计算结点集合

NODES:= union(a in ARCS) {A(a,1),A(a,2)}

declarations

flow: array(ARCS) of mpvar ! 弧上的流

end-declarations

! 目标函数:总运输成本

Cost:= sum(a in ARCS) COST(a)*flow(a)

! 流平衡:入流等于出流

forall(n in NODES | n<>"SOURCE" and n<>"SINK")

sum(a in ARCS | A(a,2)=n) flow(a) = sum(a in ARCS | A(a,1)=n) flow(a)

! 小和 大流通过量

forall(a in ARCS | MAXCAP(a) > 0) do

flow(a) >= MINCAP(a)

flow(a) <= MAXCAP(a)

end-do

! 小运输量

Page 216: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

205

sum(a in ARCS | A(a,1)="SOURCE" ) flow(a) >= MINQ

! 求解此问题

minimize(Cost)

end-model

在此模型中使用了另一个 Mosel 集合运算符:对所有由集合 ARCS 中的弧相连

接的结点进行 union(并集)运算从而得到结点集合 NODES。

10.2.3 结果

低运输成本为 1,715 欧元。图 10.2 示意了此时的解决方案:在实际用于运输

的弧上标出了运输量,未使用的弧用虚线表示。例如,仓库 D1 的所有 50 吨库存都

将通过公路运输到回收中心 2。

图 10.2: 优运输方案

应注意到,这种对弧上的流有 小约束的问题可能会无法找到可行解。在本例中,

如果 9=MINQ ,则由于所有铁路运输的弧的 低通过量都是 10 吨,因此无法使用

铁路运输。

Page 217: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

206

10.2.4 扩展讨论

这个模型可以用于求解任何类型的 小费用流问题。例如,可以为各个回收中心

设置需求量。对于回收中心 c ,可以将弧 ( )ksin,c 的流 小值设置为此需求量,从而

保证能够满足需求。但是,若要求有解,则必须满足一个条件:仓库处的产品的可用

量总和须大于或等于回收中心的需求量总和。

10.3 仓库位置设置

有一家大公司希望开设一些新的仓库,以向销售中心供货。每开设一个新仓库都

有一些固定费用。货物将从仓库运输到附近的销售中心。每次运输的运费取决于运输

的距离。这两种类型的费用非常不同:仓库开设费用属于投资支出,通常在若干年后

将勾销,而运输费用属于运营成本。如何结合这两种费用不属于本书的讨论范围,我

们假定这两种费用可比,为此可能需要以年为单位计算运营费用。

有 12 个可以建造新仓库的位置,并且需要从这些仓库向 12 个销售中心供货。

下表 10.3 给出了每个仓库完全满足每个客户(销售中心)需求所需的总成本(千

欧元,不是单位成本)。因此,例如从仓库 1 向客户 9(根据表 10.5 可以看到此客户

总需求量为 30 吨)供货的单位成本为 60000 欧元/30 吨,即 2000 欧元/吨。如果无

法进行送货,则对应的成本标记为无穷大∞。

表格 10.3:满足客户需求所需的运输成本

客户

仓库 1 2 3 4 5 6 7 8 9 10 11 12

1 100 80 50 50 60 100 120 90 60 70 65 110

2 120 90 60 70 65 110 140 110 80 80 75 130

3 140 110 80 80 75 130 160 125 100 100 80 150

4 160 125 100 100 80 150 190 150 130 ∞ ∞ ∞5 190 150 130 ∞ ∞ ∞ 200 180 150 ∞ ∞ ∞6 200 180 150 ∞ ∞ ∞ 100 80 50 50 60 100

7 100 80 50 50 60 100 120 90 60 70 65 110

8 120 90 60 70 65 110 140 110 80 80 75 130

9 140 110 80 80 75 130 160 125 100 100 80 150

10 160 125 100 100 80 150 190 150 130 ∞ ∞ ∞11 190 150 130 ∞ ∞ ∞ 200 180 150 ∞ ∞ ∞12 200 180 150 ∞ ∞ ∞ 100 80 50 50 60 100

此外,对每个仓库,还有如下信息:仓库建设的固定费用(需要计入目标函数)

和仓库的容量上限,这些信息都列于表 10.4 中。

表格 10.4:仓库建设费用和容量限制

仓库 1 2 3 4 5 6 7 8 9 10 11 12

建设费用 3500 9000 10000 4000 3000 9000 9000 3000 4000 10000 9000 35000

容量上限 300 250 100 180 275 300 200 220 270 250 230 180

Page 218: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

207

表 10.5 列出了各个销售中心(客户)的需求量。

表格 10.5:客户需求量数据

客户 1 2 3 4 5 6 7 8 9 10 11 12

需求量 120 80 75 100 110 100 90 60 30 150 95 120

任何时候都要保证满足客户需求,可以从多个仓库向同一个客户送货。应在哪些

位置开办仓库才能使总的建设成本以及运输成本 低,同时仍然能够满足所有客户需

求?

10.3.1 模型的数学表达

为写出此问题的数学模型,我们用变量 cDEM表示客户(销售中心) c 的需求

量,用 dCAP表示仓库 d 的 大容量。建造仓库 d 的固定费用为 dCFIX

,从仓库 d 向

客户 c 运输一吨货物的运输成本为 cdCOST。此外,令 DEPOTS 为所有可建造仓库

的位置的集合,CUST 为将要向其进行送货的客户集合。

为求解此问题,我们需要了解将要在哪些位置开办仓库。因此可以定义一个二值

变量 dbuild,如果在位置 d 处开办了仓库,则 dbuild

取值为 1,否则为 0。此外,

我们也需要知道有哪个或哪些仓库向某个客户供货。因此我们引入变量 dcfflow,表

示客户 c 从仓库 d 那里接受到的货物量占总需求量的比例。这些变量的取值范围为

[0,1],因此可以得到约束条件(10.3.1)。

CUSTc,DEPOTSd ∈∈∀ : 1≤dcfflow (10.3.1)

每个客户的需求都应完全满足:

CUSTc∈∀ : 1=∑∈DEPOTSd

dcfflow (10.3.2)

现在我们需要建模表示出离开仓库 d 的货物总量不可超过此仓库的总容量

dCAP,但如果此仓库尚未修建,则此流为 0。因此有约束条件(10.3.3)。

DEPOTSd ∈∀ : ddCUSTc

dcc buildCAPfflowDEM ⋅≤⋅∑∈

(10.3.3)

现在我们来看看为什么可以这样表示。由于 dcfflow是客户 c 从仓库 d 那里收到

Page 219: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

208

的货物占其总需求量的比例,因此 dcc fflowDEM ⋅就是客户 c 从仓库 d 那里收到的货

物量。如果仓库 d 已经开办(1=dbuild),则从仓库 d 流出的货物总量不能超过

dCAP;如果仓库 d 尚未开办(

0=dbuild),则此货物出流值必须为 0。

要 小化的总成本由仓库建设费用和运输费用两部分组成。即目标函数(10.3.4)由两个求和组成。这样完整的数学模型就可以写成:

minmize ∑ ∑∑∈ ∈∈

⋅+⋅DEPOTSd CUSTc

dcdcDEPOTSd

dd fflowCOSTbuildCFIX (10.3.4)

CUSTc,DEPOTSd ∈∈∀ : 1≤dcfflow (10.3.5)

CUSTc∈∀ : 1=∑∈DEPOTSd

dcfflow (10.3.6)

DEPOTSd ∈∀ : ddCUSTc

dcc buildCAPfflowDEM ⋅≤⋅∑∈

(10.3.7)

CUSTc,DEPOTSd ∈∈∀ : 0≥dcfflow (10.3.8)

DEPOTSd ∈∀ : Nbuildd ∈ (10.3.9)

10.3.2 模型实现

上述数学模型可以很容易地改写为如下的 Mosel 程序。

model "E-3 Depot location"

uses "mmxprs"

declarations

DEPOTS = 1..12 ! 仓库集合

CUST = 1..12 ! 客户集合

COST: array(DEPOTS,CUST) of integer ! 运输成本

CFIX: array(DEPOTS) of integer ! 仓库建设固定成本

CAP: array(DEPOTS) of integer ! 仓库容量

DEM: array(CUST) of integer ! 客户需求量

fflow: array(DEPOTS,CUST) of mpvar ! 仓库供货量占客户需求总量百分比

build: array(DEPOTS) of mpvar ! 如果选择在某处建造仓库,则取值为 1

! 否则为 0

end-declarations

initializations from ‘e3depot.dat’

Page 220: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

209

COST CFIX CAP DEM

end-initializations

! 目标函数:总成本

TotCost:= sum(d in DEPOTS, c in CUST) COST(d,c)*fflow(d,c) +

sum(d in DEPOTS) CFIX(d)*build(d)

! 满足客户需求

forall(c in CUST) sum(d in DEPOTS) fflow(d,c) = 1

! 仓库容量限制

forall(d in DEPOTS) sum(c in CUST) DEM(c)*fflow(d,c) <= CAP(d)*build(d)

forall(d in DEPOTS) build(d) is_binary

forall(d in DEPOTS, c in CUST) fflow(d,c) <= 1

! 求解此问题

minimize(TotCost)

end-model

我们可以再加入一组约束条件来描述关系“如果从仓库 d 有货物运出,则应该修

建此仓库”(以及其相反关系“如果仓库 d 未修建,则从此仓库没有货物运出”)。约

束条件(10.3.3)隐含表示了此关系,但我们加入的新约束条件(分离出的约束条件)

能够使模型表达更紧密。即,向模型中加入了这些约束条件之后,线性规划松弛求解

的结果将更接近混合整数规划的解。可以向模型直接加入这些新的约束条件,但由于

在上面的程序中已经完整地给出了此模型,因此我们可以将这些约束条件转化为下面

所示的模型剪辑(model cuts)形式。通过将这些变量表示为模型剪辑,我们可以让

优化器来决定是否使用这些附加的约束条件。以,用作模型剪辑的约束条件都应进行

命名,并在 Mosel 程序中进行全局声明,如下所示(Mosel 程序中线性约束条件的

类型未 linctr)。

declarations

modcut: array(DEPOTS,CUST) of linctr

end-declarations

forall(d in DEPOTS, c in CUST) do

modcut(d,c):= fflow(d,c) <= build(d)

setmodcut(modcut(d,c))

end-do

Page 221: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

210

10.3.3 结果

优化算法求得 低总成本为 18,103 千欧元。应在五个位置开设仓库,即位置 1,5,8,9,12。下表列出了从这些仓库向客户送货的方案。除了位置 5 上的仓库之外,

其他仓库都完全利用了库存能力。

表格 10.6:运输方案

客户

仓库 1 2 3 4 5 6 7 8 9 10 11 12

1 - 5 75 100 - - - - - - - 120

5 120 40 - - - - - - - - - -

8 - 35 - - - 100 - - - 85 - -

9 - - - - 110 - - - - 65 95 -

12 - - - - - - 90 60 30 - - -

10.4 燃油运输

有一个运输商需要将一些燃油从位于 Donges 的炼油厂运输到法国西部的一些

客户那里。这些客户分别位于 Brain-sur-l΄Authion,Craquefou,Guérande,Haie Fouassière,Mésanger,和 Ponts-de-Cé。下表列出了每个地方的需求量升数。

表格 10.7:客户需求量(升)

Brain-sur-

l΄Authion

Craquefou Guérande Haie

Fouassière

Mésanger Ponts-de-Cé

14000 3000 6000 16000 15000 5000

下面这个表中列出了炼油厂与客户之间的距离。

表格 10.8:距离矩阵(千米)

Donges

Brain-

sur-

l΄Authion

Craquefou GuérandeHaie

Fouassière Mésanger

Ponts-

de-Cé

Donges 0 148 55 32 70 140 73

Brain-sur-l΄Authion 148 0 93 180 99 12 72

Craquefou 55 93 0 85 20 83 28

Guérande 32 180 85 0 100 174 99

Haie Fouassière 70 99 20 100 0 85 49

Mésanger 140 12 83 174 85 0 73

Ponts-de-Cé 73 72 28 99 49 73 0

此运输公司使用容量为 39000 升的油罐车进行运输。请选择运输路线,使向所

有客户运输的总里程数 少。

Page 222: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

211

10.4.1 模型的数学表达

这个问题可以看作注明的旅行商问题(TSP)的推广形式,我们在第 11.5 节中

将看到旅行商问题的另一个例子。在这个例子中,我们有多个“旅行商”,每个“旅

行商”的行程都需要从 Donges 出发,并 后回到 Donges。

我们引入变量 ijprec ,如果在路线中城市 j 紧随城市 i ,则此变量取值为 1,否

则为 0。令 { }NS,,SITES K1= 为地点集合。地点 1 即为此炼油厂,因此可以得到一

个子集 { }NS,,CLIENTS K2= ,对应于我们送货的目标地点。令 ijDIST 为两个城市

i 和 j 之间的距离, iDEM 为客户 i 定购的燃油数量,CAP为油罐车的容量上限。此

外也加入变量 iquant ,表示在通往客户 i 的路径上送出去的燃油总量,包括给客户 i

的燃油量。例如如果包含客户 10 的路径为 1,3,11,10,6,1,则 10quant 的值即

为 10113 DEMDEMDEM ++ 。借助于这些符号,我们可以写出如下的数学模型:

minmize ∑ ∑∈ ≠∈

⋅CLIENTSi ji,SITESj

ijij precDIST (10.4.1)

CLIENTSj∈∀ : 1=∑≠∈ ji,SITESi

ijprec (10.4.2)

CLIENTSi∈∀ : 1=∑≠∈ ij,SITESj

ijprec (10.4.3)

CLIENTSi∈∀ : CAPquantDEM ii ≤≤ (10.4.4)

CLIENTSi∈∀ : ( ) iii precCAPDEMCAPquant 1−+≤ (10.4.5)

ji,CLIENTSj,i ≠∈∀ :

( ) jiij

ijjij

precDEMDEMCAP

precCAPCAPDEMquantquant

⋅−−

+⋅+−+≥ (10.4.6)

CLIENTSi∈∀ : 0≥iquant (10.4.7)

ji,SITESj,i ≠∈∀ : { }10,precij ∈ (10.4.8)

此问题的目标函数是(10.4.1),即 小化总里程数。应向每个客户送货一次,

即有约束条件(10.4.2)和(10.4.3),送货车辆只进入和离开每个城市一次(仓库

除外)。

Page 223: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

212

数量 iquant 必须至少等于客户 i 的定购量,且应不超过油罐车的容量上限CAP

(10.4.4)。

此外,如果客户 i 是路径上的第一个客户,则 iquant 就等于此客户的定购量。此

约束条件可以表示为式(10.4.4)和(10.4.5)。实际上,如果 i 是路线上的第一个客

户,则 iprec1 取值为 1,因此约束条件(10.4.5)可以化简为(10.4.9)。

ii DEMquant ≤ (10.4.9)

从(10.4.9)到(10.4.4)可以看到, iquant 等于客户 i 的需求量。如果 i 不是

路径上的第一个客户,则 iprec1 为 0,约束条件(10.4.5)等价于约束条件(10.4.10),

由于在(10.4.4)中已经表示出了此关系,因此这个约束条件是多余的。

CAPquanti ≤ (10.4.10)

现在考虑 i 不是路径上的第一个客户的情形。此时 iquant 必须等于在炼油厂和客

户 i 之间向所有客户送出的燃油总量。这表示如果在路线中客户 j 是客户 i 之后的下

一个客户,则我们可以得到 jquant 必须等于从炼油厂到客户 i 送出去的燃油总量加

上 j 的订货量。此关系可以表示为约束条件(10.4.6)。如果在路线中客户 j 紧随客

户 i 之后,则 ijprec 为 1, jiprec 为 0,因此约束条件(10.4.6)可以化为(10.4.11)。

jij DEMquantquant +≥ (10.4.11)

如果 j 和 i 之间还有其他客户,则约束条件(10.4.6)仍然正确。如果 j 为 i 的前

一个客户,则约束条件(10.4.6)变为(10.4.12)。

iij DEMquantquant −≥ (10.4.12)

这个约束条件意味着从炼油厂到 j 为止送出的燃油总量必须不小于从炼油厂到

j 之后的下一个客户 i 为止送出的燃油总量减去客户 i 的订货量。如果 j 是 i 之前的第

一个客户,则 i 就是 j 之后的第一个客户。因此可以通过交换(10.4.11)中的索引值,

得到约束条件(10.4.13)。

iji DEMquantquant +≥ (10.4.13)

约束条件(10.4.12)和(10.4.13)组合起来即等价于(10.4.14)。

Page 224: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

213

iji DEMquantquant += (10.4.13)

如果在送货路径中 i 和 j 不相邻,则可以得到约束条件(10.4.15)。由于此不等

式右边的项小于或等于 jDEM ,因此这个约束条件也可以包含在约束条件(10.4.4)

中,即这个约束条件是冗余的。

CAPDEMquantquant jij −+≥ (10.4.15)

终,约束条件(10.4.7)和(10.4.8)将保证变量 iquant 为非负值,且 ijprec

为二值变量。

图 10.3:一种不可行解

后我们要指出,为每个结点 i 定义一个变量 iquant 将能够保证油罐车载荷不超

过容量上限,同时使不包含仓库的路线成为不可行。如果没有这些变量,则可能会出

现如图 10.3 所示的解。

在这个解中,油罐车只进入和离开每个结点个一次,因此能够满足约束条件

(10.4.2)和(10.4.3);但是由于路线不通过炼油厂,因此此解不可行。为路线上

的每个结点定义严格递增的变量 iquant 将能够避免出现这种解。

10.4.2 模型实现

下面的 Mosel 程序实现了上述(10.4.1)-(10.4.8)的数学模型。

model "E-4 Oil delivery"

uses "mmxprs"

declarations

NS =7

SITES = 1..NS ! 地点集合,1 为炼油厂,2 到 NS 为客户

Page 225: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

214

DEM: array(SITES) of integer ! 需求量

DIST: array(SITES,SITES) of integer ! 地点之间的距离

CAP: integer ! 油罐车容量

prec: array(SITES,SITES) of mpvar ! 如果 i 是 j 的前一个客户,则为 1,否则为 0

quant: array(CLIENTS) of mpvar ! 到 i 为止送出的燃油总量

end-declarations

initializations from 'e4deliver.dat'

DEM DIST CAP

end-initializations

! 目标函数:总行驶里程

Length:= sum(i,j in SITES | i<>j) DIST(i,j)*prec(i,j)

! 每个城市只进入和离开各一次(仓库除外)

forall(j in CLIENTS) sum(i in SITES| i<>j) prec(i,j) = 1

forall(i in CLIENTS) sum(j in SITES| i<>j) prec(i,j) = 1

! 如果 i 为路线上的第一个客户,则 quant(i)=DEM(i)

forall(i in CLIENTS) quant(i) <= CAP + (DEM(i)-CAP)*prec(1,i)

! 如果 j 是路线上 i 之后的第一个客户,则 quant(j)大于或等于到 i 为止送出的燃油总量加上应送给

客户 j 的燃油总量(为避免循环并保证不超过油罐车容量)

forall(i,j in CLIENTS| i<>j) quant(j) >= quant(i) + DEM(j) -CAP +

CAP*prec(i,j) + (CAP-DEM(j)-DEM(i))*prec(j,i)

forall(i in CLIENTS) do

quant(i) <= CAP

quant(i) >= DEM(i)

end-do

forall(i,j in SITES | i<>j) prec(i,j) is_binary

! 求解此问题

minimize(Length)

end-model

可以再定义一组约束条件,要求 iquant 大于或等于运输给客户 i 及路线上所有位

于 i 之前的客户的燃油总量。这些约束条件有助于改善非路线首客户的客户 i 对应的

变量 iquant 的下界。由于上述程序代码已经完整阐述了这个模型,因此我们可以将

Page 226: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

215

这些新加的约束条件作为模型剪辑(model cut),让优化器来决定是否使用这些约束

条件。用作模型剪辑的约束条件都应进行命名,并且在 Mosel 程序中进行全局定义。

declarations

modcut: array(CLIENTS) of linctr

end-declarations

forall(i in CLIENTS) do

modcut(i):= quant(i) >= DEM(i) + sum(j in SITES| i<>j) DEM(j)*prec(j,i)

setmodcut(modcut(i))

end-do

10.4.3 结果

优解由两条运输路线组成。一条路线将运输总量为 22000 升的燃油,先到

Guérande,然后到 Haie Fouassière。第二条路线首先去 Mésanger,然后依次到

Brain-sur-l΄Authion,Ponts-de-Cé,和 Craquefou,总计运输 37,000 升燃油。运输

总里程为 497 千米。

10.5 组合各种不同运输方式

有 20 吨货物需要沿着一条路径运输到五个城市,可以选择三种不同的运输方式:

铁路,公路,和航空运输。在三个位于路途中间的城市里可以更改运输方式,但是在

相邻的两个城市之间只能采取一种运输方式。表 10.9 列出了在每一对城市之间运输

1 吨货物的成本。

表格 10.9:不通运输方式的成本

城市

1-2 2-3 3-4 4-5

铁路 30 25 40 60

公路 25 40 45 50

航空 40 20 50 45

下面的表(10.10)列出了在更换运输方式时每吨货物需要的额外支出。此支出

与地点无关。

表格 10.10:更换运输工具费用

从...转换为... 铁路 公路 航空

铁路 0 5 12

公路 8 0 10

航空 15 10 0

应选择怎样的运输方案才能使总成本 小?

Page 227: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

216

10.5.1 模型的数学表达

令MODES 为可选的运输工具集合。相邻城市之间的连接称为路径的一段,则

所有路径段的集合 LEGS 即表示了完整的运输路线。令 mlCTRANS 为在路径段 l 上

使用运输工具m 的运费, mnCCHG 为将从运输工具m 转换到运输工具 n 的费用,在

我们的例子中此值与具体在哪个城市里进行更换无关。我们需要两种类型的二值变

量,以处理这两种类型的费用:第一组变量 mluse (10.5.1),当在路径段 l 上采用的

运输工具为m 时,则 mluse 取值为 1,否则为 0;第二组变量 mnlchange (10.5.2),

如果在路径的第 l 段和第 1+l 段之间将运输工具从m 换为 n ,则 mnlchange 取值为 1。

LEGSl,MODESm ∈∈∀ : { }10,useml ∈ (10.5.1)

{ }11 −∈∈∀ NL,,l,MODESn,m K : { }10,changemnl ∈ (10.5.2)

在路径的每段上都只能采用一种类型的运输工具,因此有(10.5.3)。

LEGSl ∈∀ : 1=∑∈MODESm

mluse (10.5.3)

在路径中间的每个城市都只能更换一次运输工具,即有(10.5.4)。在这个例子

中,如果若交接前后交通工具为同一种类型,则不会带来额外支出,这是由于这时货

物将保持在同一个运输工具上,因此不会有搬运的费用。当然现实中将货物从一个运

输工具上搬到同一类型的另一个运输工具上也会带来一些额外支出,但我们不考虑这

种情形。

{ }11 −∈∀ NL,,l K : 1=∑∈MODESn,m

mnlchange (10.5.4)

在路径的第 l 段和第 1+l 段之间的城市中,我们将运输工具类型从m 变为 n(命

题 A),当且仅当第 l 段使用的交通工具为m ,第 1+l 段使用的交通工具为 n (命题

B)。约束条件(10.5.5)即给出了A→B的推导关系的线性表达式:如果 1=mnlchange ,

则 1=mluse ,且 11 =+l,nuse 。如果只考虑约束条件(10.5.5),那么理论上可能出现

1=mluse , 11 =+l,nuse ,而 0=mnlchange 的情况,但约束条件(10.5.4)排除了这

种情况。

{ }11 −∈∈∀ NL,,l,MODESn,m K : mnll,nml changeuseuse ⋅≥+ + 21 (10.5.5)

也可以将这些约束条件表达为(10.5.6)和(10.5.7)。

Page 228: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

217

{ }11 −∈∈∀ NL,,l,MODESn,m K : mnlml changeuse ≥ (10.5.6)

{ }11 −∈∈∀ NL,,l,MODESn,m K : mnll,n changeuse ≥+1 (10.5.7)

这些约束条件更强:它们比约束条件(10.5.5)能够排除更多的情形,但代价是

定义的约束条件数也是原先的两倍。

目标函数为(10.5.8),单位是元/吨,即各段路径上的运输费用(取决于所使用

的交通工具)与在中间城市更换运输工具的费用的和。

minimize

∑ ∑ ∑∑ ∑∈ ∈

=∈ ∈

⋅+⋅MODESm MODESn

NL

lmnlmn

MODESm LEGSlmlml changeCCHGuseCTRANS

1

1

(10.5.8)

10.5.2 模型实现

可以将上述数学模型转化为如下的 Mosel 程序。在这个模型实现中使用了较弱

的约束条件(10.5.5)。

model "E-5 Combined transport"

uses "mmxprs"

declarations

NL =4

LEGS = 1..NL ! 路径分段数

MODES: set of string ! 运输工具类型

CTRANS: array(MODES,LEGS) of integer ! 运费

CCHG: array(MODES,MODES) of integer ! 更换运输工具的费用

end-declarations

initializations from ‘e5combine.dat’

CTRANS CCHG

end-initializations

finalize(MODES)

declarations

use: array(MODES,LEGS) of mpvar ! 使用对应的运输工具时为 1,否则为 0

change: array(MODES,MODES,1..NL-1) of mpvar ! 如果在一段路径后从运输工具

! m 更换到运输工具 n,则为 1

! 否则为 0

end-declarations

Page 229: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

218

! 目标函数:运输总成本

Cost:= sum(m in MODES, l in LEGS) CTRANS(m,l)*use(m,l) +

sum(m,n in MODES,l in 1..NL-1) CCHG(m,n)*change(m,n,l)

! 每段路径只能采用一种运输工具

forall(l in LEGS) sum(m in MODES) use(m,l) = 1

! 在每两段路径之间更换运输工具或保持不变

forall(l in 1..NL-1) sum(m,n in MODES) change(m,n,l) = 1

! 所使用和更换的运输工具之间的关系

forall(m,n in MODES,l in 1..NL-1) use(m,l) + use(n,l+1) >= 2*change(m,n,l)

forall(m in MODES, l in LEGS) use(m,l) is_binary

forall(m,n in MODES,l in 1..NL-1) change(m,n,l) is_binary

! 求解此问题

minimize(Cost)

end-model

10.5.3 结果

优化器求出 小总成本为 104 元/吨。此成本包括 100 元/吨的运费和 4 元/吨的

更换运输工具支出。下表列出了详细的结果。

表格 10.11:使用的运输工具及费用支出

1-2 更换运输工具 2-3 更换运输工具 3-4 更换运输工具 4-5

运输工具 铁路 铁路 铁路 公路

支出(元/吨) 30 0 25 0 40 5 50

10.6 货车车队规划

有一个连锁商店从不同的汽车租赁商那里租赁货车,从而组成一支车队。此公司

预测未来六个月内的货车的需求如下(表 10.12):

表格 10.12:六个月内的货车需求量

一月 二月 三月 四月 五月 六月

430 410 440 390 425 450

在一月,此连锁店有 200 辆货车,这些货车的租借期将在二月底结束。

为满足需求,此连锁店可以选择三种类型的租赁合同,每个合同都将在每个月 1日生效,这些合同为:三个月的租赁合同,每辆车租金总计 1700 元;4 个月的租赁

合同,每辆车租金总计 2200 元;以及 5 个月的租赁合同,每辆车租金总计 2600 元。

Page 230: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

219

此公司每个月应签订每种类型的合同各多少份才能够满足业务需要,并使总支出

小,且在六月结束时所有车辆租赁期都结束?

图 10.4:第 5 个月(五月)内仍然在租赁期的车辆

10.6.1 模型的数学表达

令 MINIT 为在规划期开始时已经租有的货车数量。我们可以定义整数变量

cmrent , 代 表 在 m 月 月 初 ( { }61 ,,MONTHSm K=∈ ) 时 类 型 为 c

( { }543 ,,CONTRc =∈ )的合同的签订数量。为便于写出模型,首先逐一表示出各

个月的约束条件。例如我们来看看图 10.4 所示的五月的约束条件:此时仍然在租赁

期内的合同可以为一月签订的 5 个月长的合同,二月签订的 4 或 5 个月长的合同,

三月签订的 3 或 4 个月长的合同,四月签订的 3 个月长的合同。这些合同必须能够

满足五月所要求的 425 辆货车的要求。注意,为满足在六月结束时所有合同都到期

的要求,因此在三月不能签订长为 5 个月的合同,在五月不能签订任何合同,等等。

1=m : 430514131 ≥+++ rentrentrentMINIT

2=m : 410524232514131 ≥++++++ rentrentrentrentrentrentMINIT

3=m : 4404333524232514131 ≥+++++++ rentrentrentrentrentrentrentrent

4=m : 3903443335242325141 ≥+++++++ rentrentrentrentrentrentrentrent

5=m : 425344333524251 ≥++++++ rentrentrentrentrentrent

6=m : 450344352 ≥++ rentrentrent

可以将这些约束条件写成更为一般的形式。令 NM 表示月份总数, cCOST 为租

Page 231: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

220

赁期为 c 的每份合同金额, mREQ 为在m 月的货车需求量。

minmize ∑ ∑∈ ∈

⋅CONTRc MONTHSm

cmc rentCOST (10.6.1)

21,m∈∀ : ( )

( )

∑ ∑∈

+−

+−=

≥+CONTRc

cNM,mmin

cm,maxnmcn REQrentMINIT

1

11 (10.6.2)

NM,,m K3=∀ : ( )

( )

∑ ∑∈

+−

+−=

≥CONTRc

cNM,mmin

cm,maxnmcn REQrent

1

11 (10.6.3)

MONTHSm,CONTRc ∈∈∀ : Nrentcm ∈ (10.6.4)

则目标函数为(10.6.1),即 小化签订的所有合同的总成本。一份合同租赁期

为 c 个月,因此为满足月份 m 内的货车需求,应在 ( )11 +− cm,max 月到

( )1+− cNM,mmin 月内签订合同。约束条件(10.6.3)指定从三月开始,应由每个

月所使用的货车都应来自于规划期内签订的合同。对于1月和2月,约束条件(10.6.2)即表明可以使用 初提供的数量为MINIT 的货车。

约束条件(10.6.4)是对这些变量的整数性约束。根据线性规划理论,可以得出

此数学规划模型等同于 小费用流问题,而 小费用流问题在取得(线性) 优值时

具有整数可行解。因此可以将约束条件(10.6.4)替换为简单的非负条件。

10.6.2 模型实现

在下面的 Mosel 程序中,可以将此数学模型的约束条件(10.6.2)和(10.6.3)合并为一个语句。

model "E-6 van rental"

uses "mmxprs"

declarations

NM =6

MONTHS = 1..NM ! 月份

CONTR = 3..5 ! 合同类型

REQ: array(MONTHS) of integer ! 每月需求量

COST: array(CONTR) of integer ! 每种合同金额

NINIT: integer ! 规划期开始时可用的货车数量

rent: array(CONTR,MONTHS) of mpvar ! 每个月新租赁的货车量

end-declarations

Page 232: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

221

initializations from ‘e6vanrent.dat'

REQ COST NINIT

end-initializations

! 目标函数:总成本

Cost:= sum(c in CONTR, m in MONTHS) COST(c)*rent(c,m)

! 满足每月需求量

forall(m in MONTHS)

if(m<=2, NINIT, 0) +

sum(c in CONTR, n in maxlist(1,m-c+1)..minlist(m,NM-c+1)) rent(c,n) >=

REQ(m)

! 求解此问题

minimize(Cost)

end-model

在上述模型实现中,我们使用 Mosel 函数 maxlist 和 minlist 来分别计算一组数

据的 大值和 小值。此例中这些函数每次只使用两个数字作为参数,但通常情况下

这些数据列表可以包含任意多的有限个数值,例如 maxlist(2, -10, A(3), B(7, -5))(其

中 A 和 B 都为整数或实数数组)。不应将这两个函数与集合运算 max 和 min 混淆,

后者功能与这两个函数相似,但用于对集合进行运算,例如 max(i in ISET) A(i)(A是一个由 ISET 索引的整数或实数数组)。

10.6.3 结果

优化算法求得 小总成本为 1,261,000 元。下表列出了每个月应签订的新合同和

每个月货车总租赁数。

表格 10.13:货车租赁方案

新合同 一月 二月 三月 四月 五月 六月

3 月期 230 0 0 240 0 0

4 月期 0 0 210 0 0 0

5 月期 0 0 0 0 0 0

总车数 430 430 440 450 450 450

注意,在现实实践中,很少会有七月初不再有车辆在租赁期这样的要求。

10.7 参考文献和进阶阅读

在第 10.1 节(汽车租赁)中,可用量等于总需求量。如果实际情况不对称,如

可提供量高于需求量,则需要将约束条件(10.1.2)修改为不等式形式,以保证所有

供应方提供的资源都不会超出自己的拥有量。在发明线性规划之前,1930 年代和

Page 233: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

222

1940 年代已经有人对运输问题展开了研究,如美国的 Hitchcock[Hit41],苏联的

Kantorovitch。对此问题有一些非常有效的专用解法,如垫脚石算法(stepping stone algorithm)[BJ90]。

在 10.2 节讨论了选择运输方式的问题,它是一个在图中寻找 小费用流的问题。

对此问题已经有了一些直接对图进行运算的快速算法。Busacker 和 Gowen 提供了

一种性能/复杂度权衡较好的算法,在[Pri94a]中给出了此算法的 Pascal 源码。

Ahujaetal 也给出了另外一些算法[AMO93]。

10.3 节讨论了仓库位置选择的问题,它是一个混合整数问题,并且运输量为连

续变量,仓库建造决策为二值变量。即使仓库容量无限,这个问题仍然是一个 NP-hard问题。基于树的算法能够解决一定规模以下的此类问题(100 个客户),如 Erlenkotter的算法[Erl78]。Daskin 的著作中研究了很多其他的位置选择问题的[Das95]。

第 10.4 章讨论的燃油运输问题是车辆路径问题(vehicle routing problem,VRP)的一个典型例子。我们给出的问题表达只适用于较小规模的问题(20-30 个客户)。

有一些专用的树搜索方法能够对客户树不超过 100 的问题求解出 优值

[LDN84][BMR94],即使对于送货只能在特定的时间窗口中进行的情况也能取得很好

结果[DDS92]。对于客户数目超过 100 个的问题,建议使用启发式算法,如 Clarke和 Wright 的方法[CW64]。Christofides 在[CMT79b]中给出了对经典启发式算法的综

述。元启发算法,如禁忌搜索,在求解较大规模的问题也能找到很好的解[GHL94]。

在 10.5 节对联合运输问题进行了数学规划,但当城市数目以及运输方式数目较

大时,需要使用的变量数目也急剧增长。幸运的是,此问题可以使用动态规划方法(一

种递归优化方法)进行有效求解[Kas98]。我们所给出的案例相对较为简单,在其中

只有一条路径可以选择。如果是任意的图,那么这个问题就会变得非常之难。

10.6节中的货车车队规划问题与第14章的人员安排问题都属于在一个时期内的

需求可以用多个时期内的资源来满足的这类优化问题。这类问题还有例如怎样将任务

分配到若干个工作时间有限的人身上等等。在此问题对应的数学模型中,列内有很多

连续的取值为 1 的系数。可以证明此类问题等同于 小费用流问题[AMO93]。

Page 234: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

223

第 11 章 航空运输

航空运输业是许多优化问题的温床,其中不乏一些很困难的问题。航空公司之间

的激烈竞争促进了各个航空公司的运筹部门的发展,尤其是那些 大的航空公司(如

美国航空公司,德尔塔航空公司,英国航空公司等,以及 近法国航空公司的运筹部

门也开始复兴)。本章将介绍这一领域中运筹学的多种应用,包括旅客流,机组人员,

航班调度,枢纽(hub)选址,以及航线安排等。

在第一个问题(11.1 节)中,需要对进场和离场飞机进行安排,以 小化需要

更换飞机的旅客(以及行李)数目。第 11.2 节中的问题研究如何根据各种兼容性和

表现来安排机组人员。第 11.3 节描述了一个有趣的航空运输业的原创问题,即对飞

机的降落顺序进行调度。在第 11.4 节中将处理网络结构(航空枢纽选择)的问题。

第 11.5 节的主题是紧急情况下的物流配送问题(向遭受灾害袭击的国家提供补给

品)。

11.1 机场航班连接

SafeFlight 航空公司使用戴高乐机场作为中转枢纽,以 小化与欧洲各个目的地

之间的航班连接数。从上午 11 点到下午 12 点 30 分之间有六架分别来自波尔多,克

莱蒙-费朗,马赛,南特,尼斯,以及图卢兹的福克 100 型飞机将要在这里降落。这

些飞机将要去往柏林,波恩,布鲁塞尔,伦敦,罗马,和维也纳,离场时间在下午

12 点 30 分到 13 点 30 分之间。表 11.1 列出了各个航班的旅客转机情况。

表格 11.1:不同航班之间换乘旅客数目

去往

柏林 波恩 布鲁塞尔 伦敦 罗马 维也纳

来自 波尔多 35 12 16 38 5 2

克莱蒙-费朗 25 8 9 24 6 8

马赛 12 8 11 27 3 2

南特 38 15 14 39 2 9

尼斯 - 9 8 25 10 5

图卢兹 - - - 14 6 7

例如,如果从波尔多来的飞机继续飞往柏林,则当在巴黎降落时,其中 35 名旅

客及其携带的行李可以继续待在飞机上,不需换非机。从尼斯来的飞机到达得太晚,

不能继续用于飞往柏林,从图卢兹飞来的飞机与之相似,也无法用于飞往柏林,波恩,

和布鲁塞尔(在上表中对应栏目标记为-)。

应重新安排这些降落的飞机各执行哪一个离场航班才能够使需要换飞机的乘客

数 少?

Page 235: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

224

11.1.1 模型的数学表达

令 PLANES 为飞机集合(其数目等于航班起点和终点数), ijPASS 为在机场中

从来源地 i 转到目的地 j 的乘客数。我们引入二值变量 ijCONT ,当且仅当来自来源

地 i 的飞机继续飞往目的地 j 时此变量取值才为 1。这样就可以将此问题表示为下面

的线性规划形式:

maximize ∑ ∑∈ ∈

⋅PLANESi PLANESj

ijij contPASS (11.1.1)

PLANESj∈∀ : 1=∑∈PLANESi

ijcont (11.1.2)

PLANESi∈∀ : 1=∑∈PLANESj

ijcont (11.1.3)

PLANESj,i ∈∀ : { }10,contij ∈ (11.1.4)

初始的目标是 小化需要更换飞机的乘客数目,这个目标等价于(11.1.1),即

大化不需要更换飞机的乘客数。约束条件(11.1.2)将使每个目的地安排的飞机数

等于 1,并且约束条件(11.1.3)将使来自每个来源地的航班数也等于 1。约束条件

(11.1.4)指定这些变量为二值变量。注意,由于这个问题是著名的分配问题的一个

例子,因此使用单纯形算法求得的线性规划 优解就是整数解。因此只需要为这些变

量指定非负约束条件即可。约束条件(11.1.2)和(11.1.3)将为这些变量确立上界

1。

11.1.2 模型实现

此数学模型可以用下面的 Mosel 程序实现。其中数据数组 PASS 将从文件

f1connect.dat 读入,表格中的“-”将用足够大的负数系数代替(-1000)。这样就避

免了出现不可行的航班连接。另一种可选方法是将数组 PASS 的对应元素保留为未

定义,并根据检测数组元素是否已定义来判断某个航班连接方案是否可行。这种方法

的优点在于当存在不可行的航班连接时可以使用较少的变量;但如果有一些航班连接

可行,但是没有乘客乘坐,则这种方法不适用。

model "F-1 Flight connections"

uses "mmxprs"

declarations

PLANES = 1..6 ! 飞机集合

PASS: array(PLANES,PLANES) of integer ! 要转飞的乘客

cont: array(PLANES,PLANES) of mpvar ! 如果飞机 j 继续飞往目的地 i,则为 1

end-declarations

Page 236: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

225

initializations from 'f1connect.dat’

PASS

end-initializations

! 目标函数:无须更换飞机的乘客数

Transfer:= sum(i,j in PLANES) PASS(i,j)*cont(i,j)

! 每架飞机对应于一个进场航班和一个离场航班

forall(i in PLANES) sum(j in PLANES) cont(i,j) = 1

forall(j in PLANES) sum(i in PLANES) cont(i,j) = 1

! 求解此问题: 大化无须换飞机的乘客数

maximize(Transfer)

end-model

11.1.3 结果

在 优解决方案中,有 112 名乘客无须换飞机。下表列出了对应的航班连接。

表格 11.2: 优航班连接方案

航班来自 继续飞往 乘客数

波尔多 伦敦 38

克莱蒙-费朗 波恩 8

马赛 布鲁塞尔 11

南特 柏林 38

尼斯 罗马 10

图卢兹 维也纳 7

11.2 机组人员组成

在第二次世界大展中,英国皇家空军(RAS)中有很多说不同语言的飞行员,

飞行员所学习驾驶的飞机也不尽相同。皇家空军希望为每架飞机安排一对飞行员-副飞行员(一个机组),他们必须语言相通,并且都熟悉此机型。在我们这个例子中有

8 名飞行员。下面的表中用 0( 差)到 20( 好)表示每名飞行员对各种语言(英

语,法语,荷兰语,挪威语)的掌握程度,以及对不同类型的双座飞机(侦察机,运

输机,轰炸机,战斗轰炸机,补给运输机)的驾驶经验。

表格 11.3:飞行员各项评分

飞行员 1 2 3 4 5 6 7 8

语言 英语 20 14 0 13 0 0 8 8

法语 12 0 0 10 15 20 8 9

荷兰语 0 20 12 0 8 11 14 12

Page 237: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

226

挪威语 0 0 0 0 17 0 0 16

机型 侦察机 18 12 15 0 0 0 8 0

运输机 10 0 9 14 15 8 12 13

轰炸机 0 17 0 11 13 10 0 0

战斗轰炸机 0 0 14 0 0 12 16 0

补给运输机 0 0 0 0 12 18 0 18

只有两名飞行员对同一种语言的掌握都超过 10/20,且对同一种飞机的掌握都超

过 10/20,这样才能组成一个机组。

问题 1:是否有可能让所有飞行员都编入机组?

然后计算每个可行机组人员对其掌握得分均超过 10/20 的每种类型飞机的掌握

得分之和。这样我们可以定义每个机组的 高得分。例如,飞行员 5 和 6 对轰炸机

的掌握分别为 13 和 10,对补给运输机的掌握分别为 12 和 18。因此它们组成的机组

的 高得分为 max(13+10, 12+18) = 30。

问题 2:应如何编组才能让所有机组的得分之和 大?

11.2.1 模型的数学表达

令 PILOTS 为飞行员集合。可以使用无向兼容性图 ( )ARCS,PILOTSG = 来对

这个问题进行建模。每个结点代表一个飞行员,如果飞行员 p 和 q 能够兼容,即有

一门语言的掌握都至少为 10/20,且有一种机型的掌握也至少为 10/20,则用弧(边)

[ ]q,pa = 连接这两个飞行员的结点。此弧具有权值,权值即等于此机组人员的 高

得分。图 11.1 给出了本问题所对应的此图,并且在其中标出了每个机组的 高得分。

图 11.1:飞行员兼容图

一个可行的编组方案即对应于图G 中相互之间没有共同结点的一些弧的集合。

在图论中,这样的集合称为一个匹配(matching)。对于问题 1,我们即在图中寻找

Page 238: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

227

大基数匹配(maximum cardinality matching);对于问题 2,即寻找具有 大总权

值的匹配(matching with maximum total weight)。根据此图,我们可以将模型表示

为如下形式:

maximize ∑∈

⋅ARCSa

aa flyCREW (11.2.1)

PILOTSr ∈∀ : [ ]

1≤∑=∨=∈=rqrpARCSq,pa

afly (11.2.2)

ARCSa∈∀ : { }10,flya ∈ (11.2.3)

对于图中的每条边 [ ]q,pa = ,都用一个二值变量 afly 来表示是否使用此边

(11.2.3)。通过约束条件(11.2.2),每个结点 r 都至多属于一条边。问题 2 的目标

函数为(11.2.1),即累加所有选中的边的权值。对于问题 1,我们需要 大化机组数

目,并查看此时是否所有飞行员都已经编组:此时需要从目标函数中去掉系数

aSCORE 。注意 大基数匹配是具有 大总权值的匹配的一个特例,在其中所有权

值都设置为 1。

11.2.2 模型实现

下面的Mosel 程序将首先根据飞行员的语言和飞行经验计算出候选的机组编排:

对于每对飞行员 p 和 q ,此算法首先检查他们的语言既能是否兼容,如果兼容,则

再检查他们的飞行经验是否兼容。如果这两个飞行员具有共同语言且对同种飞机具有

足够的经验,则将他们作为一个候选的机组。

候选机组保存在二维数组 CREW 中,此数组用弧集合进行索引,即对应于弧

[ ]q,pa = 的两个飞行员 p 和q 可以表示为CREW(a, 1)和CREW(a, 2)。约定 qp < ,

这样每对飞行员将只被列出一次。下面的程序将对此问题进行两次求解,第一次使用

问题 1 的目标函数,第二次使用问题 2 的目标函数。

model "F-2 Flight crews

uses "mmxprs"

forward procedure print_sol

declarations

PILOTS = 1..8 ! 飞行员集合

ARCS: range ! 代表机组的弧集合

RL, RT: set of string ! 语言和机型集合

LANG: array(RL,PILOTS) of integer ! 飞行员对不同语言的掌握能力

PTYPE: array(RT,PILOTS) of integer ! 飞行员对不同机型的掌握能力

Page 239: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

228

CREW: array(ARCS,1..2) of integer ! 候选机组安排

end-declarations

initializations from ‘f2crew.dat’

LANG PTYPE

end-initializations

! 计算候选机组安排

ct:=1

forall(p,q in PILOTS| p<q and

(or(l in RL) (LANG(l,p)>=10 and LANG(l,q)>=10)) and

(or(t in RT) (PTYPE(t,p)>=10 and PTYPE(t,q)>=10)) ) do

CREW(ct,1):=p

CREW(ct,2):=q

ct+=1

end-do

finalize(ARCS)

declarations

fly: array(ARCS) of mpvar ! 如果选定此机组,则为 1,否则为 0

end-declarations

! 第一个目标函数: 大化组成的机组数目

NFlying:= sum(a in ARCS) fly(a)

! 每个飞行员至多只能加入一个机组

forall(r in PILOTS) sum(a in ARCS | CREW(a,1)=r or CREW(a,2)=r) fly(a) <= 1

forall(a in ARCS) fly(a) is_binary

! 求解此问题

maximize(NFlying)

! 打印输出求解结果

writeln("Number of crews: ", getobjval)

print_sol

! **** 扩展此问题 ****

declarations

SCORE: array(ARCS) of integer ! 每个机组的 高得分

end-declarations

forall(a in ARCS)

Page 240: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

229

SCORE(a):= max(t in RT | PTYPE(t,CREW(a,1))>=10 and PTYPE(t,CREW(a,2))>=10)

(PTYPE(t,CREW(a,1)) + PTYPE(t,CREW(a,2)))

! 第二个目标函数:总得分

TotalScore:= sum(a in ARCS) SCORE(a)*fly(a)

! 求解此问题

maximize(TotalScore)

writeln("Maximum total score: ", getobjval)

print_sol

!----------------------------------------------------------------

! 打印输出求解结果

procedure print_sol

forall(a in ARCS)

if(getsol(fly(a))>0) then

writeln(CREW(a,1), " -", CREW(a,2))

end-if

end-procedure

end-model

在上述的程序实现中用到了 Mosel 语言的一个特殊特性,即对保存机组列表的

数组 CREW(及索引集合 ARCS)进行增量式定义。在完成计算候选机组之后,(动

态)索引集合 ARCS 即被固定,这样变量数组 fly 就可以使用此索引集定义为静态数

组。

上述程序中用到的另一个新的 Mosel 特性是在检测飞行员之间的兼容性时使用

了具有累积性的 or。

表达式

or(l in RL) (LANG(l,p)>=10 and LANG(l,q)>=10)

只要有一个 l 使 LANG(l,p)和 LANG(l,q)同时大于或等于 10,则此表达式取值就

为 true。

11.2.3 结果

在回答第一个问题时,程序将发现 多可以同时编为四个机组,即所有八名飞行

员都将编入机组。对于第二个问题,程序求出 高总得分为 125,此时的机组编成为

[1, 2],[3, 7],[4, 5],和[6, 8]。

Page 241: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

230

11.3 航班降落调度

在大型机场中,飞机的降落要受到很多安全约束条件的限制。本节中将研究如何

对单条跑道上的飞机降落进行调度。已经有人研究了更一般的问题,但这些问题相当

复杂(动态案例,例如航班晚点,同时有多条跑道,等等),因此我们只讨论一个简

单的情形。

有十个航班需要降落。每个航班都有一个 早到达时间(飞机以 高速度到达降

落区域的时间)和 晚到达时间(可能受其他因素如燃油量等的影响)。在这个时间

窗口内,航空公司需要选择一个目标时间,并将它作为航班到达时间公布出去。如果

比此目标时间迟到或早到,则可能会引起机场秩序混乱并带来额外的费用支出。为将

这些费用计入考虑,并方便进行比对,每个航班都定义了早到每分钟的惩罚和晚到每

分钟的惩罚。下表列出了每个航班的时间窗口(以从当天零时起分钟数计)和惩罚值。

表格 11.4:航班时间窗口等信息

飞机 1 2 3 4 5 6 7 8 9 10

早到达 129 195 89 96 110 120 124 126 135 160

目标时间 155 258 98 106 123 135 138 140 150 180

晚到达 559 744 510 521 555 576 577 573 591 657

早到惩罚 10 10 30 30 30 30 30 30 30 30

晚到惩罚 10 10 30 30 30 30 30 30 30 30

由于尾流影响以及飞机停留在跑道上的时间影响,在两次降落之间需要间隔一段

安全时间。在表 11.5 中第 p 行第q 列即表示在航班 p 和q 降落之间需要等待的 短

时间(分钟),即便这两个航班实际上不是连续降落的。应采取何种降落调度方案才

能够在使总惩罚 小,同时航班又都在指定的时间窗口中降落,并且满足两个航班降

落之间的时间间隔?

表格 11.5:相邻降落之间的间隔时间矩阵

1 2 3 4 5 6 7 8 9 10

1 - 3 15 15 15 15 15 15 15 15

2 3 - 15 15 15 15 15 15 15 15

3 15 15 - 8 8 8 8 8 8 8

4 15 15 8 - 8 8 8 8 8 8

5 15 15 8 8 - 8 8 8 8 8

6 15 15 8 8 8 - 8 8 8 8

7 15 15 8 8 8 8 - 8 8 8

8 15 15 8 8 8 8 8 - 8 8

9 15 15 8 8 8 8 8 8 - 8

10 15 15 8 8 8 8 8 8 8 -

11.3.1 模型的数学表达

令 PLANES 为到达此机场的航班集合。航班 p 的到达时间窗口 为

Page 242: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

231

[ pp STOP,START ],目标到达时间为 pTARGET 。每早到一分钟的惩罚为 pCEARLY 。

每晚到一分钟的惩罚为 pCLATE 。在航班 p 和 q 降落之间的 小时间间隔为

pqDIST 。在本例子的数据中,任意两个时间窗口之间都有部分重叠。因此可以为此

重叠情况建立模型,稍后将介绍如何将此模型扩展到任意类型的时间窗口。

我们需要定义变量 pland ,代表每个航班 p 的降落时间。这些变量要受到各个

航班的 早和 晚到达时间约束(11.3.1)。

PIANESp∈∀ : ppp STOPlandSTART ≤≤ (11.3.1)

为描述任意两个航班 p 和q 之间的降落时间间隔,我们引入二值变量 pqprec ,

如果航班 p 在航班q 之前降落,则 1=pqprec ,否则为 0。

qp,PIANESq,p ≠∈∀ : { }10,prec pq ∈ (11.3.2)

约束条件(11.3.3)将指定航班 p 和q 必须一前一后降落。约束条件(11.3.4)将保证两次降落之间有足够的安全世间;这是经典的互斥(disjunctive 或 exclusion)约束条件,常用于在同一台机器上调度两个任务,以避免它们发生重叠。其中M 为

一个足够大的正常数。

qp,PIANESq,p ≠∈∀ : 1=+ qppq precprec (11.3.3)

qp,PIANESq,p ≠∈∀ : qpqpqpqp landprecMDISTland ≤⋅−+ (11.3.4)

如果航班 p 在航班 q 之前到达,则有 1=pqprec ,因此由(11.3.3)可以得到

0=qpprec 。从 p 和 q 的约束条件(11.3.4)可以得出 qpqp landDISTland ≤+ ,

从而保证这两次降落之间的时间间隔满足要求。如果 0=pqprec ,则 1=qpprec ,

因此约束条件(11.3.4)的不等式左面是一个足够大的负数值,因此此约束条件显然

成 立 。 为 避 免 问 题 出 现 数 值 不 稳 定 性 , pqM 的 数 值 不 应 太 大 ,

qpqppq STARTDISTSTOPM −+= 就已经足够大,能够满足(11.3.4)中的每个约

束条件。

为减少变量的数量,我们只定义 qp < 的二维变量 pqprec ,如果 p 在 q 之前降

Page 243: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

232

落,则此变量取值为 1,否则为 0。则约束条件(11.3.2)可以用(11.3.5)代替,约

束条件(11.3.3)即多余。

qp,PIANESq,p <∈∀ : { }10,prec pq ∈ (11.3.5)

约束条件(11.3.4)可以改写为(11.3.6)和(11.3.7)。(11.3.6)是 qp > 的一

对航班 ( )q,p 的互斥约束条件,(11.3.7)是 qp < 时的互斥约束。例如,如果 qp <

(约束条件(11.3.7)),且 p 在q 之前到达,则 1=pqprec ,因此 01 =− pqprec ,

且 qpqp landDISTland ≤+ 。如果 qp < ,但 q 在 p 之前到达,则 0=pqprec ,

(11.3.7)显然满足。

pq,PIANESq,p <∈∀ : qpqpqp precMlandDISTland ⋅+≤+ (11.3.6)

qp,PIANESq,p <∈∀ : ( )qpqpqp precMlandDISTland −⋅+≤+ 1 (11.3.7)

建模要将航班 p 相对于目标到达时间 pTARGET 迟到或早到的时间需要一些技

巧。我们引入变量 pearly ,代表早到的时间长度, plate 表示迟到的时间长度。然后

就可以写出带有早到每分钟和迟到每分钟的惩罚 pCEARLY 和 pCLATE 的目标函数

(11.3.8)。

minimize ( )∑⋅

⋅+⋅PLANESp

pppp lateCLATEearlyCEARLY (11.3.8)

变量 pearly 和 plate 都有上界((11.3.9)和(11.3.10)),以便使航班能够在时

间窗口[ pp STOP,START ]中降落。

PIANESp∈∀ : ppp STARTTARGETearly −≤≤0 (11.3.9)

PIANESp∈∀ : ppp TARGETSTOPlate −≤≤0 (11.3.10)

约束条件(11.3.11)即在降落时间与早到或迟到时间长度之间建立了联系。

PIANESp∈∀ : pppp lateearlyTARGETland +−= (11.3.11)

我们要 小化这个目标函数,因此(11.3.11)中 pearly 和 plate 不可能同时为非

零值。

Page 244: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

233

终就可以得到一个混合整数模型,即(11.3.1),和(11.3.5)-(11.3.11)。

11.3.2 推广到任意类型的时间窗口

在一般情形中, qp < 的一对航班 ( )q,p 可以分为三个集合,即OVERLAP ,

SEP ,和 NONSEP 。OVERLAP 中包含所有时间窗口有重叠的航班对。变量 pqprec

用于判断航班 p 是否在航班q 之前到达。我们前面给出的模型是对一般情况的简化,

在其中要求所有航班对都属于集合OVERLAP 。

集合 SEP 表示那些时间窗口不相连,并且肯定能够满足降落时间间隔要求的航

班对:例如两个航班的时间窗口分别为[10, 50]和[70, 110],其安全降落间隔时间为

15 分钟,显然此条件能够得到满足。两个时间窗口之间的这种类型的关系可以写成

( ) ( )pqpqqpqp STARTDISTSTOPSTARTDISTSTOP ≤+∨≤+ 。 第 三 个 集 合

NONSEP 表示所有时间窗口不相连,但无法肯定保证安全降落间隔时间的航班对,

例如时间窗口分别为[10, 50]和[70, 110],但安全降落时间间隔为 30 的两个航班。

原先的约束条件(11.3.6)-(11.3.7)只考虑了集合OVERLAP 中的航班对,

为得到更一般化的模型,我们需要加入约束条件(11.3.12)到(11.3.15)。约束条件

(11.3.12)和(11.3.13)将迫使两个时间窗口不相连时变量取值为 0 或 1。约束条

件(11.3.14)和(11.3.15)是简单的先决关系约束条件,类似于第 7 章体育馆建设

问题中的约束条件。

( ) qp STARTSTOP,NONSEPSEPq,p <∈∀ U : 1=pqprec (11.3.12)

( ) pq STARTSTOP,NONSEPSEPq,p <∈∀ U : 0=pqprec (11.3.13)

( ) qp STARTSTOP,NONSEPq,p <∈∀ : qpqp landDISTland ≤+ (11.3.14)

11.3.3 模型实现

下面的Mosel程序即实现了11.3.1节中给出的数学模型。为所有航班对 p 和q 都

定义了变量 pqprec ,但是只有 qp < 的 pqprec 才会用于约束条件中,从而使其他的

qp ≥ 的 pqprec 不会出现在此问题中。

model "F-3 Landing schedule"

uses "mmxprs"

declarations

PLANES = 1..10 ! 飞机集合

Page 245: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

234

START, STOP: array(PLANES) of integer ! 时间窗口的开始点和结束点

TARGET: array(PLANES) of integer ! 目标时间

CEARLY, CLATE: array(PLANES) of integer ! 早到/迟到的代价

DIST: array(PLANES,PLANES) of integer ! 飞机之间的 短降落间隔

M: array(PLANES,PLANES) of integer ! 足够大的正数值

prec: array(PLANES,PLANES) of mpvar ! 如果航班 i 在 j 之前降落,则为 1

! 否则为 0

land: array(PLANES) of mpvar ! 实际到达时间

early,late: array(PLANES) of mpvar ! 迟到/早到时间长度

end-declarations

initializations from ‘f3landing.dat’

START STOP TARGET CEARLY CLATE DIST

end-initializations

forall(p,q in PLANES) M(p,q):= STOP(p) + DIST(p,q) -START(q)

! 目标函数:由于未按计划时间降落的总惩罚

Cost:= sum(p in PLANES) (CEARLY(p)*early(p) + CLATE(p)*late(p))

! 在航班降落之间保持要求的时间间隔

forall(p,q in PLANES | p>q)

land(p) + DIST(p,q) <= land(q) + M(p,q)*prec(q,p)

forall(p,q in PLANES | p<q)

land(p) + DIST(p,q) <= land(q) + M(p,q)*(1-prec(p,q))

! 早到时间,迟到时间与实际到达时间之间的关系

forall(p in PLANES) do

early(p) >= TARGET(p) -land(p)

late(p) >= land(p) -TARGET(p)

land(p) = TARGET(p) -early(p) + late(p)

end-do

forall(p in PLANES) do

START(p) <= land(p); land(p) <= STOP(p)

early(p) <= TARGET(p)-START(p)

late(p) <= STOP(p)-TARGET(p)

end-do

forall(p,q in PLANES | p<q) prec(p,q) is_binary

! 求解此问题

Page 246: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

235

minimize(Cost)

end-model

如前面所述,不能使用 START 和 END 来表示时间窗口,这是由于 END 是 Mosel的保留关键字(请参考 5.2.3 节了解完整的关键字列表)。

11.3.4 结果

程序计算出总惩罚为 700。下表列出了每个航班的调度信息以及目标时间和实际

降落时间与目标时间之间的偏差(较目标时间迟到或早到的时间长度)。值得一提的

是,此问题的线性规划解的 优值为 0,但此时许多变量 pqprec 都需要取小数值。

表格 11.6:到达时间与偏差

航班 1 2 3 4 5 6 7 8 9 10

实际时间 165 258 98 106 118 126 134 142 150 180

目标时间 155 258 98 106 123 135 138 140 150 180

偏差 10 0 0 0 -5 -9 -4 2 0 0

11.4 航空枢纽选择选址

FAL(法国航空公司)专门从事货运。此公司在法国的主要城市与美国的主要城

市之间进行运输,这些城市为:亚特兰大,波士顿,芝加哥,马赛,尼斯,巴黎。此

公司在这些城市之间平均每天运输的货物吨数列于下表中。

表格 11.7:每对城市之间每天平均货运量

亚特兰大 波士顿 芝加哥 马赛 尼斯 巴黎

亚特兰大 0 500 1000 300 400 1500

波士顿 1500 0 250 630 360 1140

芝加哥 400 510 0 460 320 490

马赛 300 600 810 0 820 310

尼斯 400 100 420 730 0 970

巴黎 350 1020 260 580 380 0

我们假定城市 i 和 j 之间的运输费用与它们之间的距离成正比。下表给出了这些

城市之间的距离,单位为英里。

表格 11.8:城市之间的距离

亚特兰大 波士顿 芝加哥 马赛 尼斯 巴黎

亚特兰大 945 605 4667 4749 4394

波士顿 866 3726 3806 3448

芝加哥 4471 4541 4152

马赛 109 415

尼斯 431

Page 247: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

236

巴黎

此航空公司计划使用两个城市作为连接平台(航空枢纽),以降低运输费用。然

后每个城市将连接到一个枢纽。连接到枢纽 1H 的城市与连接到枢纽 2H 之间的城市

之间的运输即都需要通过 1H 到 2H 这段路径,这样能够降低运输费用。我们知道两

个枢纽之间的运输费用比一般运输费用低 20%。使用哪两个城市作为枢纽才能够

小化总运输成本?

11.4.1 模型的数学表达

用CITIES 表示所有城市的集合,NHUBS 为枢纽数目。令 ijDIST 为在城市 i 和

j 之间的距离 ijQUANT 为需要从 i 到 j 运输的货物数量。每吨的运费取决于选择哪些

城市作为枢纽。从任意城市 i 到任意城市 j 的货运量都要经过两个枢纽 k 和 l (可以

为同一个枢纽)。令 ijklCOST 为从 i 到 j 经过枢纽 k 和 l 的运输费用,则此费用等于从

i 到 k 的运费加上 k 到 l 的运费再加上 l 到 j 的运费。由于从 k 到 l 是枢纽之间的运输,

因此其运费等于表 11.8 中列出正常运费的 80%。

再加入一组二值变量 ijklflow ,如果 i 到 j 的运输需要依次经过枢纽 k 和 l ,则

ijklflow 取值为 1,反之则为 0。同时我们引入变量 ihub ,如果城市 i 是枢纽,则 ihub

取值为 1,否则为 0。

目标函数即为(11.4.1),即 小化总运输成本。约束条件(11.4.2)表明我们希

望创建 NHUBS 个枢纽。约束条件(11.4.3)规定每对城市 ( )j,i 只对应于一对枢纽。

约束条件(11.4.4)和(11.4.5)表明如果变量 ijklflow 为 1,则变量 khub 和 lhub 也为 1。

也就是说,只有当 k 和 l 都是枢纽时,i 到 j 的货运才可能通过 k 和 l 。为使此模型完

整,我们还需要定义约束条件(11.4.6)和(11.4.7),即这些变量为二值变量。

注意:在约束条件(11.4.3)中,k 可以等于 l ,这时意味着运输可能只通过一个枢

纽进行中转。如果起点/终点城市都连接到同一个枢纽,则会出现这种情况。此时枢

纽间运输成本即为 0。

minimize

∑ ∑ ∑ ∑∈ ∈ ∈ ∈

⋅⋅CITIESi CITIESj CITIESk CITIESl

ijklijijkl flowQUANTCOST (11.4.1)

Page 248: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

237

NHUBShubCITIESi

i =∑∈

(11.4.2)

CITIESj,i ∈∀ : 1=∑ ∑∈ ∈CITIESk CITIESl

ijklflow (11.4.3)

CITIESl,k,j,i ∈∀ : kijkl hubflow ≤ (11.4.4)

CITIESl,k,j,i ∈∀ : lijkl hubflow ≤ (11.4.5)

CITIESi∈∀ : { }10,hubi ∈ (11.4.6)

CITIESl,k,j,i ∈∀ : { }10,flowijkl ∈ (11.4.7)

11.4.2 模型实现

下面的 Mosel 程序即实现了上述的数学模型,首先使用数据文件中所定义的枢

纽间运输运费降低因子 FACTOR 计算出从 i 经过枢纽 k 和 l 终到 j 的运输成本

ijklCOST 。

model "F-4 Hubs"

uses "mmxprs"

declarations

CITIES = 1..6 ! 城市

NHUBS = 2 ! 枢纽数目

COST: array(CITIES,CITIES,CITIES,CITIES) of real ! 路径(i,j,k,l) 的运费

! 即从 i 出发,经由枢纽 k 和 l

! 终到达 j 的运费。

QUANT: array(CITIES,CITIES) of integer ! 货运量

DIST: array(CITIES,CITIES) of integer ! 城市之间的距离

FACTOR: real ! 枢纽间运输费用较

! 一般城市间运输费用降低

flow: array(CITIES,CITIES,CITIES,CITIES) of mpvar ! 如果从 i 到 j 的运输要经过 k 和 l

! 则 flow(i,j,k,l) = 1

hub: array(CITIES) of mpvar ! 如果城市为枢纽,则为 1

! 否则为 0

end-declarations

initializations from ‘f4hub.dat'

Page 249: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

238

QUANT DIST FACTOR

end-initializations

! 计算运输成本

forall(i,j,k,l in CITIES)

COST(i,j,k,l):= DIST(i,k)+FACTOR*DIST(k,l)+DIST(l,j)

! 目标函数:总运输成本

Cost:= sum(i,j,k,l in CITIES) QUANT(i,j)*COST(i,j,k,l)*flow(i,j,k,l)

! 枢纽数目

sum(i in CITIES) hub(i) = NHUBS

! 每个运输路线中只有一个枢纽到枢纽的连接

forall(i,j in CITIES) sum(k,l in CITIES) flow(i,j,k,l) = 1

! 流和枢纽之间的关系

forall(i,j,k,l in CITIES) do

flow(i,j,k,l) <= hub(k)

flow(i,j,k,l) <= hub(l)

end-do

forall(i in CITIES) hub(i) is_binary

forall(i,j,k,l in CITIES) flow(i,j,k,l) is_binary

! 求解此问题

minimize(Cost)

end-model

11.4.3 修改后的模型表达

尽管这个问题规模不大,但是(11.4.1)到(11.4.7)的模型数学表达及其对应

的 Mosel 程序都使用了大量的变量(超过 1300 个二值变量)。仔细观察距离数据我

们可以发现,这六个机场可以按照地理位置进行聚类:美国的机场相互之间距离较近,

且都远离欧洲的机场,而欧洲的机场相互之间距离也比较近。因此我们完全可以假定

一个枢纽在美国,一个枢纽在欧洲。美国的机场将连接到美国的枢纽,欧洲的机场将

使用欧洲的枢纽。这样就意味着我们可以排除大量的索引组合(例如欧洲的机场连接

到美国的枢纽)。我们定义集合 EU 表示欧洲的机场,集合US 表示美国的机场,这

两个集合的并集即我们前面模型中所使用的集合CITIES 。

除了考虑地理因素之外,我们还可以将任意一对城市 i 和 j 之间两个方向的货运

量合并起来,只考虑 ji < 的情况,从而再次减少使用的变量数目。

Page 250: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

239

在进行这样的操作之后。变量 flow 的索引范围就变成了: ji,USk,j,i <∈∀ :

( )k,k,j,i (美国内部的空运), ji,EUk,j,i <∈∀ : ( )k,k,j,i (欧洲内部的空运),

以及 EUl,j,USk,i ∈∈∀ : ( )l,k,j,i (洲际空运)。这样我们的问题中的变量数就减

少到了不到 100 个。

除了只对有定义的变量进行求和之外,其他约束条件都与前一种模型表达方式相

同。我们甚至可以根据观察发现美国内部(11.4.8)和欧洲内部的空运都只会用到一

个枢纽,因此可以加上两组新的约束条件:

ji,USj,i <∈∀ : 1=∑∈USk

ijkkflow (11.4.8)

ji,EUj,i <∈∀ : 1=∑∈EUk

ijkkflow (11.4.9)

下面给出了对修改后的模型的 Mosel 实现。注意,决策变量数组 flow 定义为

dynamic array,这样我们就可以只创建需要使用到的数组元素。与前一个模型相比,

另一个变化是用一个函数取代了数组 COST,这样将减小数据占用的存储空间(对于

大规模的问题,这可能带来很大的收益)。

model "F-4 Hubs (2)"

uses "mmxprs"

forward function calc_cost(i,j,k,l:integer):real

declarations

US = 1..3; EU = 4..6

CITIES = US + EU ! 城市

NHUBS = 2 ! 枢纽数目

QUANT: array(CITIES,CITIES) of integer ! 货运量

DIST: array(CITIES,CITIES) of integer ! 城市之间的距离

FACTOR: real ! 枢纽之间的运费降低

flow: dynamic array(CITIES,CITIES,CITIES,CITIES) of mpvar

! 如果从 i 到 j 的运输经过枢纽 k 和 l

! 则 flow(i,j,k,l) = 1

hub: array(CITIES) of mpvar ! 如果城市是枢纽,则为 1,否则为 0

end-declarations

initializations from 'f4hub.dat’

QUANT DIST FACTOR

end-initializations

Page 251: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

240

forall(i,j in CITIES | i<j) QUANT(i,j):=QUANT(i,j)+QUANT(j,i)

forall(i,j,k in US | i<j) create(flow(i,j,k,k))

forall(i,j,k in EU | i<j) create(flow(i,j,k,k))

forall(i,k in US, j,l in EU) create(flow(i,j,k,l))

! 目标函数:总运输成本

Cost:= sum(i,j,k,l in CITIES | exists(flow(i,j,k,l)))

QUANT(i,j)*calc_cost(i,j,k,l)*flow(i,j,k,l)

! 枢纽数目

sum(i in CITIES) hub(i) = NHUBS

! 每条运输路线上只有一个枢纽到枢纽的连接

forall(i,j in CITIES | i<j) sum(k,l in CITIES) flow(i,j,k,l) = 1

forall(i,j in US | i<j) sum(k in US) flow(i,j,k,k) = 1

forall(i,j in EU | i<j) sum(k in EU) flow(i,j,k,k) = 1

! 流和枢纽之间的关系

forall(i,j,k,l in CITIES | exists(flow(i,j,k,l))) do

flow(i,j,k,l) <= hub(k)

flow(i,j,k,l) <= hub(l)

end-do

forall(i in CITIES) hub(i) is_binary

forall(i,j,k,l in CITIES | exists(flow(i,j,k,l))) flow(i,j,k,l) is_binary

! 求解此问题

minimize(Cost)

!----------------------------------------------------------------

! 从 i 经由枢纽 k 和 l 到达 j 的运输费用

function calc_cost(i,j,k,l:integer):real

returned:=DIST(i,k)+FACTOR*DIST(k,l)+DIST(l,j)

end-function

end-model

Page 252: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

241

11.4.4 结果

图 11.2:航空枢纽选择

这两个模型能够得到相同的解。为 小化总运费,应使用波士顿和巴黎作为枢纽。

亚特兰大和芝加哥都将连接到波士顿枢纽,尼斯和马赛都将连接到巴黎枢纽,这在我

们意料之中。这表示,所有来自亚特兰大,波士顿,和芝加哥的货物都将首先汇集到

波士顿枢纽。如果货物的目的地是美国的城市,则将直接发送往指定的城市。所有目

的地为欧洲的货物都将先运到巴黎枢纽,然后再分送到欧洲的各个城市。从欧洲城市

送往美国的货物也将先运到巴黎枢纽,然后运到波士顿枢纽, 终才送到各自的目的

地那里。总的运输费用是 42,153,794.欧元。

11.5 空运路线规划

在东南亚有一个国家正在遭受广泛的洪灾。在国际援助下,该国政府决定建立一

个空运补给系统。不幸的是,在这个国家只有七条还可以使用的跑道,其中有一条在

首都。

该国政府决定让飞机从首都起飞,然后访问所有其他六个机场, 后回到首都。

下表列出了机场之间的距离。机场 A1 位于首都。应采取什么顺序依次到达各个机场

才能使总行程 短?

表格 11.9:机场之间的距离(千米)

A2 A3 A4 A5 A6 A7

A1 786 549 657 331 559 250

A2 668 979 593 224 905

A3 316 607 472 467

A4 890 769 499

A5 386 559

A6 681

11.5.1 模型的数学表达

为建模此问题,我们用 { }71 ,,CITIES K= 表示将要访问的机场集合, ijDIST 为

Page 253: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

242

在机场 iA 和 jA 之间的距离。由于将通过飞机到达各个机场,因此距离矩阵是对称的。

我们引入二值变量 ijfly ,如果飞机从 i 飞到 j ,则此变量取值为 1,否则为 0。我们

希望找出的路线应是一个循环,其中每个机场都被访问一次,且只访问一次。在此循

环中,到达每个机场 i 的飞机只能来自于同一个机场,并且只能去往同一个机场。式

(11.5.1)和(11.5.2)即表示出了这些条件。

CITIESj∈∀ : 1=∑≠∈ ji,CITIESi

ijfly (11.5.1)

CITIESi∈∀ : 1=∑≠∈ ji,CITIESj

ijfly (11.5.2)

如果我们只使用约束条件(11.5.1)和(11.5.2),则此循环可能被分为若干个子

循环,例如从机场 1 到机场 2,然后再回到机场 1。此子循环能够满足上述的两个约

束条件,但不是正确解。因此需要避免这种出现子循环的情况。约束条件(11.5.3)即能实现此目的:对于每个机场子集 S ,要求 S 中的弧的数目必须严格小于 S 的基

数,这样就避免了这种出现子循环的情况。

如果城市数目为 N ,即使 N 相对较小,也很难对所有可能出现的子循环(数目

为N2 量级)进行尝试。为此我们首先要求解没有约束条件(11.5.3)的此问题,通

常能够找到一个包含有子循环的解,然后可以逐步加入约束条件,使子循环消失。此

过程将在下一节详细介绍。

S∀ : ( )

1−≤∑∈

SflySj,i

ij (11.5.3)

目标函数为(11.5.4),即 小化经过所有城市的循环的长度,即所经过的所有

弧的总长度。

minimize ∑ ∑∈ ∈

⋅CITIESi CITIESj

ijij flyDIST (11.5.4)

CITIESj∈∀ : 1=∑≠∈ ji,CITIESi

ijfly (11.5.5)

CITIESi∈∀ : 1=∑≠∈ ji,CITIESj

ijfly (11.5.6)

S∀ : ( )

1−≤∑∈

SflySj,i

ij (11.5.7)

CITIESj,i ∈∀ : { }10,flyij ∈ (11.5.8)

11.5.2 模型实现与求解结果

下面的 Mosel 程序实现了不带有约束条件(11.5.3)的上述数学模型。由于距离

矩阵是对称矩阵,因此数据文件中只需含有上半个三角(即 ji < 的 i 和 j 之间的距

离);另外一般将在读入数据后进行填充。

Page 254: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

243

model "F-5 Tour planning"

uses "mmxprs"

declarations

NCITIES = 7

CITIES = 1..NCITIES ! 城市

DIST: array(CITIES,CITIES) of integer ! 城市之间的距离

NEXTC: array(CITIES) of integer ! 解决方案中 i 之后的下一个城市

fly: array(CITIES,CITIES) of mpvar ! 如果飞机从 i 飞到 j,则取值为 1

end-declarations

initializations from ‘f5tour.dat’

DIST

end-initializations

forall(i,j in CITIES | i<j) DIST(j,i):=DIST(i,j)

! 目标函数:总距离

TotalDist:= sum(i,j in CITIES | i<>j) DIST(i,j)*fly(i,j)

! 每个城市只访问一次

forall(i in CITIES) sum(j in CITIES | i<>j) fly(i,j) = 1

forall(j in CITIES) sum(i in CITIES | i<>j) fly(i,j) = 1

forall(i,j in CITIES | i<>j) fly(i,j) is_binary

! 求解此问题

minimize(TotalDist)

end-model

图 11.3 显示出了此问题的解。其中包含有三个需要消去的子循环。我们采取的

策略是每次去掉一个子循环,从 小的子循环开始。

我们实现了下面的过程 break_subtour,并在前面的 Mosel 程序中完成求解初始

问题之后调用此过程。在此过程中,首先将每个城市的下一个城市保存到数组NEXTC中。然后计算出在从城市 1 出发的路径上的城市集合:如果此集合大小等于城市数

目 NCITIES,则找到了 优解,算法结束,否则就表明仍然存在子循环。

此时算法将枚举出所有的子循环,并找出其中 小的一个:如果找到了一个包含

两个城市的子循环,则可以停止(不存在只包含一个城市的子循环),否则将计算出

从下一个尚未包含在主循环(集合 ALLCITIES)中的城市开始的子循环。当找到

小的子循环之后,就可以为此集合加入一个(11.5.3)那样的约束条件,并对问题重

新进行求解。

Page 255: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

244

图 11.3:第一次求解,有三个子循环

procedure break_subtour

declarations

TOUR,SMALLEST,ALLCITIES: set of integer

end-declarations

forall(i in CITIES)

NEXTC(i):= integer(round(getsol(sum(j in CITIES) j*fly(i,j) )))

! 找到包含城市 1 的循环(子循环)

TOUR:={}

first:=1

repeat

TOUR+={first}

first:=NEXTC(first)

until first=1

size:=getsize(TOUR)

! 找到 小的子循环

if size < NCITIES then

SMALLEST:=TOUR

if size>2 then

ALLCITIES:=TOUR

forall(i in CITIES) do

Page 256: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

245

if(i not in ALLCITIES) then

TOUR:={}

first:=i

repeat

TOUR+={first}

first:=NEXTC(first)

until first=i

ALLCITIES+=TOUR

if getsize(TOUR)<size then

SMALLEST:=TOUR

size:=getsize(SMALLEST)

end-if

if size=2 then

break

end-if

end-if

end-do

end-if

! 加入一个约束条件用于打破子循环

sum(i in SMALLEST) fly(i,NEXTC(i)) <= getsize(SMALLEST) -1

! 重新求解此问题

minimize(TotalDist)

! 新一轮的子循环消除

break_subtour

end-if

end-procedure

在第一次执行中,子循环消除过程向模型中加入如下的约束条件以消除子循环

(2,6,2):

fly(2,6) + fly(6,2) <= 1

借助于这个新加入的约束条件,我们可以得到图 11.4 所示的解决方案:此解决

方案中仍然包含有三个(不同的)子循环。

再次调用子循环消除过程,加入约束条件以消除子循环(1,7,1):

fly(1,7) + fly(7,1) <= 1

这样 终可以得到一个单个的循环,总路程长度为 2575 千米。在图中的弧都是

有向的,但由于距离矩阵是对称的,因此可以用无向弧(边)来代替这些有向弧,而

不会对解带来任何影响。

Page 257: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

246

图 11.4:第二次求解

图 11.5: 优解

在子循环消除过程的 Mosel 程序中,使用了一些集合运算符以及其他与集合相

关的功能:函数 getsize 将返回数组或集合的大小(即所定义的元素数目)。{}表明集

合为空集。可以使用一般的赋值符号:=来为集合赋值。例如 TOUR:={}。可以使用符

Page 258: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

247

号+=将一个集合加入到另一个集合。

11.6 参考文献和进阶阅读

11.1 节中的航班连接问题是一个经典的分配问题。这种问题可以通过匈牙利算

法(Hungarian algorithm)进行很好地求解,如 Papadimitriou[PS98]的方法,或者

通过在运输网络中搜索 大流来进行求解[Pri94a]。

11.2 节所讨论的机组编成问题是在任意图中进行匹配的问题,而第 14 章中分配

人员到工作岗位上则属于二元图(bipartite graph)中的匹配问题:边将连接两种不

同类型的结点,即人员和工作岗位。在二元图的例子中,线性系统的矩阵完全是单模

的,从而在取得 优解时变量将自动取值为 0 或 1。而此机组编成问题是非二元的问

题,因此单纯形法找到的 优解对应的变量取值可能为 0.5。在任意图中(二元或非

二元)的 大基数匹配或 大权重匹配问题都是多项式问题。Minoux 等在[MB86]中

给出了一种复杂度为 ( )3nO ( n 为结点数目)的算法及其 Fortran 代码。Syslo 在

[SDK83]中给出了一种更简单的求解 大基数匹配问题的方法及其 Pascal 源码,但

这种方法的复杂度仍然为 ( )3nO 。

11.3 节中讨论了航班降落调度的问题,这个问题是一类任务具有时间窗口和相

互之间间隔约束的调度问题的代表。Beasley 等人在[BKSA00]中研究了多跑道的此

类问题。Beasley 等也描述了一种求解大规模情况的专用的树搜索方法。这种方法能

够对 50 架飞机,4 条跑道这样近乎真实的情况求出 优解。Beasley 也就机组人员

调度问题发表了一篇有趣的文章[BC96]。在此问题中,将给定航班的日期和时间长

度,目的是研究如何为机组安排航班顺序才能够保证所有航班都有人驾驶,但又不超

过机组人员的工作时间上限。

在第 11.4 节的枢纽位置选取问题中,我们所给出的问题表达方式使用的变量数

目可能非常巨大。可以将任一城市选作为空运枢纽,因此变量 ijklflow 的数目就是

( )4nO 的量级( n 为城市数目)。这样城市数目仅为 30 个的问题就需要数百万个变量。

Daskin[Das95]和 Campbell[Cam96]给出了几种求解此类问题的启发式方法。

11.5 节中的问题是著名的旅行商问题(TSP)。在此问题中,需要对路线进行安

排,使图中的每个结点都能够访问一次且只访问一次,同时 小化在此路线中弧上的

总费用。这里给出的飞机航线安排问题是一个对称的问题,其费用矩阵是对称的距离

矩阵。在第 7 章中的油画绘制问题是一个非对称的 TSP 问题,采用直接建模求解,

即没有通过逐渐增加约束条件的方法进行求解。旅行商问题是一个著名的 NP-hard问题,经常用于测试新出现的优化方法。本书附件的光盘上包含有一个数据文件,其

中含有若干个法国城市之间的距离矩阵,光盘上还有 11.5 节的 Mosel 程序根据此数

据文件稍加修改后的一个版本。

旅行商问题非常困难,使用本书提供的混合整数规划模型求解 20 个城市以上的

问题就需要花费很长的时间。若城市数目超过此数目,则需要采用专用的树搜索方法

Page 259: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

248

[HK70]。Roseaux[Ros85],Evans[EM92]给出了这些方法的一些教学例子,

Syslo[SDK83]也给出了一些 Pascal 代码。分支裁剪法(Branch and Cut)[GH91]能够处理有一些城市数为数百个,采用欧氏距离的情况。对于其他情况,必须放弃寻

找 优解,而是采用启发式方法。有一些启发式方法,如禁忌搜索或模拟退火方法,

应用起来都十分有效。在 Prins 关于图的著作[Pri94a]中详细讨论了这些启发式方法,

并给出了其对应的 Pascal 代码。

Page 260: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

249

第 12 章 电信通讯问题

近年来电信业领域发展极为迅速。在此领域中出现了很多原创的优化问题,因此

本书将一整章专用于讨论此领域内的问题。电信网络的短周期开发是线上控制的问

题,可以通过通信协议的理论进行解决。但设计问题,决定资源量和资源位置,以及

计划规划等都非常适宜采用优化方法进行解决。因此在这里我们将讨论这些问题。

网络的设计需要能够满足结点之间的期望通信流量,并使建造费用 小,同时还

要满足可靠性要求。要做的第一步是选择结点的位置。第 12.6 节将处理移动电话网

络的问题,在其中需要选择设置信号发射器的位置,以覆盖尽可能多的人群,同时费

用支出也不应超出预算。在完成选择结点之后,需要选择在哪些结点之间建立连接以

进行传输数据。在第 12.4 节中,将建造一个具有树形结构的有线网络,目标是 小

化总成本。第 12.2 节中将研究在通信带宽有限的移动电话网络中如何将蜂窝连接到

主环路上。出于可靠性考虑,在每个蜂窝和环路之间都需要建立多个连接。

在分析和利用现有的网络的过程中出现了另外一些优化问题。第 12.3 中将研究

一个很自然的问题,即计算具有已知通信带宽限制的网络 大能够支持多少通信流

量。第 12.1 节中将研究给定网络中两个结点之间数据交换的可靠性。此可靠性可以

用两个结点之间相互分离的路径(即其中间结点均不相同的路径)的数目 k 来度量。

如果 1>k ,则即使 1−k 个结点都停止工作之后这两个结点之间仍然能够进行通信。

第 12.5 节中的问题是交通调度问题的一个例子:需要对电信卫星的转发器接受到的

数据包进行调度。

12.1 网络可靠性

我们将研究一个军用的电信网络,如图 12.1 所示。此网络中有 11 个结点,在结

点之间存在双向连接,以进行数据传输。

出于可靠性考虑,要求网络中有任意三个结点被破坏时都不会中断结点 10 和 11之间的通信。那么图 12.1 所示的网络能否满足此需求?

12.1.1 模型的数学表达

这个模型可以转化为一个 大流问题。在第 15 章(供水问题)中将详细探讨

大流问题,但在这里我们先对此问题进行简要概述。用 ( )ARCS,NODESG = 表示

一幅有向图,其中 NODES 是结点的集合, ARCS 是弧的集合。将结点 n 连接到结

点m 的弧可以记做 ( )m,n ,且此弧具有整数值的 大通过量 nmCAP 。

设想在某个结点 SOURCE 处有液体流入此网络,并且从结点 SINK 处流出此网

Page 261: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

250

络。液体将在网络中四处流动,可以用 nmflow 表示每条弧 ( )m,n 上的流。如果每条

弧上的流都满足此弧的通过量限制,且在通过中间结点(即,除了 SOURCE 和 SINK之外的其他结点)时都不会有损耗,则认为此流合法。 大流问题即寻找出能够使在

SOURCE 处注入的液体量 大的流(由于没有损耗,因此也可以表示为使 SINK 处

流出的液体量 大)。如果将此问题表示为线性规划模型,则单纯形方法求得的 优

解即为整数解。

图 12.1:电信网络

初看上去,我们要研究的网络可靠性问题与 大流问题并不相似。我们来想象对

此网络 H 进行修改,使每条连接的 大通过量均为 1:则在流为 优时,每条弧上

的实际流量为 0 或 1。我们也为每个结点规定其通过量限制为 1,这样,两个沿着两

条不同的弧离开 10=S 的两个流单元将沿着不同的路径到达 10=T ,这两条路径上

的结点均不相同。这样的路径称为结点分离(node-disjunctive)的路径。

由于离开 SOURCE 的每条弧上的流均为 0 或 1,因此在G 中从 SOURCE 到

SINK 的 大分离路径数即等于在修改后的图 H 中的 大流通量。如果我们能够找

到 k 条路径,则在 1−k 个结点损坏时,此网络仍然为导通:在 糟糕的情况下,这

些结点将分布于 1−k 条相互独立的路径上,但是通信仍然可以通过 后一条仍然导

通的路径进行。 后,通过比较 1−k 与图中允许发生损坏的结点数目就可以得出我

们所研究的可靠性问题的答案。

后一个小难点在于流问题通常定义为有向图。但是在我们的电信网络中,采用

双向连接,而非有向连接。为区分结点 n 和m 之间两个方向上的流,我们将此连接

表示为两条弧 ( )m,n 和 ( )n,m 。因此可以得到有向图 ( )ARCS,NODESG = ,从而可

以对此问题进行较为简单的表达。

Page 262: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

251

maximize ∑的后一结点是SOURCEm

m,SOURCEflow (12.1.1)

SINK,SOURCEn ≠∀ : ∑∑ =的前一结点是的后一结点是 nm

mnnm

nm flowflow (12.1.2)

SINK,SOURCEn ≠∀ : 1≤∑的后一结点是nm

nmflow (12.1.3)

0=∑的前一结点是SOURCEm

SOURCE,mflow (12.1.4)

( ) ARCSm,n ∈∀ : { }10,flownm ∈ (12.1.5)

目标函数(2.1.1)为 大化总通量,即离开 SOURCE 结点的所有流的通量之

和(即到达 SINK 结点的所有流通量之和)。约束条件(12.1.2)对每个中间结点 n 上

的流守恒定理(也称为 Kirchhoff 定理)进行了建模:从所有前一结点到来的流总量

必须等于去往所有下一结点的流总量。约束条件(12.1.3)将使每个中间结点上的流

量上限为 1,我们在这个式子中考虑离开每个结点的流。

需要加入约束条件(12.1.4)来避免从 SOURCE 发出的流再次回到 SOURCE 结

点。在第 15 章的供水问题中,由于源结点没有前辈结点,因此对此没有要求。 后,

约束条件(12.1.5)将指定所有流变量 nmflow 均为二值变量。由于这是一个 大流

问题,因此线性规划解即自动为整数解。此外,约束条件(12.1.3)将迫使所有变量

的上界均为 1。因此可以用非负约束条件取代约束条件(12.1.5)。

12.1.2 模型实现

上述数学模型可以实现为下面的 Mosel 程序。可以用两种方式对一个具有 N 个

结点的图进行编码:弧列表的形式,或者邻接矩阵的形式。在本书中一些例子中采用

了前一种方法,例如第 7.6 节的生产线平衡问题和第 11.2 节的机组编成问题。在这

个例子中我们使用矩阵表达方式,在第 15.4 节的路面铺沙问题中也采用了这种方法。

邻接矩阵 ARC 是一个大小为 NN × 的二值矩阵,如果弧 ( )m,n 存在,则

1=nmARC 。在数据文件中此数组将保存为稀疏形式,即在其中只以(n m) ARC(n,m)

的形式给出了 ARC 中的非零元素。如果在程序中需要使用 ARC 中未定义的元素,

则它们均取默认值 0,但我们可以使用 Mosel 函数 exists 来测试找出 ARC 中有定义

的元素,从而有效地枚举出此矩阵的各个元素,当其中有定义的元素非常少时这种方

法效率尤其高。

为得到更为简洁的模型,从而使线性规划问题规模缩小,以便加快求解速度,我

们只定义了那些对应于实际存在的弧的变量 nmflow 。注意,在对这些变量进行求和

时,不需要每次都重复检查此条件。

数据文件中以无向的形式对此图进行表示:结点 n 和m 之间的双向连接在图中

Page 263: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

252

只出现一次(约定 mn < )。因此需要自己构造出此图的有向版本,此有向版本将用

于 大流模型表达:对于每条有定义的弧 ( )m,n ,均定义它的反 ( )n,m 。模型的其他

部分可以直接从数学模型转换而来。无论选择网络中的哪两个结点作为 SOURCE 和

SINK ,都可以使用此模型。

model "G-1 Network reliability"

uses "mmxprs"

declarations

NODES: range ! 结点集合

SOURCE = 10; SINK = 11 ! 源和宿结点

ARC: array(NODES,NODES) of integer ! 如果弧有定义,则取值为 1,否则为 0

flow: array(NODES,NODES) of mpvar ! 如果弧上有流,则取值为 1,否则为 0

end-declarations

initializations from 'g1rely.dat’

ARC

end-initializations

forall(n,m in NODES | exists(ARC(n,m)) and n<m ) ARC(m,n):= ARC(n,m)

forall(n,m in NODES | exists(ARC(n,m)) ) create(flow(n,m))

! 目标函数:独立路径的数目

Paths:= sum(n in NODES) flow(SOURCE,n)

! 流守恒和通量限制

forall(n in NODES | n<>SOURCE and n<>SINK) do

sum(m in NODES) flow(m,n) = sum(m in NODES) flow(n,m)

sum(m in NODES) flow(n,m) <= 1

end-do

! 不允许返回 SOURCE 结点

sum(n in NODES) flow(n,SOURCE) = 0

forall(n,m in NODES | exists(ARC(n,m)) ) flow(n,m) is_binary

! 求解此问题

maximize(Paths)

! 打印求解结果

writeln("Total number of paths: ", getobjval)

Page 264: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

253

forall(n in NODES | n<>SOURCE and n<>SINK)

if(getsol(flow(SOURCE,n))>0) then

write(SOURCE, " -",n)

nnext:=n

while (nnext<>SINK) do

nnext:=round(getsol(sum(m in NODES) m*flow(nnext,m)))

write(" -", nnext)

end-do

writeln

end-if

end-model

在打印输出求解结果时,使用了一个小算法来打印出 SOURCE 和 SINK 结点之

间的所有路径:对于每个有来自 SOURCE 结点的流注入的结点,计算出其后辈结点

链,直到到达 SINK 结点。为求得结点 n 的后辈结点,我们需要利用每个中间结点在

一个路径中只能出现一次因而只能有一个后辈结点这个事实。我们计算所有离开结点

n 的流乘以对应的后一结点的索引值,然后进行求和,这样就得到了 n 的后辈结点的

索引。getsol 的返回值为实数,因此需要使用函数 round 将其转化为整数值。

图 12.2:分离的路径

12.1.3 结果

此求解算法求出 大总通量为 4,即表示在结点 10 和 11 之间存在 4 条相互分离

的路径,因此当有三个中间结点损坏时,这两个结点之间仍然能够继续进行通信。即

要求能够得到满足。图 12.2 给出了结点 10 和 11 之间的四条分离路径。

Page 265: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

254

12.2 移动电话网络设计

图 12.3 是一个典型的移动电话网络的结构图。每个基本地理区域,也称为一个

蜂窝(cell),将由一个称为中继站的收发器提供服务。从一个移动电话拨出的电话呼

叫将首先通过这些中继站。每个中继站都通过缆线或微波连接到一个中间结点(枢纽,

hub)。其中有一个枢纽将对此网络进行控制,此枢纽即为 MTSO(移动电话交换局)。

将使用高带宽光纤缆线在各个枢纽与 MTSO 之间建立十分可靠的环路连接。如果发

生故障,则此环路可以自动重建连接(自修复环路),因此不需要对其全部替换。

在目前的技术条件下,中继站和交换局之间无法进行动态连接。在设计阶段即应

固定这些连接,因此需要为每个中继站选择其连接到的环路结点。在蜂窝 c 和环路之

间的连接数目称为蜂窝 c 的多径数,用 cCNCT 表示。为使系统更为可靠,多径数应

大于 1。

这种类型的系统中的通信是完全数字化的,通信带宽可以表示为带宽为 64kbps(千比特每秒)的双向回路数目。则此带宽数值即对应于在高峰期可并发的通信数。

环路的带宽上限为CAP。从蜂窝 c 发出的通信量 cTRAF 可以平均分配到蜂窝与环路

之间的各个连接上,每个连接分配到的通信量为 cc CNTC/TRAF 。此通信量将通过

环路传输到交换局,在交换局中将把各个呼叫转接到另一个蜂窝或移动电话与固定电

话之间的接口结点。由于交换局具有普通枢纽的所有功能,因此中继站也可以直接连

接到交换局。

图 12.3:一个移动电话网络的结构

我们考虑一个有 10 个蜂窝和 5 个结点组成的环路的网络,此网络的总带宽为

48=CAP 路电话。交换局为结点 5。下表列出了每个蜂窝的通话量,要求连接数,

Page 266: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

255

以及每个连接的成本(单位为千元)。例如蜂窝 1 连接到结点 1,连接成本为 15,000元。蜂窝 1 的多径数为 2,这表示它至少应连接到环路中的两个结点上。此蜂窝的通

话量为 22 路电话。目标是找出蜂窝与环路之间的连接方案,以 小化总连接费用,

同时仍然能够满足通话量限制,并满足连接数要求。

表格 12.1:每个蜂窝的连接成本,通话量,以及连接数

蜂窝 1 2 3 4 5 6 7 8 9 10

枢纽 1 15 9 12 17 8 7 19 20 12 25

枢纽 2 8 11 6 5 22 25 25 9 22 24

枢纽 3 7 8 7 9 21 15 21 15 14 13

枢纽 4 11 5 15 18 19 9 20 18 16 4

枢纽 5(交换局) 10 14 15 24 6 17 22 25 20 11

通话量 22 12 20 12 15 25 15 14 8 22

连接数 2 2 2 2 3 1 3 2 2 2

12.2.1 模型的数学表达

我们用CELLS 表示需要进行连接的蜂窝集合; { }MTSOHUBSNODES U= ,

表示结点集合,其中包括普通枢纽集合和一个交换局; cnCOST 表示将蜂窝 c 连接到

结点 n 的成本。可以使用二值变量 cnconnect 来定义连接,当且仅当蜂窝 c 连接到结

点 n 时此变量取值才为 1(12.2.4)。目标函数为(12.2.1),即总的连接成本。约束

条件(12.2.2)将保证每个蜂窝的连接数都满足要求。

minimize ∑ ∑∈ ∈

⋅CELLSc NODESn

cncn connectCOST (12.2.1)

CELLSc∈∀ : cNODESn

cn CNNTconnect =∑∈

(12.2.2)

CAPconnectCNCTTRAF

CELLSc NODESncn

c

c ⋅≤⋅∑ ∑∈ ∈

2 (12.2.3)

NODESn,CELLSc ∈∈∀ : { }10,connectcn ∈ (12.2.4)

为使环路通信量不超过上限,需要加入约束条件(12.2.3)。注意所有来源的所

有通话要求都要经过交换局,然后沿着环路的某个方向继续传输。由于环路的每条边

的通信容量上限均为CAP ,因此环路的总通信量不能超过 CAP⋅2 。注意,如果蜂

窝与交换局直接相连,则它们之间的通信不需要进入环路。

为使此问题有解,环路带宽需高于某一下界才有可能满足所有通信需要。当每个

蜂窝 c 都有一条连接直接连接到交换局上时,环路中的通信容量即 小。此时环路带

宽需要能够满足剩余的通信量,因此可以得到 小通信容量约束条件(12.2.5)。例

如,一个多径数为 2 的蜂窝至少要有 1-1/2 = 1/2 的通信量需要进入环路;而多径数

为 1 的蜂窝则是蕞理想的情况(它将直接连接到交换局),其通信量将完全不进入环

Page 267: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

256

路。这种关系中不包含任何变量,因此也未列入此数学模型。然而仍然有必要检查给

定的数据是否能够满足此条件,即:

CAPCNCT

TRAFCELLSc c

c ⋅≤⎟⎟⎠

⎞⎜⎜⎝

⎛−⋅∑

211 (12.2.5)

不是电信专家的人会问,对于返回的通信将会如何。从蜂窝 c 发出的通信总是表

示为双向回路的形式。如果在蜂窝 c 中的人呼叫蜂窝 d 中的人,则此呼叫将从 c 发出,

通向交换局,并保留一条应答通路。交换局将此呼叫转交给蜂窝 d ,同时也保留一条

应答回路。当被呼叫者接通电话之后,即建立了双向的回路,占用蜂窝 c 和蜂窝 d 各

一条回路的带宽。

12.2.2 模型实现

此数学模型可以很容易地转化为 Mosel 程序。表 12.1 中的成本数据数组在数据

文件中将保存为转置后的形式,以符合数组 cnCOST 的格式要求。

在定义模型之前,我们首先检查是否环路具有足够的带宽,以满足所有通信需求

(不等式(12.2.5))。如果不满足此条件,则调用 exit 函数退出程序。

model "G-2 Mobile network dimensioning"

uses "mmxprs"

declarations

HUBS = 1..4 ! 枢纽集合

MTSO = 5 ! 交换局结点号

NODES = HUBS+{MTSO} ! 结点集合(普通枢纽+交换局)

CELLS = 1..10 ! 要连接的蜂窝

CAP: integer ! 环路通话容量

COST: array(CELLS,NODES) of integer ! 连接费用

TRAF: array(CELLS) of integer ! 每个蜂窝的通话量

CNCT: array(CELLS) of integer ! 蜂窝与环路之间的连接

connect: array(CELLS,NODES) of mpvar ! 如果蜂窝连接到结点,则为 1,否则为 0

end-declarations

initializations from ‘g2dimens.dat’

CAP COST TRAF CNCT

end-initializations

! 检查环路通话容量

if not (sum(c in CELLS) TRAF(c)*(1-1/CNCT(c)) <= 2*CAP) then

writeln("Ring capacity not sufficient")

Page 268: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

257

exit(0)

end-if

! 目标函数:总费用

TotCost:= sum(c in CELLS, n in NODES) COST(c,n)*connect(c,n)

! 每个蜂窝的连接数量

forall(c in CELLS) sum(n in NODES) connect(c,n) = CNCT(c)

! 环路通话容量

sum(c in CELLS, n in HUBS) (TRAF(c)/CNCT(c))*connect(c,n) <= 2*CAP

forall(c in CELLS, n in NODES) connect(c,n) is_binary

! 求解此问题

minimize(TotCost)

end-model

12.2.3 结果

此混合整数规划的 优解为总成本 249,000 元。环路上的通话量为 94,没有超

过通话容量 96。下表列出了在蜂窝和环路结点之间建立连接的详细情况。

表格 12.2:蜂窝与结点之间连接方案

蜂窝 1 2 3 4 5 6 7 8 9 10

结点 3,5 3,4 2,5 2,3 1,4,5 5 1,4,5 2,3 3,5 4,5

12.3 电话路由安排

有一家私人电话公司要使用如图 12.4 所示的五个城市之间的电话网络,这五个

城市为:巴黎,南特,尼斯,特鲁瓦,华仑西恩斯。

Page 269: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

258

图 12.4:此公司电话网络结构

每条边(连接)旁边标注的数字为连接的带宽容量,单位为电话线路数。我们需

要对此问题展开进一步的讨论。假定在南特有个人 A 呼叫尼斯的人 B。此公司需要

找到一条从南特到尼斯的通路,此通路上的各条边都必须未饱和,以将数字语音信号

从 A 传到 B。但是必须同时也建立一条从尼斯到南特的通路,以便使 B 能够对 A 进

行回应。在数字电话网络中,这两个通路具有相同的带宽标准(通常为 64kbps)。对

应的容量称为一个信道(channel)。 应答信道与呼叫信道使用同样的边,但是方向

相反。要进行通话就必须建立这样的一对相互关联的信道,称之为一个回路(circuit)。

如果被呼叫方接听电话时仍然没有能够找到一条未饱和的返回通路,则呼叫会失

败,因此应答信道必须通过与呼叫信道相同的边。因此,在进行呼叫时,路由系统需

要逐边建立路径,并同时在每条边上保留应答信道所需用的带宽。因此,边上的容量

占用的单位是双向回路,所以我们不需要考虑有向流。例如,有 10 个人从南特呼叫

尼斯,同时有 20 个人从尼斯呼叫南特,或者相反,在这两种情况中,都将使用 30条回路。

下表中列出了给定时刻的回路需求量。是否能够满足所有这些需求?如果不能满

足需求,请满足尽可能多的需求。在每种情况中,请标记出对应的路径,即所使用的

通路。

表格 12.3:通话需求

城市名称 通话需求

南特-尼斯 100

南特-特鲁瓦 80

南特-华仑西恩斯 75

尼斯-华仑西恩斯 100

巴黎-特鲁瓦 70

12.3.1 模型的数学表达

在第 15.1 节中的 大流问题中(供水问题),任务是 大化有限通过量网络中起

点和终点之间的单类产品的总流量。这里我们要解决的是此问题的推广形式,称为多

Page 270: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

259

物网络流问题(MCNF,multiple commodity network flow):有多种流同时使用同一

个网络,这些流分别对应于不同类型的物品,且不能混合,每个流都有自己的起点和

终点。目标仍然是 大化总通量。在这个问题中“物品”即对应于两个城市之间的总

通话数。两对不同城市之间的通话不能混合,如南特和尼斯之间的通话不应以特鲁瓦

为终点。

MCNF 问题是一个很困难的组合问题。在经典的 大流问题中,线性规划为每

条弧 ( )m,n 定义一个流变量 nmflow 。如果弧的通过量为整数,则单纯形算法找到的

优解也为整数解。可以将此模型进行推广,以求解有向图中的 MCNF 问题,其中

使用变量 knmflow 表示物品 k 在弧 ( )m,n 上的流,但对此问题进行线性规划求解的结

果通常不是整数值。由于在同一条饱和的弧上可能会有多条流,因此很难将小数值的

解取整到 优值。此外,使用如本例中这样具有三元索引变量的模型来处理有向网络

也需要一些技巧。因此我们将使用一种较为简单的称为“弧路径(arc-paths)”的模

型表达方法。

在这种表达方法中,将利用到进行通信的城市之间的不同的基本路径

(elementary path,即中间结点集合没有交集的路径)。我们不再使用对应于每对城

市 k 和每条弧 ( )m,n 的变量 knmflow ,而是使用变量 pflow 表示一直沿着路径 p 的

流,此路径即对应于一对已知的城市。因此即自动满足每个结点上的流守恒约束。如

果网络十分稠密,具有非常多的可行路径,则无法采取这种表达方法。但对于具有类

似于骨架结构的电信网络,这种方法优于使用三元索引流变量的方法。

我们使用 ARCS 表示(无向)弧集合,CALLS 表示之间需要进行通话的城市对

集合,PATHS 表示通路集合。令 aCAP 表示弧 a 上的通量上限, cDEM 表示城市对

c 之间的通话需求。我们也需要了解每个通路两端各是哪一对城市,因此用

pCINDEX 表示通路 p 所连接的城市对。这样就可以很容易地给出模型的弧路径表

达。这种表达方式称为“弧-路径”是由于在其中我们将处理弧和路径,而不处理结

点。

maximize ∑∈PATHSp

pflow (12.3.1)

ARCSa∈∀ : a

paPATHSp

p CAPflow ≤∑∈∈

(12.3.2)

CALLSc∈∀ : c

cCINDEXPATHSp

p DEMflow

p

≤∑=

(12.3.3)

PATHSp∈∀ : Nflowp ∈ (12.3.4)

目标函数是 大化(12.3.1)式,即将要使用的所有路径上的流总和。约束条件

(12.3.2)将应用于每条弧a :通过 a 的路径的流总和不能超过 a 的通量上限。约束

Page 271: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

260

条件(12.3.3)将作用于每一对城市 c :在这一对城市间通过各种路径交换的流总和

不能超过通话需求量。此外由于 MCNF 问题求得的线性规划 优解并不能自动保证

是整数解,因此需要加入整数性约束条件(12.3.4)。

12.3.2 模型实现

下面给出了上述数学模型的 Mosel 程序。在建立数学模型之后,还需要求解出

所有通路,然后才能用 Mosel 语言实现此数学模型。在表 12.3 中列出了每一对城市。

弧将用其所连接的城市进行命名:南特-巴黎,南特-尼斯,巴黎-尼斯,巴黎-华仑西

恩斯,特鲁瓦-尼斯,特鲁瓦-华仑西恩斯。

使用二维数组 paROUTE 对通路进行编码,其中每一行都对应于一条通路,并包

含其所经过的各条边。由于通路均为基本通路,不会两次访问同一个城市,因此在

坏的情形下,通路可能包含所有弧。因此数组 ROUTE 的第二维大小即等于问题中

弧的数目 NARC 。下表列出了所有通路及每条通路对应的两个城市(数组

pCINDEX )。通过这种表达方式,就可以很容易地实现此模型。

表格 12.4:通路定义

通路 城市对 弧列表

1 南特-尼斯 南特-尼斯

2 南特-尼斯 南特-巴黎,巴黎-尼斯

3 南特-尼斯 南特-巴黎,巴黎-华仑西恩斯,华仑西恩斯-特鲁瓦,特鲁瓦-尼斯

4 南特-特鲁瓦 南特-巴黎,巴黎-华仑西恩斯,华仑西恩斯-特鲁瓦

5 南特-特鲁瓦 南特-巴黎,巴黎-尼斯,尼斯-特鲁瓦

6 南特-特鲁瓦 南特-尼斯,尼斯-特鲁瓦

7 南特-特鲁瓦 南特-尼斯,尼斯-巴黎,巴黎-华仑西恩斯,华仑西恩斯-特鲁瓦

8 南特-华仑西恩斯 南特-巴黎,巴黎-华仑西恩斯

9 南特-华仑西恩斯 南特-尼斯,尼斯-巴黎,巴黎-华仑西恩斯

10 南特-华仑西恩斯 南特-巴黎,巴黎-尼斯,尼斯-特鲁瓦,特鲁瓦-华仑西恩斯

11 南特-华仑西恩斯 南特-尼斯,尼斯-特鲁瓦,特鲁瓦-华仑西恩斯

12 尼斯-华仑西恩斯 尼斯-南特,南特-巴黎,巴黎-华仑西恩斯

13 尼斯-华仑西恩斯 尼斯-巴黎,巴黎-华仑西恩斯

14 尼斯-华仑西恩斯 尼斯-特鲁瓦,特鲁瓦-华仑西恩斯

15 巴黎-特鲁瓦 巴黎-华仑西恩斯,华仑西恩斯-特鲁瓦

16 巴黎-特鲁瓦 巴黎-南特,南特-尼斯,尼斯-特鲁瓦

17 巴黎-特鲁瓦 巴黎-尼斯,尼斯-特鲁瓦

求出此通路集合是非常繁琐的事情,但在数学规划中,收集数据通常是一个主要

的问题。在工业应用中,数据文件必须通过某种专用软件自动创建(在 11.2 节和 12.5节中的例子中,我们使用 Mosel 语言来进行一些数据预处理工作),或者从数据库或

电子表格中提取。Mosel 的完整发行包中包含有一些直接访问数据库或电子表格的模

块。

Page 272: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

261

model "G-3 Routing telephone calls"

uses "mmxprs"

declarations

CALLS: set of string ! 需求集合

ARCS: set of string ! 弧集合

PATHS: range ! 需求对应的通路集合

CAP: array(ARCS) of integer ! 弧通量

DEM: array(CALLS) of integer ! 城市对之间的需求

CINDEX: array(PATHS) of string ! 每个通路索引对应的需求索引

end-declarations

initializations from 'g3routing.dat’

CAP DEM INDEX

end-initializations

finalize(CALLS); finalize(ARCS); finalize(PATHS)

NARC:=getsize(ARCS)

declarations

ROUTE: array(PATHS,1..NARC) of string ! 组成路径的弧列表

flow: array(PATHS) of mpvar ! 路径上的流

end-declarations

initializations from ‘g3routing.dat’

ROUTE

end-initializations

! 目标函数:弧上的总流量

TotFlow:= sum(p in PATHS) flow(p)

! 流应能不超过需求限制

forall(d in CALLS) sum(p in PATHS | CINDEX(p) = d) flow(p) <= DEM(d)

! 弧上通量限制

forall(a in ARCS)

sum(p in PATHS, b in 1..NARC | ROUTE(p,b)=a) flow(p) <= CAP(a)

forall(p in PATHS) flow(p) is_integer

! 求解此问题

maximize(TotFlow)

end-model

Page 273: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

262

12.3.3 结果

此问题的线性规划解也是整数解。所要求的 425 个通话中有 380 个能够接通,

即除了 45 个南特-特鲁瓦的通话之外其他都能够接通。下表列出了对应的路由安排方

案(存在多个等价的方案)。南特-巴黎,南特-尼斯,巴黎-尼斯,特鲁瓦-华仑西恩斯

之间的连接容量都未用尽,而其他的连接容量都已经用尽。

表格 12.5: 优路由方案

城市对 需求 实际接通 路径

南特-尼斯 100 100 南特-巴黎,巴黎-尼斯

南特-特鲁瓦 80 35 南特-尼斯,尼斯-巴黎,巴黎-华仑西恩斯,

华仑西恩斯-特鲁瓦

南特-华仑西恩斯 75 75 南特-巴黎,巴黎-华仑西恩斯

尼斯-华仑西恩斯 100 20 尼斯-巴黎,巴黎-华仑西恩斯

80 尼斯-特鲁瓦,特鲁瓦-华仑西恩斯

巴黎-特鲁瓦 70 70 巴黎-华仑西恩斯,华仑西恩斯-特鲁瓦

12.4 有线网络建设

有一个大学希望将校园中六个不同建筑内的终端连接起来。表 12.6 列出了各个

终端之间的距离,单位为米。

表格 12.6:不同终端之间的距离(米)

终端 1 终端 2 终端 3 终端 4 终端 5 终端 6

终端 1 0 120 92 265 149 194

终端 2 120 0 141 170 93 164

终端 3 92 141 0 218 103 116

终端 4 265 170 218 0 110 126

终端 5 149 93 103 110 0 72

终端 6 194 164 116 126 72 0

这些终端将通过地下电缆进行连接。我们假定连接两个终端的成本与它们之间的

距离成正比。请给出终端之间的连接方案,以 小化总连接成本。

12.4.1 模型的数学表达

我们定义一个无向标记图 ( )SCONNECTION,DIST,TERMINALSG = ,其中

TERMINALS 为结点集合,即终端集合, SCONNECTION 为边集合,即终端之间

的连接 [ ]t,s , stDIST 即为终端 s 和 t 之间的距离。定义二值变量 stconnect ,当且仅

当终端 s 和终端 t 直接相连时 stconnect 取值才为 1。由于连接是无向的,因此可以定

义 ts < 。目标是以 小的费用在所有终端之间建立连接,因此目标函数可以表示为

Page 274: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

263

(12.4.1)。

minimize ∑ ∑∈

<∈

⋅TERMINALSs

tsTERMINALSt

stst connectDIST (12.4.1)

为连接 NTERM 个终端, 经济的方式是采用具有 1−NTERM 个连接的树形

结构。连接 NTERM 个结点的树就是一幅不包含环路的连通图,或具有 1−NTERM个连接的连通图。约束条件(12.4.2)即限制连接数为 1−NTERM 个。

1−=∑ ∑∈

<∈

NTERMconnectTERMINALSs

tsTERMINALSt

st (12.4.2)

此外,在此树中每个终端都必须至少与另外一个终端相连。我们首先想到加入约

束条件(12.4.3)。

TERMINALSs∈∀ : 1≥∑<∈

tsTERMINALSt

stconnect (12.4.3)

然而,单单这些约束条件是不够的。只采用约束条件(12.4.2)和(12.4.3)可

能会得出如图 12.5 所示的解,在其中会有一个环路。

图 12.5:一种不可行解:出现环路

为避免得出这种解,我们需要对此终端集合的任意子集 S 都施加约束条件

(12.4.4)。但将此约束条件表示为程序却是一件非常困难的事情:一方面不可能枚

举出所有子集,另一方面这种类型的约束条件非常多(NTERM2 个,即对于 20 个结点,

则约束条件大概为一百万个)。

TERMINALSs∈∀ : 1−≤∑ ∑∈ <∈

SconnectSs ts,St

st (12.4.4)

因此需要采用另一种方法来避免产生循环。考虑一个树,其中所有边的方向都是

Page 275: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

264

离开根结点 r ,根结点即只与另外一个结点相连的结点,如图 12.6 中的 1T (任意一

个根结点都可以)。现在可以给每个结点 t 分配一个级别值 tlevel ,此值可以理解为连

接 t 和 r 的通路的长度(单位为边数目,在树形结构中此通路存在且唯一)。例如,我

们可以设置 0=rlevel ,而其他直接连接到 r 的结点 t 则有 1=tlevel 。则可以根据级

别值均应为正整数写出约束条件(12.4.5)。对于这种表达形式,所有连接必须都为

有向连接:对于两个直接连接的结点 s 和 t ,要么 1=stconnect 要么 1=tsconnect 。

具体的方向对解没有影响。

ts,TERMINALSt,s ≠∈∀ :

stst connectNTERMNTERMlevellevel ⋅+−+≥ 1 (12.4.5)

为理解这些约束条件,我们假定此数学模型的某个解中包含一个环路,例如图

12.5 所示的环路 1→2→5→1,且方向也为此顺序。则对于此环路,由约束条件

(12.4.5),对于 1=stconnect 的情况可以得到:

112 +≥ levellevel (12.4.6)

125 +≥ levellevel (12.4.7)

151 +≥ levellevel (12.4.8)

逐项相加可以得到矛盾的结果: 30 ≥ 。因此包含环路的解即不满足约束条件

(12.4.5)。反之,如果结果为树,则从任意的根结点 r 开始遍历此树求出的各个级

别值 tlevel 都能够满足此约束条件。如果在从 r 到 t 的路径上 s 是 t 的前一个结点,则

1+= st levellevel ,且 1=stconnect 。约束条件(12.4.5)即变为 1+= st levellevel ,

能够满足。如果 s 没有直接连接到 t ,则 0=stconnect ,因此约束条件(12.4.5)变为

NTERMlevellevel st −≥− 1 ,由于级别值的范围是从 0 到 1−NTERM ,因此此

约束条件显然能够满足。

约束条件(12.4.5)只检测那些各个连接的方向一致的环路。例如,此约束条件

将不能排除环路 1→2←5→1。加入以下的约束条件后,将迫使所有连接方向都朝向

(任意选取的)根结点,从而能够排除这种环路。

NTERM,,s K2=∀ : 1=∑≠∈

tsTERMINALSt

stconnect (12.4.9)

Page 276: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

265

在表示 后一个约束条件(12.4.9)时,我们选择结点 1 作为根结点。每个结点

都应至少连接到另外一个节点上。由于树中不包含循环,因此在树中的每个结点与根

结点之间都只存在一条通路。这就意味着除了根结点之外的每个结点都只有一条离开

此结点的连接。也就是说,对于每个 1≠s 的结点,只能有一个 stconnect 取值为 1。

这样就得到了下面的数学模型。

minimize ∑ ∑∈

<∈

⋅TERMINALSs

tsTERMINALSt

stst connectDIST (12.4.10)

1−=∑ ∑∈

<∈

NTERMconnectTERMINALSs

tsTERMINALSt

st (12.4.11)

ts,TERMINALSt,s ≠∈∀ :

stst connectNTERMNTERMlevellevel ⋅+−+≥ 1

(12.4.12)

NTERM,,s K2=∀ : 1=∑≠∈

tsTERMINALSt

stconnect (12.4.13)

TERMINALSt,s ∈∀ : { }10,connectst ∈ (12.4.14)

TERMINALSt ∈∀ : 0≥tlevel (12.4.15)

12.4.2 模型实现

上述数学模型可以直接转化为下面的 Mosel 程序。

model "G-4 Cable connections between terminals"

uses "mmxprs"

declarations

NTERM = 6

TERMINALS = 1..NTERM ! 要连接的终端集合

DIST: array(TERMINALS,TERMINALS) of integer ! 终端之间的距离

connect: array(TERMINALS,TERMINALS) of mpvar ! 如果结点之间直接相连

! 则取值为 1,否则为 0

level: array(TERMINALS) of mpvar ! 结点的级别值

end-declarations

initializations from 'g4cable.dat’

Page 277: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

266

DIST

end-initializations

! 目标函数:所使用的电缆总长度

Length:= sum(s,t in TERMINALS) DIST(s,t)*connect(s,t)

! 连接数目

sum(s,t in TERMINALS | s<>t) connect(s,t) = NTERM -1

! 避免出现子环路

forall(s,t in TERMINALS | s<>t)

level(t) >= level(s) + 1 -NTERM + NTERM*connect(s,t)

! 将所有连接方向都设置为朝向根结点(结点 1)

forall(s in 2..NTERM) sum(t in TERMINALS | s<>t) connect(s,t) = 1

forall(s,t in TERMINALS | s<>t) connect(s,t) is_binary

! 求解此问题

minimize(Length)

end-model

12.4.3 结果

终端之间的 优连接方式如图 12.6 所示。需要使用的电缆长度为 470 米。

图 12.6: 优网络连接

Page 278: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

267

12.5 卫星通信调度

卫星数字通信系统由一颗卫星和一组地面站组成,地面站即扮演与地基通信网络

之间的接口角色。通过 SS-TDMA(卫星转发,时分复用)技术,卫星可以为每个地

面站分配连接时间。考虑这样的例子,在美国有四个发射站,在欧洲有四个接收站。

下表给出了一个 4×4 的数据传输矩阵。 trTRAF 是在发射站 t 和接收站 r 之间传输的

数据量。由于所有线路的传输速率都相同,因此数据量可以以单位为秒的传输时间计。

表格 12.7:数据传输矩阵TRAF 及其下界 LB

TRAF 1 2 3 4 trow

1 0 7 11 15 33

2 15 8 13 9 45

3 17 12 6 10 45

4 6 13 15 4 38

rcol 38 40 45 38 45=LB

在此卫星上有一个转发器,允许在四个发射器和四个接收器之间进行任意的排列

组合。表 12.8 给出了一种排列组合方式,将发射站 1 到 4 分别连接到接收站 3,4,1,2。这些连接即对数据传输矩阵中的一部分进行路由安排,称为一个工作模式。

在一个模式中传输矩阵中某个元素的一部分就称为一个数据包。工作模式也是一个

44× 的矩阵M ,其中每一行每一列都至多有一个非零的数据包,因此对于所有的 t

和 r ,都由 trtr TRAFM ≤ 。每个模式都对应于调度过程中的一个时间片,如表 12.8

所示。

表格 12.8:工作模式示例与对应调度方案

1 2 3 4 站点 数据包

1 0 0 11 0 1 到 3 11

2 0 0 0 9 2 到 4 9

3 15 0 0 0 3 到 1 15

4 0 13 0 0 4 到 2 13

rcol 38 40 45 38 45=LB

正确的传输调度方案为星载转发器定义了一系列传输排列组合方式,以为矩阵

TRAF 中的通信量设计路由。也就是说,需要将TRAF 分解为一系列的工作模式矩

阵。可以将TRAF 中的元素拆解开,例如在 12.8 所示的模式中只传输了 31TRAF 的

部分内容。一个被分解的元素将分布于多个数据包和多个传输模式中进行发送。一个

工作模式的长度即其中 长的数据包的长度。我们的目标是找出具有 短传输时间的

调度方案。

Page 279: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

268

12.5.1 模型的数学表达

令 { }NT,,TRANSM K1= 为发射站集合, { }NT,,RECV K1= 为接收站集合。

我们首先写出不允许分解数据时的模型。对于目前的方阵形式的数据传输矩阵,只需

采用 NT 个模式就足以将TRAF 分解。我们可以定义二值变量 trmflow ,当元素

trTRAF 在工作模式m( { }NT,,MODESm K1=∈ )中进行传输时,此变量取值为

1(12.5.7)。约束条件(12.5.2)即要求每个 trTRAF 都只能在一个工作模式中传输(非

抢先)。约束条件(12.5.3)和(12.5.4)将保证每个模式都是合法的模式,即其中

每行每列都只有一个非零元素。

用连续变量 mdur 表示每个模式的持续时间,即此模式中 大的元素的传输时间。

约束条件(12.5.5)将迫使在模式m 中传输的每个 trTRAF 的传输时间都不超过 mdur 。

目标函数为(12.5.1),即分解得到的所有传输模式的总时间。我们所得到的数学模

型就是一个具有三元索引的有瓶颈分配问题(bottleneck assignment problem)。需

要23 NTNT + 个变量和

23 3 NTNT ⋅+ 个约束条件。

minimize ∑∈MODESm

mdur (12.5.1)

RECVr,TRANSMt ∈∈∀ : 1=∑∈MODESm

trmflow (12.5.2)

MODESm,TRANSMt ∈∈∀ : 1=∑∈RECVr

trmflow (12.5.3)

MODESm,RECVr ∈∈∀ : 1=∑∈TRANSMt

trmflow (12.5.4)

MODESm,RECVr,TRANSMt ∈∈∈∀ :

mtrmtr durflowTRAF ≤⋅ (12.5.5)

MODESm∈∀ : 0≥mdur (12.5.6)

MODESm,RECVr,TRANSMt ∈∈∈∀ : { }10,flowtrm ∈ (12.5.7)

实际上在我们 初讨论的问题允许抢先。此时仍然可以只使用一个数学模型来表

示此问题,但由于可以从理论上证明将TRAF 分解为总传输时间 小的工作模式组

合得到的模式数目为2NT 的量级,因此需要使用的变量数目将更多。因此我们将要

使用 Gonzalez 和 Sahni 提出的一种迭代算法[GS76]。在每次迭代时都需要求解一个

线性规划问题,以从TRAF 中析取出一个模式。

Page 280: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

269

由于星载转发器只能将一个发射站连接到一个接收站上,因此无法并行传输

TRAF 矩阵中同一行或同一列中的多个元素。因此第 t 行元素的和 trow 就是所有分

解方案的总时间长度一个下界。同理,TRAF 每列 r 的和 rcol 也是所有分解方案的

总时间长度的一个下界。这样所有这些和的 大值就是一个更好的下界,记为 LB 。

在表 12.7 中列出了这些和,可以得到 45=LB 。

此算法的目的即找出需时为 LB 的调度方案。由于不可能找到需时比下界 LB 更

短的调度方案,因此这样的方案必定是 优的。为让此算法能够正确工作,必须将数

据传输矩阵TRAF 转化为一个每行和每列的和均为 LB 的矩阵。此矩阵称为类双随机

矩阵(quasi bistochastic matrix)TQBS ,我们需要向此矩阵元素中加入假想的传输

数据,以使每行和每列的总和为 LB 。可以通过下面的算法来系统地达成此目的:

♦ 计算矩阵TRAF 每行和每列的总和 trow 和 rcol 。

♦ 计算 LB ,即所每行和每列列总和 trow 和 rcol 的 大值。

♦ rRECV,TRANSt ∈∀ :

- 计算q ,即 trowLB − 和 rcolLB − 中较小的值。

- 设置 qTRAFTQBS trtr +=

- 将 trow 和 rcol 都加上q

下表即显示了我们这个例子所对应的矩阵TQBS 。所有行和所有列的元素总和

均为 45。

表格 12.9:矩阵 TQBS

TQBS 1 2 3 4

1 7 12 11 15

2 15 8 13 9

3 17 12 6 10

4 6 13 15 11

Gonzalez 和 Sahni 提出的算法基本结构如下:

♦ 计算 LB ,即矩阵TRAF 的每行和每列总和的 大值。

♦ 通过加入假想的数据传输量将TRAF 变为类双随机矩阵TQBS 。

Page 281: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

270

♦ 若TQBS 为非零,则进行如下操作,直到TQBS 为 0:

- 使用数学规划方法计算出具有 NT 个非零元素的模式m 。

- 计算 minp ,即m 的所有元素的 小数据包长度。

- 创建一个调度时间片,其长度为m 的中的 短包长度 minp 。

- 从模式m 所包含的每个TQBS 元素中减去 minp 。

♦ 从所得到的模式中去掉假想的数据传输量。

由于每次析取出一个模式时,TQBS 中至少有一个元素(即值为 minp 的元素)

的值变为 0,因此此算法能够收敛。在减去 minp 之后,TQBS 仍然是一个 QBS 矩

阵,其每行每列的和均为 minpLB − ,因此此算法能够求得 优解。分解操作将能

够创建一个长度为 minp 的调度时间片,并使剩余的数据传输矩阵下界为

minpLB − 。多次重复此操作,将能够使调度方案的总时间等于 LB 。

在每次迭代时都能够析取出一个模式,但为使分解结果中的模式数 少,需要使

析取出的模式能够适合给定的数据传输矩阵。为此可以计算 大化 小值(maxmin)的模式,即使此模式中 小的元素 大化。可以使用数学规划方法来求解此模式。下

面的模型描述了一个 大化 小值分配问题(maximin assignment problem),此问

题类似于第 14 章中分配人员到机器上的问题。

maximin minp (12.5.8)

TRANSMt ∈∀ : 10

=∑>

∈trTQBS

RECVrtrflow

(12.5.9)

RECVr ∈∀ : 10

=∑>

∈trTQBS

RECVrtrflow

(12.5.10)

TRANSMt ∈∀ : minpflowTQBSTRANSMt

trtr ≥⋅∑∈

(12.5.11)

0>∈∈∀ trTQBS,RECVr,TRANSMt : { }10,flowtr ∈ (12.5.12)

0≥minp (12.5.13)

二值变量 trflow (12.5.12)当且仅当此模式中包含有元素 trTQBS 时才取值为 1。

初的矩阵TQBS 就可能含有零值的元素,且在任何情况中 Gonzalez 和 Sahni 的算

Page 282: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

271

法的迭代过程中都有可能出现零。因此变量 trflow 将只对非零的 trTQBS 才有定义。

约束条件(12.5.9)将迫使每行至多只有一个非零元素,约束条件(12.5.10)将迫

使每列至多只有一个非零元素。目标函数(12.5.8)即 大化 小数据包长度。

为应用 Gonzalez 和 Sahni 的算法,必须对类双随机矩阵TQBS 求解上述的数学

模型。 trflow 取值为 1 表示此模式中包含有元素 trTQBS 。在求解出 minp 的值后,

将从被选中的 trTQBS 中减去此值,并再次对剩余的数据传输矩阵TQBS 再次求解混

合整数规划问题。当TQBS 中的所有元素都变为 0 之后,处理即停止。

12.5.2 模型实现

下面的 Mosel 程序即实现了前一节所描述的 Gonzalez 和 Sahni 的算法。在每次

求解此混合整数规划问题之后,即更新TQBS 中的对应元素,并在下次迭代时重新

定义此问题。由于在每次迭代之后都将对整个混合整数规划问题进行重新定义,因此

在程序中所有约束条件都将被命名,以方便用新的约束条件定义取代旧的约束条件定

义。由于 Mosel 中的问题定义是增量式的,只能通过显式地进行重置才能去除约束

条件,因此有必要采用这样的方式。在定义之后,变量 flow(t,r)即无法去掉,但通过

在约束条件定义中检测 TQBS(t,r)>0,就可以使只有实际需要使用的变量才会用于当

前问题的定义。

在这个程序中,我们将求出的所有解(每个模式的元素和持续时间)都保存下来,

并在程序 后将完整解打印为表格形式。在打印结果时,将比较每个调度数据包与原

始的数据传输矩阵TRAF ,从而不显示向TQBS 加入的假想数据传输量,而只显示

原始的数据传输需求。

model "G-5 Satellite scheduling"

uses "mmxprs"

declarations

TRANSM = 1..4 ! 发射站集合

RECV = 1..4 ! 接收站集合

TRAF: array(TRANSM,RECV) of integer ! 地面站之间的数据传输

TQBS: array(TRANSM,RECV) of integer ! 类双随机数据传输矩阵

row: array(TRANSM) of integer ! 数据传输矩阵每行和

col: array(RECV) of integer ! 数据传输矩阵每列和

LB: integer ! 数据传输矩阵列和和行和的 大值

end-declarations

Page 283: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

272

initializations from ‘g5satell.dat’

TRAF

end-initializations

! 求数据传输矩阵列和与行和

forall(t in TRANSM) row(t):= sum(r in RECV) TRAF(t,r)

forall(r in RECV) col(r):= sum(t in TRANSM) TRAF(t,r)

LB:=maxlist(max(r in RECV) col(r), max(t in TRANSM) row(t))

! 计算 TQBS

forall(t in TRANSM,r in RECV) do

q:= minlist(LB-row(t),LB-col(r))

TQBS(t,r):= TRAF(t,r)+q

row(t)+=q

col(r)+=q

end-do

declarations

MODES: range

flow: array(TRANSM,RECV) of mpvar ! 如果从 t 到 r 进行传输,则为 1,否则为 0

pmin: mpvar ! 小数据传输量

onerec, minexchg: array(TRANSM) of linctr ! 发射站的约束与 小数据传输量

onerec: array(RECV) of linctr ! 接收站约束

solflowt: array(TRANSM,MODES) of integer ! 每次迭代求得的解

solflowr: array(RECV,MODES) of integer ! 每次迭代求得的解

solpmin: array(MODES) of integer ! 每次迭代获得的目标函数值

end-declarations

forall(t in TRANSM,r in RECV) flow(t,r) is_binary

ct:= 0

while(sum(t in TRANSM,r in RECV) TQBS(t,r) > 0) do

ct+=1

! 每个发射站都只有一个接收站

forall(t in TRANSM) onerec(t):= sum(r in RECV | TQBS(t,r)>0) flow(t,r) =1

! 每个接收站都只有一个发射站

forall(r in RECV) onetrans(r):= sum(t in TRANSM | TQBS(t,r)>0) flow(t,r) =1

Page 284: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

273

! 小数据传输量

forall(t in TRANSM)

minexchg(t):= sum(r in RECV | TQBS(t,r)>0) TQBS(t,r)*flow(t,r) >= pmin

! 求解此问题: 大化 小数据传输量

maximize(pmin)

! 打印输出求解结果

writeln("Round ", ct, " objective: ", getobjval)

! 保存求解结果

solpmin(ct):= round(getobjval)

forall(t in TRANSM,r in RECV | TQBS(t,r)>0)

if(getsol(flow(t,r))>0) then

solflowt(t,ct):= t

solflowr(t,ct):= r

end-if

! 更新 TQBS

forall(t in TRANSM)

TQBS(solflowt(t,ct),solflowr(t,ct)) -= solpmin(ct)

end-do

! 打印求解结果

writeln("\nTotal duration: ", sum(m in MODES) solpmin(m))

write(" ")

forall(i in 0..ceil(LB/5)) write(strfmt(i*5,5))

writeln

forall(t in TRANSM) do

write("From ", t, " to: ")

forall(m in MODES)

forall(i in 1..solpmin(m)) do

write(if(TRAF(solflowt(t,m),solflowr(t,m))>0, string(solflowr(t,m)),"-"))

TRAF(solflowt(t,m),solflowr(t,m))-=1

end-do

writeln

end-do

end-model

12.5.3 结果

下表给出了各次进行混合整数规划求解得到的TQBS 矩阵的内容。用方框标记

Page 285: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

274

的元素即为此模式中选中的元素。在对应的表格上方给出了每个模式的持续时间

minp 。

表格 12.10:将TQBS 分解为模式

图 12.7:带有和不带有假想数据的调度方案

在 8 次迭代之后分解结束,得到的调度方案的时间长度即为期望的长度

45=LB 。图 12.7 的上半部分显示了对加入了假想数据传输量之后的传输矩阵

Page 286: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

275

TQBS 的调度方案,下半部分显示了不加入假想的数据传输量的原传输矩阵TRAF

的调度方案。

12.6 GSM 基站选址

有一个移动电话运营商计划在一个目前尚未覆盖的区域开展业务。管理层计划投

资一千万元来为此区域购置安装设备。调查表明,在此区域有 7 个位置可以安设基

站,每个基站只能覆盖一定数目的社区。图 12.8 是对此区域的示意图,其中将此区

域划分未若干个社区,并标出了可以设置基站的位置。每个候选的位置都用黑点表示,

并用数字标号,每个社区表示为一个多边形。多边形中的数字即此社区的序号。

由于地理位置和拓扑结构的限制,每个位置建造基站的费用不同,且覆盖范围也

不同。表 12.11 列出了每个基站位置能够覆盖的社区以及每个位置的建造费用。

图 12.8:待覆盖区域地图

已知每个社区内的居民数目(表 12.12)。应在何处设置基站才能够使用给定的

一千万预算覆盖尽可能多的人口?

表格 12.11:每个位置的建造费用和覆盖社区

位置 1 2 3 4 5 6 7

费用(百万欧元) 1.8 1.3 4.0 3.5 3.8 2.6 2.1

覆盖社区 1,2,4 2,3,5 4,7,8,10 5,6,,8,9 8,9,12 7,10,11,12,15 12,13,14,15

表格 12.12:社区居民数

社区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

人口(千人) 2 4 13 6 9 4 8 12 10 11 6 14 9 3 6

Page 287: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

276

12.6.1 模型的数学表达

令COMMS 为社区集合,PLACES 为可以建造基站的位置集合,BUDGET 为

可用预算总额。我们用 pCOST 表示在位置 p 处建造基站的费用, cPOP 表示社区 c 的

人口,二值变量 pcCOVER 表示位置 p 处的基站能否覆盖社区 c(如果能够覆盖,则

1=pcCOVER ,否则 0=pcCOVER )。此外还需要两组二值变量:变量 ceredcov ,

当且仅当社区 c 被某个基站覆盖时取值才为 1;变量 pbuild ,当切仅当在位置 p 处建

造了基站时取值才为 1。

我们首先写出社区覆盖的约束条件。我们需要表示出等价关系“社区 c 能够收到

GSM 信号<=>至少在一个能够覆盖此社区的位置上修建了基站”或“ 1=ceredcov

<=> 至少有一个 p 能够使 1=⋅ ppc buildCOVER ”。此等价关系无法直接表示为线性

形式。由于一个社区可能同时被多个基站覆盖,约束条件(12.6.1)即指定

ppc buildCOVER ⋅ 的和大于或等于 ceredcov ,从而表示出了此等价关系的一个方

向。

COMMSc∈∀ : cPLACESp

ppc eredcovbuildCOVER ≥⋅∑∈

(12.6.1)

通过 大化覆盖人口(12.6.2),可以保证等价关系的另一个方向也成立。如果

建造了覆盖某一区域 c 的基站,则优化算法将使 ceredcov 不再取值为 0。

此外也需要满足预算要求。约束条件(12.6.4)即限制所有基站的总建设费用不

超过给定的 高预算。 终,约束条件(12.6.5)和(12.6.6)规定所有变量均为二

值变量。

maximize ∑∈

⋅COMMSc

cc eredcovPOP (12.6.2)

COMMSc∈∀ : cPLACESp

ppc eredcovbuildCOVER ≥⋅∑∈

(12.6.3)

BUDGETbuildCOSTPLACESp

pp ≤⋅∑∈

(12.6.4)

COMMSc∈∀ : { }10,eredcov c ∈ (12.6.5)

PLACESp∈∀ : { }10,build p ∈ (12.6.6)

Page 288: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

277

12.6.2 模型实现

上述数学模型可以直接转化为下面的 Mosel 程序。矩阵COVER 将以稀疏形式

保存在数据文件中(即只保存值为 1 的数组元素)。

model "G-6 Transmitter placement"

uses "mmxprs"

declarations

COMMS = 1..15 ! 社区集合

PLACES = 1..7 ! 候选基站位置集合

COST: array(PLACES) of real ! 基站建造成本

COVER: array(PLACES,COMMS) of integer ! 基站覆盖范围

POP: array(COMMS) of integer ! 居民数目(千人)

BUDGET: integer ! 预算限制

build: array(PLACES) of mpvar ! 如果建造基站,则为 1,否则为 0

covered: array(COMMS) of mpvar ! 如果能够覆盖此社区,则为 1,否则为 0

end-declarations

initializations from ‘g6transmit.dat’

COST COVER POP BUDGET

end-initializations

! 目标函数:覆盖总人口

Coverage:= sum(c in COMMS) POP(c)*covered(c)

! 覆盖社区

forall(c in COMMS) sum(p in PLACES) COVER(p,c)*build(p) >= covered(c)

! 预算限制

sum(p in PLACES) COST(p)*build(p) <= BUDGET

forall(p in PLACES) build(p) is_binary

forall(c in COMMS) covered(c) is_binary

! 求解此问题

maximize(Coverage)

end-model

Page 289: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

278

12.6.3 结果

求解此问题可以得到,基站能够覆盖的 大人数为 109,000 人。此时在四个位

置建造了基站,即位置 2,4,6,7。这些基站没有能够覆盖社区 4。此方案需要预

算为 950 万元,未超过预算。

在现实中基站选址时还需要考虑一些其他因素。相邻两个基站通常会同时覆盖某

一区域:此重叠区域不应过大(投入产出比低),也不应太小(需要有一定重叠区域

才能进行呼叫交接)。另一个典型问题是基站设置的位置必须能够避免产生电磁干扰。

12.7 参考文献和进阶阅读

Sansò 等 近的工作[SS98]专致于电信网络设计中的优化问题。在 12.1 节中讨

论的独立路由问题是一个图的连接性的问题。对于无向图,如果其中任意一对结点之

间至少存在 k 条独立的链路,则称此图是结点 k 连通的。在 Basse[Baa88]和Prins[Pri94a]的书中都给出了高效的单连通和 2 连通图算法。Papadimitriou 等[PS98]和 Ahuja 等[AMO93]的著作中研究了更一般的情况。

第 12.2 节中研究如何将移动电话中继站连接到环形中心网络上这个问题,在

Dutta 等的文章[DK99]中也研究了这个问题。第 13 节所讨论的 大化网络总通量的

问题是一个多物品网络流(MCNF)问题。Gondran[GM90]和 Ahuja 等[AMO93]都给出了主要的 MCNF 问题和其解法。对于大型电信网络的问题,Minoux[Min75]给出

了一个适用的 MCNF 算法,Gersht 等人[GS87]也给出了 小费用 MCNF 问题的算

法。在[BHJS95]中给出了解决电信业中 MCNF 问题的列生成方法。

第 12.4 节中的有线网络问题是一个经典的 小权重生成树(minimum weight spanning tree)问题。使用线性规划/混合整数规划对此问题进行建模非常繁琐,并

且只能应用于较小规模的问题(结点数 20≤n )。实际上使用图算法可以很容易地对

这类问题进行求解,例如 Prim 采用的算法的复杂度为 ( )2nO ,或者 Kruskal 采用的

算法复杂度为 ( )nlogmO ,其中m 表示边的数目。Ahuja 等的著作[AMO93]中对这两

种算法都进行了介绍。

第 12.5 节中所处理的通过卫星进行电信通信的问题是一个车间调度问题(开放

式车间)。发射站即对应于机器,接收站即对应于要生产的产品。 trTRAF 表示在机器

t 上生产产品 r 所需的处理时间。一台机器一个时刻只能生产一种产品,一种产品在

一个时刻只能在一台机器上生产。与第 7 章的流水线车间或任务车间问题不同,在

这个问题中产品在不同机器上处理的顺序是任意的。目标函数是找出能够 小化总生

产时间的调度方案。

如果允许抢先,则开放式车间问题是一个 NP-hard 问题。若超过 10 台机器/10种产品,则需要采用启发式算法进行求解。请参考 Gueret 和 Prins 的工作[GP98]。开放式车间的主要变形形式出现在卫星通信中,在 Prins 的综述文章[Pri94b]中对此

进行了介绍。Scott 等在[SSR00]中给出了一个进行长期交通规划的例子,并使用数

Page 290: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

279

学规划对其进行求解。在的 12.5.1 节开头提出了非抢先情况下的瓶颈分配模型,它

具有三元索引,这个模型实际上来源于 Balas 和 Landweer 的文章[BL83]。

第 12.6 节中的 GSM 基站选址问题是一个覆盖问题。我们给出的这个问题与覆

盖和划分问题关系很密切,后者是经典的 0-1(混合)整数规划,在第 15 章的“参

考文献和进阶阅读”一节中对此进行了总结。我们在第 15 章也讨论了一个划分问题

(选区问题),在第 9 章讨论了另一个类型的覆盖问题(金属板切割)。

尽管覆盖问题是 NP-hard 问题,但由于单纯形问题找到的 优线性规划解中大

部分二值变量都能够取得整数值,从而使可以很容易地对剩余的小数变量进行树搜

索,因此这种问题相对容易进行求解。请参考 Beasley[Bea87]的工作。可以对具有

几百个变量的问题求得 优解。 近也提出了一些基于线性规划/混合整数规划的启

发式算法[CFT99],能够求解规模很大的覆盖问题。Syslo 在[SDK83]中描述了两种类

型问题的启发式算法以及精确树搜索方法,并给出了 Pascal 源代码。

Page 291: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions
Page 292: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

281

第 13 章 经济和金融

经济学家通常需要处理不确定的数据,因此很自然地采用统计的工具,但很多时

候只采用一个简单的数学模型就能够快速地求解出具有很多变量的问题的 优解。然

后就可以更改其中的一些参数(不确定的参数)来重新进行优化。此时数学规划就成

为一个非常有效的仿真工具。本章中所讨论的问题包括金融和市场营销中的一些实际

问题,目的在于为企业的财务决策者提供帮助,但个人也能从本章的内容中受益。

第 13.1 章将介绍一个贷款选择的问题。第 13.2 节和 13.5 节将研究如何 优地

使用给定数目的预算。在前一个问题中,我们将要对一个广告宣传计划进行组织;在

后一个问题中,我们将 大化一个家庭能够用于娱乐的支出。在第 13.6 节中我们将

为一个公司选择计划在未来一段时间内执行的发展方案,以使在不超过每年年度预算

的前提下产生 大的效益。第13.3节和13.7节中讨论的问题都是 优投资组合问题,

但其要求标准不同(前者要求 大总收益,后者要求 小方差)。第 13.7 节中的问题

的目标函数为二次函数,这一点使它与其他问题都不同。在这两个投资问题中,我们

都将看到如何通过更改某些参数来多次运行模型(进行仿真)。在第 13.4 节中我们也

将进行多时期的投资选择,但具有不同的目标:在每个时期中都需要能够有一笔资金

用于资助一个提前退休计划。

13.1 贷款选择

Chic 先生是一个服装连锁店的主管,他希望开办三家新商店:一家在伦敦,一

家在慕尼黑,一家在罗马。开办这些商店分别需要 250 万,100 万,和 170 万欧元。

为对此计划进行融资,Chic 先生与三家银行进行了联系。

表格 13.1:三家银行对各个项目的贷款利率

伦敦的商店 慕尼黑的商店 罗马的商店

银行 1 5% 6.5% 6.1%

银行 2 5.2% 6.2% 6.2%

银行 3 5.5% 5.8% 6.5%

根据商店的位置和对相关风险的评估,每家银行都决定至多提供 8 年期总值为

300 万欧元的贷款,但对不同商店项目的利率各不相同(表 13.1)。请制定从这些银

行进行贷款的方案,以使每个商店都能得到所需的资金,并且使总支出 小。

13.1.1 模型的数学表达

令 bsborrow 为从银行b 为商店项目 s 贷款的金额。用 BANKS 和 SHOPS 分别

表示银行集合和新商店集合。用 DUR 表示还款期限,VMAX 表示每个银行发放的

Page 293: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

282

贷款总额上限, bsRATE 为银行b 向商店项目 s 贷款的利率, sPRICE 为开办商店 s 需

要的费用。则此问题的数学模型可以表示为以下形式:

minimize ( )∑ ∑

∈ ∈−+−

⋅BANKSb SHOPSs

DURbs

bsbs RATE

RATEborrow

11 (13.1.1)

SHOPSs∈∀ : sBANKSb

bs PRICEborrow =∑∈

(13.1.2)

BANKSb∈∀ : VMAXborrowSHOPSs

bs ≤∑∈

(13.1.3)

SHOPSs,BANKSb ∈∈∀ : 0≥bsborrow (13.1.4)

目标是 小化 Chic 先生的总支出,即 小化每年各项贷款还款金额之和。如果

从银行b 为商店 s 贷款的金额为 bsborrow ,利率为 bsRATE ,还款期限为 DUR 年,

则 Chic 先生每年需要为此商店向银行b 还款的金额可以按照此关系进行计算:为商

店 s 向银行b 的贷款的每年还款金额为 bspay ,则所有 DUR 年还款总额的现值应等

于贷款金额 bsborrow :

( )( )

b

DURb

bs

DUR

tt

b

bs

RATERATE

payRATEpay

borrowbs−

=

+−⋅=

+= ∑ 11

11

(13.1.5)

将此等式两边都除以右面的分数表达式,可以得到对于每年的还款金额 bspay 有

如下等式:

( ) bsDURb

b payRATE

RATEborrowbs =

+−⋅ −11

(13.1.6)

对于每个商店 s ,在 DUR 年中每年需要向每个银行b 还款的金额为 bspay 。但

是由于每年的还款金额都相同,因此只须 小化一年的还款总额。因此可以得到目标

函数即为 bspay 对所有b 和所有 s 的和。用(13.1.6)式左边的表达式代替 bspay ,

可以将目标函数表示为(13.1.1)。

每个商店都应得到足够的资金,即表示为每个商店 s 贷款的总额应等于开办此商

店的支出 sPRICE 。式(13.1.2)即表示出了这个约束条件。约束条件(13.1.3)表

明每个银行的贷款总额不能超过VMAX ,约束条件(13.1.4)要求所有变量均为非

负值。

Page 294: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

283

13.1.2 模型实现

下面的 Mosel 程序即实现了上述数学模型。

model "H-1 Loan choice"

uses "mmxprs"

declarations

BANKS = 1..3 ! 银行集合

SHOPS = {"London", "Munich", "Rome"} ! 商店集合

DUR: integer ! 还款期限

PRICE: array(SHOPS) of integer ! 开办商店的支出

RATE: array(BANKS,SHOPS) of real ! 银行贷款利率

VMAX: integer ! 每个银行贷款总额上限

borrow: array(BANKS,SHOPS) of mpvar ! 每个银行为每个项目发放的贷款金额

end-declarations

initializations from 'h1loan.dat’

PRICE RATE VMAX DUR

end-initializations

! 目标函数:偿还的利息

Interest:=

sum(b in BANKS, s in SHOPS) borrow(b,s)*RATE(b,s)/(1-(1+RATE(b,s))^(-DUR))

! 所有项目都应得到足够资金

forall(s in SHOPS) sum(b in BANKS) borrow(b,s) = PRICE(s)

! 每个银行发放总贷款不能超过上限

forall(b in BANKS) sum(s in SHOPS) borrow(b,s) <= VMAX

! 求解此问题

minimize(Interest)

end-model

13.1.3 结果

为 小化总支出,位于伦敦的商店(商店 1)的资金应全部从银行 1 贷款得到,

位于慕尼黑的商店(商店 2)的资金应全部从银行 3 贷款得到。位于罗马的商店(商

店 3)的资金应从银行 1 贷款 50 万欧元,从银行 2 贷款 120 万欧元。每年还款总额

为 822,181 欧元。

Page 295: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

284

13.2 广告宣传

Pronuevo 公司是一家小公司,它 近将一种新产品投放到某个地区的市场中,

并且希望通过各种媒体对此产品进行宣传。因此该公司与当地的一家专门从事这种地

区宣传的广告代理商 PRCo 进行了联系,并将此任务完全托付给对方,预算金额总

数为 250,000 欧元。此广告代理商对当地市场有充分的了解,即了解通过各种媒体,

如杂志,广播电台,或电视台等进行的宣传能够让多少人了解此产品。广告公司建议

在六种不同的媒体上进行两个月的宣传。对于每种媒体,广告公司都了解在其上进行

广告的成本以及此媒体能够影响到的人数。此外每种媒体的影响指数也已知。

广告公司也了解每种媒体的 大使用量(如,电视台广告播放次数不能超过 8次)。下面的表 13.2 列出了这些信息。Pronuevo 公司希望此广告宣传计划至少能够

影响 100,000 人。应如何选择这些媒体的组合才能够使广告的总影响指数 高?

表格 13.2:媒体广告详细信息

编号 媒体类型 影响人数 单位费用 大使用量 影响指数

1 周报 12,000 1,500 4 个星期 3

2 月刊 1,500 8,000 2 个月 7

3 周刊 2,000 12,000 8 个星期 8

4 电台广播 6,000 9,000 60 次播放 2

5 4*3 米的户外广

告牌

3,000 24,000 4 个广告牌 6

6 电视台 9,000 51,000 8 次播放 9

13.2.1 模型的数学表达

用 MEDIA 表示在此宣传活动中可以使用的媒体集合。常数 mREACH ,

mCOST , mMAXUSE 和 mSCORE 分别表示媒体m 的影响人数,单位费用, 大使

用量,以及影响指数。决策变量 muse 即为在此宣传活动中媒体m 的使用量。

首先,需要满足预算约束:约束条件(13.2.2)即要求各种媒体的总广告支出不

能超过总预算 BUDGET 。每种媒体的使用量不能超过其 大可用量(约束条件

(13.2.3))。此外还需要使广告影响的总人数达到目标人数TARGET ,即各种媒体

能够影响的人数总和应至少等于目标人数 100,000(约束条件(13.2.4))。目标函数

为(13.2.1),即 大化所使用的各种媒体的影响指数总和。决策变量 muse 的取值必

须为整数,即有约束条件(13.2.5)。

maximize ∑∈

⋅MEDIAm

mm useSCORE (13.2.1)

BUDGETuseCOSTMEDIAm

mm ≤⋅∑⋅

(13.2.2)

Page 296: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

285

MEDIAm∈∀ : mm MAXUSEuse ≤ (13.2.3)

TARGETuseREACHMEDIAm

mm ≥⋅∑⋅

(13.2.4)

MEDIAm∈∀ : Nusem ∈ (13.2.5)

13.2.2 模型实现

可以用一种非常简单的但是非通用的方法来实现这个模型,但我们选择使用通用

的形式(从文件中读入数据数组),这样在将来若需进行扩展,则可以很容易地对模

型进行修改。

model "H-2 Publicity"

uses "mmxprs"

declarations

MEDIA = 1..6 ! 媒体类型集合

REACH: array(MEDIA) of integer ! 各种媒体影响人数

COST: array(MEDIA) of integer ! 各种媒体单位成本

MAXUSE: array(MEDIA) of integer ! 各种媒体 大可用量

SCORE: array(MEDIA) of integer ! 各种媒体的影响指数

BUDGET: integer ! 可用预算

TARGET: integer ! 希望影响的人数

use: array(MEDIA) of mpvar ! 各种媒体实际使用量

end-declarations

initializations from ‘h2publ.dat’

REACH COST MAXUSE SCORE BUDGET TARGET

end-initializations

! 目标函数:广告的总影响指数

Perceive:= sum(m in MEDIA) SCORE(m)*use(m)

! 预算限制

sum(m in MEDIA) COST(m)*use(m) <= BUDGET

! 影响人数限制

sum(m in MEDIA) REACH(m)*use(m) >= TARGET

forall(m in MEDIA) do

use(m) is_integer

Page 297: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

286

use(m) <= MAXUSE(m)

end-do

! 求解此问题

maximize(Perceive)

end-model

13.2.3 结果

通过上述程序我们可以求解出 大总影响指数为 122。此时用完了所有预算,能

够影响的人数总和为 103,000 人。下表列出了计划的详细信息,使用了除了电视之

外的其他媒体类型。由于此问题规模不大,因此可以直接采用线性规划求出整数解。

表格 13.3:在各种类型媒体上的广告次数

媒体类型 使用次数

周报 4

月刊 2

周刊 8

电台广播 4

4*3 米的户外广告牌 4

电视台 0

我们应注意到本节所讨论的问题较真实情况简化了很多。例如,电台广告的有效

性不大可能与广告的播放次数成比例。不同媒体上的广告之间也不可能相互毫无关

系。在实际应用中,需要采用更为复杂的模型。

13.3 投资选择

有一个理财顾问需要帮助他的一个富有的女客户选择几种股票进行投资。此客户

希望购买总值为 100,000 欧元的 6 支不同股票。顾问将为其估算在六个月中可能得

到的投资回报。下表列出了每支股票的国家,类型(T:技术股,N:非技术股),以

及期望收益率(ROI)。此客户还有一些其他的要求。她希望在每支股票上至少投入

5,000 欧元,至多投入 40,000 欧元。此外还要求将一半的资金投入到欧洲的股票中,

并且至多 30%的资金用于购买技术股。那么应如何在各支股票之间分配此资金才能

够使投资回报 高?

表格 13.4:股票列表

编号 国别 类型 期望收益率

1 日本 T 5.3%

2 英国 T 6.2%

3 法国 T 5.1%

4 美国 N 4.9%

5 德国 N 6.5%

6 法国 N 3.4%

Page 298: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

287

13.3.1 模型的数学表达

我们用 SHARES 表示可供选购的股票集合,CAPITAL 表示需要进行投资的资

本总量, sRET 表示股票 s 的期望收益率。 EU 表示欧洲的股票子集,

TECHNOLOGY 表示技术股子集。决策变量 sbuy 即购买股票 s 的金额。对每个决

策变量都有上下界,即每支股票投资金额至少为 5000=VMIN ,至多为

40000=VMAX 。约束条件(13.3.1)即表示变量 sbuy 具有此上下界。

SHARESs∈∀ : VMAXbuyVMIN s ≤≤ (13.3.1)

用于购买技术股的金额至多只能为总投资额的 30%,即不能超过 30,000 欧元,

因此有约束条件(13.3.2)。客户也要求至少 50%的资本用于购买欧洲的股票,即至

少为 50,000 欧元,因此有约束条件(13.3.3)。

CAPITAL.buyTECHNOLOGYs

s ⋅≤∑∈

30 (13.3.2)

CAPITAL.buyEUs

s ⋅≥∑∈

50 (13.3.3)

约束条件(13.3.8)将限制总投资金额必须等于初始资本总额CAPITAL 。约束

条件(13.3.9)是常见的非负性约束。目标函数为(13.3.4),即 大化所有股票的

总收益。

maximize ∑∈

⋅SHARESs

ss buy

RET100

(13.3.4)

SHARESs∈∀ : VMAXbuyVMIN s ≤≤ (13.3.5)

CAPITAL.buyTECHNOLOGYs

s ⋅≤∑∈

30 (13.3.6)

CAPITAL.buyEUs

s ⋅≥∑∈

50 (13.3.7)

CAPITALbuySHARESs

s =∑∈

(13.3.8)

SHARESs∈∀ : 0≥sbuy (13.3.9)

通过与客户进一步讨论发现,客户不希望向顾问所给出的每支股票都投资

VMIN 。客户不希望持有的股份太少,即如果购买了一个公司的股票,则至少要投

资 5,000 欧元,否则将完全不购买此股票。因此需要对模型进行相应修改:我们不再

约束每个变量 sbuy 取值介于VMIN 和VMAX 之间,而是要求此变量取值为 0 或介

于此范围之间。这种类型的变量称为半连续变量。这样在新的模型中,就可以用下面

Page 299: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

288

的(13.3.10)式取代约束条件(13.3.5):

SHARESs∈∀ : VMAXbuyVMINbuy ss ≤≤∨= 0 (13.3.10)

13.3.2 模型实现

上述数学模型可以直接转化为下面的 Mosel 程序。在此模型实现中,我们将对

技术股和欧洲股的购买限制表示为模型的参数(MAXTECH 和 MINEU)。类似地,

上下界 VMIN 和 VMAX 也定义为模型参数。

model "H-3 Portfolio"

uses "mmxprs"

parameters

MAXTECH = 0.3 ! 技术股投资上限

MINEU = 0.5 ! 欧洲股投资下限

VMIN = 5000 ! 每支股票投资金额的 小值

VMAX = 40000 ! 每支股票投资金额的 大值

end-parameters

declarations

SHARES = 1..6 ! 股票集合

RET: array(SHARES) of real ! 预期投资收益

CAPITAL: integer ! 投资资本总额

EU: set of integer ! 欧洲股集合

TECHNOLOGY: set of integer ! 技术股集合

buy: array(SHARES) of mpvar ! 每支股票投资额

end-declarations

initializations from 'h3portf.dat’

RET CAPITAL EU TECHNOLOGY

end-initializations

! 目标函数:总收益

Return:= sum(s in SHARES) RET(s)/100*buy(s)

! 对投资组成的要求

sum(s in TECHNOLOGY) buy(s) <= MAXTECH*CAPITAL

sum(s in EU) buy(s) >= MINEU*CAPITAL

! 总投资金额

sum(s in SHARES) buy(s) = CAPITAL

Page 300: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

289

forall(s in SHARES) do

VMIN <= buy(s)

buy(s) <= VMAX

end-do

! 求解此问题

maximize(Return)

end-model

为将变量 buy(s)定义为半连续变量,我们需要将下界约束条件

VMIN <= buy(s)

替换为

buy(s) is_semcont(VMIN)

13.3.3 结果

对此问题进行求解可以得到向各支股票投资的金额。对于 初的问题表达,六个

月的总期望投资收益为 5,755 欧元;在使用半连续变量后,此总收益为 5,930 欧元。

这些资金将按下表所示进行分配。

表格 13.5: 优投资方案

投资金额(欧元)

股票编号 VMINbuys ≥ sbuy 为半连续变量

1 5,000 0

2 20,000 30,000

3 5,000 0

4 25,000 30,000

5 40,000 40,000

6 5,000 0

在本章引言时我们就提到,在金融业应用中可以使用数学规划进行仿真。在这个

例子中,如果技术股的投资上限变为 40%则会如何?由于我们将对应的上限

MAXTECH 定义为模型的参数,因此不需要修改 Mosel 程序就可以使用此新的值进

行计算。可以在调用 Mosel 时设置新的参数值。借助于 Mosel 命令行解释器,可以

使用下面的命令来执行模型:

mosel -c "exec h3portf ‘MAXTECH=0.4’"

更改了技术股的投资上限之后,第一个模型的期望的收益即变为 5,885 欧元(第

二个模型为 6,060 欧元)。与前一个模型相比,将原购买股票 4 的 10,000 欧元转用

于购买股票 2,其他都不变。通过更改模型的参数(可以同时设置模型的多个参数),

此顾问即可以满足客户的需求。

Page 301: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

290

13.4 为提前退休计划筹集资金

国家农业银行(National Agricultural Bank,NAB)希望为十五名将要提前退休

的员工制定一项提前退休计划。这些员工将要在从明年开始的七年内逐渐退休完。为

了给这个提前退休计划筹集资金,此银行决定在这七年期间进行债券投资。表 13.6给出了每年应向这些提早退休的员工支付的金额,这些金额必须在每年年初支付。

表格 13.6:每年要求金额

年 1 2 3 4 5 6 7

金额(千欧元) 1000 600 640 480 760 1020 950

此银行计划购买三种不同类型的债券,即 SNCF 公司(法国国营铁路公司)的

债券,Fujutsu(富士通)公司的债券,以及国债。未投资于这些债券的资金将作为

储蓄保存,储蓄的利率为 3.2%。表 13.7 列出了各个债券的收益,时间长度,以及价

格等信息。这些债券只能按整数数目进行购买,并且一旦购买之后在债券期限内即无

法更改投资金额。每年只返回投资的利息。此退休计划的负责人决定只在第一年年初

购买债券,而在此后几年不再购买。应如何分配各个债券的投资金额才能够使得只需

花费 少的资金就能够满足此退休计划的要求?

表格 13.7:债券信息

债券 价值(千欧元) 利率 期限

SNCF 1.0 7.0% 5 年

Fujitsu 0.8 7.0% 4 年

国债 0.5 6.5% 6 年

13.4.1 模型的数学表达

令 { }NT,,YEARS K1= 为提早退休计划所覆盖的时期, BONDS 为债券集合,

capital 表示为满足此计划的资金需求而在第一年需要投资的总金额。令 bVALUE 为

债券b 的单位价格, bDUR 为其年限, bRATE 为其年利率。用变量 bbuy 表示在第一

年年初购买债券b 的数量,变量 tinvest 表示在第 t 年时储蓄形式而非债券形式的投资

金额。用 tDEM 表示此提早退休计划在第 t 年需要的资金金额。

下面是约束条件的一般原则:每年返回的利息需应等于当年的储蓄投资额与退休

计划要求的金额之和。约束条件(13.4.1)是第一年的情况,即购买债券当年的情况。

投资的总金额减去购买债券的金额再减去第一年的储蓄金额之后应等于第一年此退

休计划要求的金额。

11 DEMinvestbuyVALUEcapitalBONDSb

bb =−⋅− ∑∈

(13.4.1)

Page 302: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

291

由于在下面三年中没有债券到期,因此不会再向债券进行投资,但每年都将收到

债券的利息(约束条件(13.4.2)的第一个求和项)。在后续年份中我们也将收到前

一年储蓄的本金和利息。对于这些收益,我们可以从其中减去这一年的储蓄投资和退

休计划需用的资金,则可以达到平衡状态,因此有约束条件(13.4.2)。

42 ,,t K=∀ :

t

ttBONDSb

bbb

DEM

investinvest.RATEbuyVALUE

=

−⋅⎟⎠⎞

⎜⎝⎛ ++⋅⋅ −

∈∑ 1100

231100

(13.4.2)

在第 5 年年初,Fujutsu 的债券到期,在第 6 年年初,SNCF 的债券到期。因此

投资于对应债券中的资本即被返还,从而可以用于新的投资。对于所有尚未到期的债

券,在每年年初也将返还其对应的利息。约束条件(13.4.3)的其他部分都与(13.4.2)相同。

65,t =∀ :

ttt

tDURBONDSb

bbb

tDURBONDSb

bbb

DEMinvestinvest.

RATEbuyVALUE

RATEbuyVALUE

b

b

=−⋅⎟⎠⎞

⎜⎝⎛ +

+⋅⋅

+⎟⎠⎞

⎜⎝⎛ +⋅⋅

≥∈

−=∈

1

1

100231

100

1001

(13.4.3)

在 后一年时,只有 6 年期的国债仍然在期限内。第 6 年结束时,我们将收回

国债本息和前一年储蓄的本息,并不再进行新的储蓄。因此有约束条件(13.4.4)。

7

6

6100

231100

1

DEM

invest.RATEbuyVALUE

bDURBONDSb

bbb

=

⋅⎟⎠⎞

⎜⎝⎛ ++⎟

⎠⎞

⎜⎝⎛ +⋅⋅∑

=∈ (13.4.4)

除了约束条件(13.4.1)-(13.4.4)之外,我们还需要加入目标函数(13.4.5),即 小化 初投入的资本,并需要声明各个变量的定义域。

minimize capital (13.4.5)

0≥capital (13.4.6)

YEARSt∈∀ : 0≥tinvest (13.4.7)

BONDSb∈∀ : Nbuyb ∈ (13.4.8)

Page 303: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

292

13.4.2 模型实现

在下面的 Mosel 程序中,将把第 2 年到第 7 年的每年余额归结为同一个约束条

件表达式,其中通过内联的 if 函数选择对应的约束条件项。为简化约束条件的表达,

我们定义一个辅助数组 RET,表示每年每个债券的利息。

model "H-4 Retirement"

uses "mmxprs"

declarations

BONDS = {"SNCF","Fujitsu","Treasury"} ! 债券集合

NT = 7 ! 规划期长度

YEARS = 1..NT

DEM: array(YEARS) of integer ! 退休计划每年资金需求

VALUE: array(BONDS) of real ! 债券单位价格

RATE: array(BONDS) of real ! 债券利息率

RET: array(BONDS) of real ! 每股债券每年利息

DUR: array(BONDS) of real ! 债券期限

INTEREST: real ! 其他投资的利息

buy: array(BONDS) of mpvar ! 购买债券的数目

invest: array(YEARS) of mpvar ! 每年的其他投资

capital: mpvar ! 需用资本总量

end-declarations

initializations from 'h4retire.dat’

DEM VALUE RATE DUR INTEREST

end-initializations

forall(b in BONDS) RET(b):= VALUE(b)*RATE(b)/100

! 每年余额

capital -sum(b in BONDS) VALUE(b)*buy(b) -invest(1) = DEM(1)

forall(t in 2..NT)

sum(b in BONDS | DUR(b)+1>=t) (RET(b)*buy(b) +

if(DUR(b)+1=t, VALUE(b)*buy(b), 0)) +

(1+INTEREST/100)*invest(t-1) -if(t<NT, invest(t), 0) = DEM(t)

forall(b in BONDS) buy(b) is_integer

! 求解此问题: 小化投资金额

Page 304: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

293

minimize(capital)

end-model

13.4.3 结果

初需要投资的金额为 4548.92千欧元。 优方案是购买 911份SNCF债券(911千欧元),747 份 Fujutsu 债券(597.6 千欧元),和 1760 份国债(880 千欧元)。下

表列出了前六年中每年的储蓄投资金额。

表格 13.8:每年储蓄金额

年 1 2 3 4 5 6

金额(千欧元) 1160.317 760.249 307.379 0.017 0.420 12.403

13.5 家庭预算

在一户人家中妈妈希望使用儿子的计算机来帮助自己进行家庭理财。她从网上找

到了一个优化软件,使用此软件能够为安排每年的家庭预算建立一个数学模型。她已

经列出了每月的支出和收入。每月的生活费为 550 欧元。房租为每月 630 欧元。此

外还有电话开支,每两个月为 135 欧元;燃气和用电费用,每六个月为 850 欧元;

汽车开支,每个月为 340 欧元;缴税,每四个月为 100 欧元。收入为国家对有儿童

家庭的每个月 150 欧元的补助,以及每个月 1900 欧元的工资。妈妈知道每个月至少

要花 165 欧元用于各种娱乐活动(大孩子去游泳池的门票,小孩子去参加足球俱乐

部,以及她自己要去健身馆),但她还希望能有更多的娱乐(下饭馆,看电影,度假)。

应怎样安排每年的预算才能使可用于娱乐的预算 多?

13.5.1 模型的数学表达

令MONTHS 为一年 12 个月的集合,ITEMS 为各项支出类型。用 iEXPENSE

表示一项支出的金额, iFREQ 表示此项支出的时间频率(例如, 6=iFREQ 表示这

是一项每六个月的支出)。工资表示为 INCOME ,补助金表示为 ALLOW 。我们使

用两组变量: mhobby ,表示在第m 月中用于娱乐的金额; msave ,表示第m 月的

积蓄。在每个月里,这个家庭都希望娱乐费用至少为 165=HMIN 欧元。可以将此

表示为约束条件(13.5.1)。

MONTHSm∈∀ : HMINhobbym ≥ (13.5.1)

为让此家庭生活正常,必须对收支加以平衡。每月的支出不能超过当月的收入,

但可以将当月的部分收入保存下来以应对某个月开销较大的情况。约束条件(13.5.2)式即规定每月的一般支出与积蓄及娱乐支出之和应小于或等于工资收入,国家补助,

Page 305: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

294

与前一月积蓄余额之和。由于没有给出在规划期开始时的积蓄余额(变量 0save ),

因此我们可以假定 初积蓄余额为 0。操作符mod 表示进行求余运算(如 7 mod 6 = 1,即 6 月期的支出将只计入 6 月和 12 月的预算支出)。

MONTHSm∈∀ :

∑=

∈−++≤++

0mod

1

iFREQmITEMSi

mmmi saveALLOWINCOMEhobbysaveEXPENSE (13.5.2)

目标函数为 大化每年可以用于娱乐的总金额,即(13.5.3)式。对变量 mhobby

的非负约束可以用(13.5.1)式取代。

maximize ∑∈MONTHSm

mhobby (13.5.3)

MONTHSm∈∀ : HMINhobbym ≥ (13.5.4)

MONTHSm∈∀ :

∑=

∈−++≤++

0mod

1

iFREQmITEMSi

mmmi saveALLOWINCOMEhobbysaveEXPENSE (13.5.5)

MONTHSm∈∀ : 0≥msave (13.5.6)

13.5.2 模型实现

这个模型非常类似于库存产品将从一个月延续到下一个月的生产规划模型。为处

理不同频率的各种支出,我们使用 Mosel 的运算符 mod。

对于 初的积蓄,我们可以定义一个变量 0save ,并将其值设置为 0,或者直接

将对应约束条件中的对应值设置为 0,如下所示。

model "H-5 Family budget"

uses "mmxprs"

declarations

MONTHS = 1..12 ! 时间段集合

ITEMS: set of string ! 开支项目集合

INCOME, ALLOW: integer ! 每月工资收入和国家补助

HMIN: integer ! 娱乐费用 小值

EXPENSE: array(ITEMS) of integer ! 各项支出金额

FREQ: array(ITEMS) of integer ! 各项支出频率(周期)

Page 306: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

295

hobby: array(MONTHS) of mpvar ! 实际每月娱乐费用

save: array(MONTHS) of mpvar ! 每月积蓄

send-declarations

initializations from ‘h5budget.dat'

INCOME ALLOW HMIN

[EXPENSE, FREQ] as ‘PAYMENT’

end-initializations

! 目标函数:娱乐费用

Leisure:= sum(m in MONTHS) hobby(m)

! 每月收支平衡

forall(m in MONTHS)

sum(i in ITEMS | m mod FREQ(i) = 0) EXPENSE(i) + hobby(m) +

save(m) <= INCOME + ALLOW + if(m>1, save(m-1), 0)

forall(m in MONTHS) hobby(m) >= HMIN

! 求解此问题

maximize(Leisure)

end-model

13.5.3 结果

在这一年中,此家庭在娱乐上共计支出 3,550 欧元。下表列出了每月娱乐预算的

方案(有多个等价的方案)。

表格 13.9:每月娱乐支出与积蓄

月 1 2 3 4 5 6 7 8 9 10 11 12

娱乐支出 530 395 405 165 165 165 530 295 405 165 165 165

积蓄 0 0 125 255 620 0 0 0 125 355 720 0

13.6 发展计划选择

Tatayo 公司是意大利北部的一家大公司,专门从事汽车制造已经有十余年了。

此公司希望提升公司实力,于是开始在公司内部征求发展方案,并且要求方案必须能

在 5 年的规划期内完成。管理层在大量提案中选出了 5 个方案。每个方案每年都需

要一定的支出,并且都将在 5 年后能够产生效益。表 13.10 列出了这些方案,并给

出了简短的描述和 5 年后的期望效益。表 13.11 列出了这些计划预计在 5 年的规划期

中每年需要的投入资金,以及可用的资金金额。应选择哪个方案或哪些方案才能使五

年后的总收益 大?

Page 307: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

296

表格 13.10:各种方案的预期收益(百万欧元)

方案 描述 预期效益

1 扩展装配线 10.8

2 重新布置主车间 4.8

3 引进新喷漆设备 3.2

4 研究新概念车辆 4.44

5 重新组织供应链 12.25

表格 13.11:各方案每年支出与每年可用预算

方案 第 1 年 第 2 年 第 3 年 第 4 年 第 5 年

1 1.8 2.4 2.4 1.8 1.5

2 1.2 1.8 2.4 0.6 0.5

3 1.2 1.0 0 0.48 0

4 1.4 1.4 1.2 1.2 1.2

5 1.6 2.1 2.5 2.0 1.8

预算 4.8 6.0 4.8 4.2 3.5

13.6.1 模型的数学表达

我们用 PROJECTS 表示管理层选取出的方案集合,TIME 表示规划期时间(年)

集合。方案 p 的收益记为 pRET ,在第 t 年需要的支出记为 ptCOST 。 tCAP 表示在 t

年内可用的总预算金额。引入二值变量 pchoose ,如果选用了方案 p ,则 pchoose 取

值为 1,否则为 0。此问题的唯一约束条件是每年投入的预算金额限制。约束条件

(13.6.2)即保证所有被选中( 1=pchoose )的方案的在第 t 年的支出 ptCOST 的总

和不超过第 t 年的可用资本总额 tCAP 。目标函数为(13.6.1),即 大化总利润,即

所选中的方案的收益 pRET 总和。(13.6.3)是对变量 pchoose 的二值性约束。

maximize ∑∈

⋅PROJECTSp

pp chooseRET (13.6.1)

TIMEt ∈∀ : tPROJECTSp

ppt CAPchooseCOST ≤⋅∑∈

(13.6.2)

PROJECTSp∈∀ : { }10,choosep ∈ (13.6.3)

13.6.2 模型实现

上述数学模型可以实现为下面的 Mosel 程序。

model "H-6 Expansion"

Page 308: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

297

uses "mmxprs"

declarations

PROJECTS = 1..5 ! 可选方案集合

TIME = 1..5 ! 规划期

COST: array(PROJECTS,TIME) of real ! 各个方案每年的支出

CAP: array(TIME) of real ! 每年可用预算

RET: array(PROJECTS) of real ! 预期效益

DESCR: array(PROJECTS) of string ! 方案描述

choose: array(PROJECTS) of mpvar ! 如果选中方案,则为 1,否则为 0

end-declarations

initializations from ‘h6expand.dat'

COST CAP RET DESCR

end-initializations

! 目标函数:总效益

Profit:= sum(p in PROJECTS) RET(p)*choose(p)

! 可用预算限制

forall(t in TIME) sum(p in PROJECTS) COST(p,t)*choose(p) <= CAP(t)

forall(p in PROJECTS) choose(p) is_binary

! 求解此问题

maximize(Profit)

end-model

13.6.3 结果

通过运行上述的程序,我们可以得到 优解的总收益为 19.89 百万欧元,此时应

选中“引进新喷漆设备”,“研究新概念车辆”和“重新组织供应链”这三个方案。

我们可以对这个问题开展一些进一步的实验。如果将调用优化器的语句修改为如

下形式:

maximize(XPRS_LIN, Profit)

则可以求得此问题的线性松弛解(即,忽略变量 pchoose 的整数性约束)。观察

此松弛后问题的解我们可以发现,方案“引进新喷漆设备”和“重新组织供应链”对

应的选择变量为 1;而方案“扩展装配线”对应的选择变量接近 1,实际值为 0.9542;方案“重新布置主车间”对应的选择变量值约为 0(0.0042)。线性解的总利润为 25.775

Page 309: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

298

百万欧元。你可能会问如果将“扩展装配线”对应的选择变量四舍五入到 1,从而迫

使选中方案 1,这样会带来什么影响。为此我们可以在 Mosel 程序中调用优化算法之

前加入如下语句:

choose(1)=1

加入这个约束条件之后,求得的解决方案中即选中了方案“扩展生产线”(我们

强制要求选中此方案)和“引进新喷漆设备”,总利润为 14 百万欧元。这表明将小

数变量四舍五入到 近的整数值这种启发式的方法并不总是能够将线性规划松弛解

变为很好的整数可行解。

13.7 均方差投资方案选择

有一个投资商希望投资一定数目的资本。为此他对四种有价证券进行了评估。这

些有价证券分别是美国国债(T-bill),一家计算机硬件公司,一家计算机软件公司,

以及一个高风险的剧场建设项目。投资商对每个投资项目的平均收益进行了评估,并

采用了 Markowitz 方法,即对各项投资收益的方差/协方差矩阵进行评估。(例如,硬

件和软件公司常常共同进退,但由于如果人们厌倦了在新电脑上玩游戏,则会更多地

选择去剧院,因此它们与剧院经营则成负相关。)剧院项目的收益变化范围很大,而

美国国债的收益则固定不变。表 13.12 给出了各个投资项目的预计收益和方差/协方

差矩阵。

表格 13.12:预期收益和方差/协方差矩阵

硬件公司 软件公司 剧院建设 美国国债

预计收益 8 9 12 7

硬件公司 4 3 -1 0

软件公司 3 6 1 0

剧院建设 -1 1 10 0

美国国债 0 0 0 0

问题 1:投资商应采取何种投资策略才能在达到给定的 小收益目标的前提下使

收益方差 小?

问题 2:如果投资商希望选择至多两种不同的投资途径,应如何选择才能使投资

回报总方差 小(在满足给定的 小收益目标的前提下)?

13.7.1 问题 1 的数学表达

此问题的目标是在满足一定的 小收益要求的条件下 小化投资回报的方差,我

们用TARGET 表示要求的 小收益。令 sRET 为有价证券 s 的预期收益, stVAR 为

预期收益的方差/协方差矩阵。我们引入决策变量 sfrac ,表示在有价证券 s 中投入的

资金占总资金的比例,则可以得到如下的二次规划问题:

Page 310: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

299

minimize ∑ ∑∈ ∈

⋅⋅SECSs SECSt

tsst fracfracVAR (13.7.1)

1=∑∈SECSs

sfrac (13.7.2)

TARGETfracRETSECSs

ss ≥∑∈

(13.7.3)

SECSs∈∀ : 0≥sfrac (13.7.4)

目标函数为(13.7.1)式,即预期收益的方差。约束条件(13.7.2)将保证投资

商能够用出所有资本。约束条件(13.7.3)式将保证能够实现要求的收益。约束条件

(13.7.4)是常见的非负性约束。

注意,由于在目标函数中有变量的乘积项,因此这不是一个线性规划问题。

13.7.2 问题 1 的模型实现

可以很容易地将上述数学模型转化为 Mosel 程序。注意除了 Xpress-Optimizer(模块 mmxprs)之外,我们还使用了模块 mmquad,此模块将用于求解二次规划问

题。

model "H-7 QP Portfolio"

uses "mmxprs", "mmquad"

parameters

TARGET = 7.0 ! 小目标收益

end-parameters

declarations

SECS = 1..4 ! 有价证券集合

RET: array(SECS) of real ! 各类有价证券的期望收益

VAR: array(SECS,SECS) of real ! 期望收益的方差/协方差矩阵

frac: array(SECS) of mpvar ! 投入资金占总资金的比例

buy: array(SECS) of mpvar ! 如果购买此有价证券,则取值为 1,否则为 0

end-declarations

initializations from ‘h7qportf.dat'

RET VAR

end-initializations

! 目标函数:均方差

Variance:= sum(s,t in SECS) VAR(s,t)*frac(s)*frac(t)

Page 311: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

300

! 所有资本均用出

sum(s in SECS) frac(s) = 1

! 达到 小收益要求

sum(s in SECS) RET(s)*frac(s) >= TARGET

! 求解此问题

minimize(Variance)

end-model

13.7.3 问题 1 的结果

指定目标收益为 8.5%,运行上述模型:

mosel -s -c "exec h7qportf 'TARGET=8.5’"

可以得到 小方差为 0.72476。此时应将 15.14%的资金投入硬件公司,4.32%的资金投入软件公司,25.24%的资金投入剧院建设,55.29%的资金投入美国国债。

13.7.4 问题 2 的数学表达

对于第二个问题,我们需要表示出这样一个事实,即购买的有价证券种类数不能

超过MASASSETS 。加入二值变量 sbuy ,表示是否购买有价证券 s(如果 1=sbuy ,

则购买,否则不够买),从而对前面的模型进行扩展。我们将以下的约束条件加入前

面的模型:

MAXASSETSbuysSECSs

≤∑∈

(13.7.5)

SECSs∈∀ : ss buyfrac ≤ (13.7.6)

SECSs∈∀ : { }10,buys ∈ (13.7.7)

则可以看到,若 sfrac 大于 0,则 sbuy 也必须大于 0(约束条件(13.7.6)),由

于此变量为二值变量(13.7.7),因此此时取值应为 1。约束条件(13.7.5)即对可以

购买的证券类型数进行了限制。

由于这个问题中同时具有二次规划的元素和整数规划的元素,因此它实际上是一

个混合整数二次规划(MIQP)问题。

13.7.5 问题 2 的模型实现

第二个模型的 Mosel 实现与第一个模型很相似,但由于模型中有几处改动,因

Page 312: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

301

此我们仍然在这里给出完整的程序。

model "H-7 QP Portfolio (2)"

uses "mmxprs", "mmquad"

parameters

TARGET = 7.0 ! 小目标收益

MAXASSETS = 4 ! 多可购买有价债券类型数

end-parameters

declarations

SECS = 1..4 ! 有价证券集合

RET: array(SECS) of real ! 各类有价证券的期望收益

VAR: array(SECS,SECS) of real ! 期望收益的方差/协方差矩阵

frac: array(SECS) of mpvar ! 在每类有价证券上的投资额占总资本比例

buy: array(SECS) of mpvar ! 如果选择购买此有价证券,则取值为 1,否则为 0

end-declarations

initializations from ‘h7qportf.dat’

RET VAR

end-initializations

! 目标函数:均方差

Variance:= sum(s,t in SECS) VAR(s,t)*frac(s)*frac(t)

! 所有资本都应用出

sum(s in SECS) frac(s) = 1

! 达到目标收益

sum(s in SECS) RET(s)*frac(s) >= TARGET

! 限制选购有价证券类别数

sum(s in SECS) buy(s) <= MAXASSETS

forall(s in SECS) do

buy(s) is_binary

frac(s) <= buy(s)

end-do

! 求解此问题

minimize(Variance)

end-model

Page 313: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

302

13.7.6 问题 2 的结果

使用如下的参数设置运行此模型:

mosel -s -c "exec h7qportf ‘TARGET=8.5, MAXASSETS=2’"

即,目标收益率为 8.5%,购买至多两类有价证券,此时可以得到 小方差为 0.9。此时需要将 30%的资本投入到剧院建设,70%的资本投入到美国国债。在表 13.13中列出了问题 1 和问题 2 的结果。

表格 13.13:目标收益率为 TARGET=8.5 时的结果

占总投资百分比

问题 1 问题 2

硬件公司 15.14% 0%

软件公司 4.33% 0%

剧院建设 25.24% 30%

美国国债 55.29% 70%

方差 0.72 0.9

注意,由于我们限制只购买至多两种有价证券,因此收益率一定时其方差要大于

不限制购买有价证券类型数时的方差。

第二个模型更为真实:在实际操作中,可以从几千种有价证券中进行选择,通过

限制只能选择一定数目类型,从而使我们不再需要同时管理很多类型的有价证券。

13.7.7 扩展讨论

终我们应注意到在实践中找出一组可以接受的目标收益率/方差并不是很容易

的事情,决策者可能需要研究很多可能的组合。在模型实现中,我们可以加入一个简

单的循环,查看所有的 优解(和此时对应的解决方案)。此时 TARGET 不再是模型

参数,因此可以在 declarations 块中进行声明。TARGET 的可行值范围将位于所有

有价证券平均收益的 小值和 大值之间,将以 0.1 为步长进行枚举。注意此时必须

将目标收益率的约束条件进行命名(Rmean),以便在每次循环时更改此约束条件。

declarations

TARGET: real

end-declarations

TARGET:=min(s in SECS) RET(s)

repeat

Rmean:= sum(s in SECS) RET(s)*frac(s) >= TARGET

minimize(Variance)

writeln("Target: ", TARGET, " minimum variance: ", getobjval)

TARGET+=0.1

until(TARGET>max(s in SECS) RET(s) )

Page 314: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

303

可以在图表中绘出得到的结果,例如你可以使用 Xpress-IVE 的制图功能。

13.8 参考文献和进阶阅读

本章给出的问题都相对较为简单,但是这些问题的数据都带有一些不确定性。如

果能够快速求解出模型的 优值,那么就可以使用这些模型进行仿真。

通常金融业的从业人员(主要是银行家)都不会太担忧优化问题。他们可以使用

管理人员编制的软件和程序。这些内部开发的程序通常不会进行优化,而更多地根据

优先级规则进行简单的仿真。制定这些规则的原则是应总是选择那些产出投入比 高

的项目进行投资。因此主要的问题在于如何保证数据的可靠性和如何对得出的结果进

行解释。 近几年里证券市场中发生的一些事件,尤其是出于技术角度,都再次表明

了考虑数据变化的必要性。

第 13.7 节中的二次规划问题来源于 Manne[Man86]。二次规划问题出现的频率

通常远低于线性规划问题或混合整数规划问题,但是许多二次规划问题都与金融领域

相关。

运筹学方法已经广泛用于金融业领域。Winston 的著作[Win98]和 Zenios 的著作

[Zen96]都是对运筹学在这一领域应用的极好介绍。

第 14 章 时间表制定与人员安排

人力资源管理是企业中的一个非常敏感的主题。由于人力资源管理要考虑大量的

定性的和心理的因素,因此这一领域并不非常适合采用数学规划方法建立定量模型。

在 1970 年代运筹学方法在此领域即被束之高阁,直到 1990 年代才再次重放光彩,

这主要是由于两个原因:将人看作与模型中其他资源一样的资源,这是一个严重的错

误;此外,1970 年代的研究者也没有足够的计算能力,因而无法实现他们的雄心壮

志。

现在普遍认为优化方法能够为制定人员时间表提供很好的帮助,而这个问题有时

的确让人很头疼;此外优化方法也能用于人员安置(staffing),即对人力资源需求进

行规划。要避免带来负面反应或反感,关键在于不要强制执行计算机求出的方案。实

际上很多微妙的社会和心理约束条件都很难在模型中加以考虑。这样交互式的决策工

具就成为一个更好的选择,在使用这种工具时,求解数学模型得到的方案将提供给决

策者进行参考,决策者根据自己的实际需求对此方案进行交互的调整,从而 终得到

可行的方案。

本章将要讨论的第一个问题是研究如何将人员分配到机器上才能 大化车间的

生产能力。然后将研究三个时间表制定的问题:医院中护士工作的时间表(第 14.2节),大学的课程表(第 14.3 节),以及某个工程大学的考试时间表(第 14.4 节)。

Page 315: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

304

在第 14.5 节中,我们将讨论如何在生产线之间移动人员才能够使某个生产单元的生

产率 高。在本章 后将对建筑工地的人员招募和流动进行规划。

14.1 为机器分配操作人员

在一个车间中需要为六台机器各安排一个操作员。初选出六名工人,对每名工人

在每台机器上的生产效率都进行了测试。表 14.1 给出了此生产效率数据,即每小时

生产的产品件数。这些机器都并行运行,即车间的总生产效率等于分配到每台机器上

的操作员的生产效率之和。

表格 14.1:生产效率(件/小时)

机器

工人 1 2 3 4 5 6

1 13 24 31 19 40 29

2 18 25 30 15 43 22

3 20 20 27 25 34 33

4 23 26 28 18 37 30

5 28 33 34 17 38 20

6 19 36 25 27 45 24

我们的目标使找出一种为机器分配操作员的方案,以使总生产效率 高。首先可

以使用下面这个非常自然的启发式方法进行求解(非 优解):首先在上表中找到

高的生产效率,将对应的工人 p 分配到对应的机器m 上,然后去掉第 p 行和第m 列

(由于此工人和此机器都已经完成分配),然后重复这一过程,直到所有工人都已经

分配到机器上。然后我们再使用数学规划方法求得此问题的 优解。 后,将问题改

为机器需要按照一定顺序工作,并再次求出此问题的 优解。

14.1.1 模型的数学表达

14.1.1.1 并行机器

此问题属于著名的分配问题(assignment problem)类型。在第 11 章中也出现

了这种类型的问题(航班连接问题)。令 PERS 为工人集合,MACH 为机器集合(这

两个集合大小均为 N ), pmOUTP 为工人 p 在机器m 上的生产率。我们首先想到定

义 N 个整数变量 passign 来对分配方案进行编码, npassign 的取值范围即为集合

MACH ,其取值即为工人 p 所分配到的机器。然而使用这种变量选取方法无法将每

个工人只能分配到一台机器上以及每台机器只能有一个操作员这个约束条件表示为

线性形式。但如果我们使用2N 个二值变量 pmassign ,则很容易将这些约束条件表示

为线性形式,其中当且仅当工人 p 分配到机器m 上时 pmassign 取值才为 1(14.1.1)。

Page 316: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

305

MACHm,PERSp ∈∈∀ : { }10,assign pm ∈ (14.1.1)

约束条件(14.1.2)将限制每个工人只能分配到一台机器。类似地,约束条件

(14.1.3)将限制每台机器只有一个操作人员。

PERSp∈∀ : 1=∑∈MACHm

pmassign (14.1.2)

MACHm∈∀ : 1=∑∈PERSp

pmassign (14.1.3)

目标函数是(14.1.4)式,即 大化所有取值为 1 的变量 pmassign 所对应的

pmOUTP 的和。 终式(14.1.1)到(14.1.4)即完整地表示出了此数学模型。

maximize ∑ ∑∈ ∈

⋅PERSp MACHm

pmpm assignOUTP (14.1.4)

分 配 问 题 可 以 看 作 是 一 个 流 问 题 。 可 以 定 义 一 幅 双 向 标 记 图

( )OUTP,ARCS,MACH,PERSG = ,其中 PERS 为代表工人的结点集合,MACH

为代表机器的结点集合,弧集合 ARCS 对应于工人和机器之间可能的分配方式。在

我们这个例子中,存在2N 条弧,但通常可以排除其中的一部分分配方式。每条弧

( )m,p 都具有无限的通过量,并用具有费用(生产率) pmOUTP 。我们创建一个源结

点 SOURCE ,此结点通过弧 ( )p,SOURCE 连接到每个工人结点 p ,且每条这样的

弧的通过量均为 1。同时我们也创建一个宿结点 SINK ,将所有机器结点m 都通过弧

( )SINK,m 连接到此结点上,且每条这样的弧的通过量也为 1。这样 优的分配方案

即对应于图G 中总通过量为 N 的 大费用流。由于我们所加入的每条弧的通过量均

为 1,因此总通过量为 N 的 大费用流将由 SOURCE 到 SINK 结点之间的 N 条分

离路径组成,这些路径即对应于 优的分配方式。

分配问题的线性解就是整数解。因此约束条件(14.1.1)可以用简单的非负约束

条件取代。由于约束条件(14.1.2)和(14.1.3)的存在,因此不需要声明变量 pmassign

不大于 1。将此模型略加修改之后就可以用于处理具有工人数目与机器数目不相等的

问题。例如,如果工人数目比机器数目多,则可以保留约束条件(14.1.3),以便使

每台机器都能有人操作,但用(14.1.5)取代约束条件(14.1.2)。

PERSp∈∀ : 1≤∑∈MACHm

pmassign (14.1.5)

有时某些分配方案可能由于某些现实的原因而无法实行。此时可以将对应的变量

pmassign 强制设置为 0,或将 pmOUTP 设置为较大(即具有较大的绝对值)的负数

Page 317: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

306

值。如果给出的是可以采取的分配方案组成的图,而不是生产率矩阵,则也可以只为

图中存在的弧 ( )m,p 定义变量 pmassign 。

14.1.1.2 串行机器

如果这些机器需要按照一定顺序进行工作,则其中生产率 低的机器-工人组合

就决定了整个车间的生产率。此时仍然可以用2N 个变量 pmassign (14.1.1)及约

束条件(14.1.2)和(14.1.3)来描述此分配方案。此外我们向模型中加入一个非负

的变量 minp ,表示 低的生产效率。则目标即为 大化 minp 。在这种类型的分配

问题中,我们希望 大化其中的 小值,因此称为 大化 小值(maximin)问题,

或瓶颈问题。为写出此问题的线性形式,通常都采用相同的步骤:

♦ 定义一个变量,对应于每台机器生产率的下界。

♦ 加入约束条件,限制每台机器的生产率不能低于 minp 。

♦ 大化 minp 的值,即在 优解中至少有一台机器的生产率等于 minp ,即

瓶颈机器。

可以采用两组约束条件来将限制每台机器的生产率不能低于下界 minp :

(14.1.6)所示的2N 个约束条件,或(14.1.7)所示的 N 个约束条件。在后者中,

由于约束条件(14.1.2)的存在,只有一个 pmassign 取值为 1。 终得到的数学模型

即为式(14.1.1)到(14.1.3),加上约束条件(14.1.6)或(14.1.7),以及 minp 的

非负约束条件,和新的目标函数: 大化 minp 。由于约束条件(14.1.6)或(14.1.7)的存在,此数学模型不再是一个经典的分配问题,因此无法保证线性规划解就是整数

解。因此需要保留约束条件(14.1.1)。

MACHm,PERSp ∈∈∀ : minpassignOUTP pmpm ≥⋅ (14.1.6)

PERSp∈∀ : minpassignOUTPMACHm

pmpm ≥⋅∑∈

(14.1.7)

14.1.2 模型实现

在下面的 Mosel 程序中将首先实现和求解并行机器情况的模型。然后再定义变

量 minp ,以对串行机器的情况进行求解。我们也为变量 pmassign 加入了必要的边

界约束条件(我们使用了式(14.1.7)所示的约束条件),并指定这些变量为二值变

量。

model "I-1 Personnel assignment"

uses "mmxprs"

Page 318: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

307

declarations

PERS = 1..6 ! 工人集合

MACH = 1..6 ! 机器集合

OUTP: array(PERS,MACH) of integer ! 生产率

end-declarations

initializations from ‘i1assign.dat’

OUTP

end-initializations

! **** 求解并行机器分配 ****

declarations

assign: array(PERS,MACH) of mpvar ! 如果工人分配到机器上,则取值为 1,否则为 0

end-declarations

! 目标函数:总生产率

TotalProd:= sum(p in PERS, m in MACH) OUTP(p,m)*assign(p,m)

! 每个工人只能分配到一台机器

forall(p in PERS) sum(m in MACH) assign(p,m) = 1

! 每个机器只能分配到一个工人

forall(m in MACH) sum(p in PERS) assign(p,m) = 1

! 求解此问题

maximize(TotalProd)writeln("Parallel machines: ", getobjval)

! **** 求解串行机器分配 ****

declarations

pmin: mpvar ! 低生产率

end-declarations

! 计算 低生产率

forall(p in PERS) sum(m in MACH) OUTP(p,m)*assign(p,m) >= pmin

forall(p in PERS, m in MACH) assign(p,m) is_binary

! 求解此问题

maximize(pmin)

writeln("Serial machines: ", getobjval)

Page 319: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

308

end-model

可以向上面的程序中加入下面的过程 parallel_heur。如果在完成数据初始化后调用此过程,则会采

用本节 初描述的启发式方法计算出并行分配问题(非 优)解。

procedure parallel_heur

declarations

ALLP, ALLM: set of integer ! 集合 PERS 和 MACH 的拷贝

HProd: integer ! 总生产率值

pmax,omax,mmax: integer

end-declarations

! 复制工人集合和机器集合

forall(p in PERS) ALLP+={p}

forall(m in MACH) ALLM+={m}

! 如果还有未分配的工人,则按照一定规则将工人分配到机器上

while (ALLP<>{}) do

pmax:=0; mmax:=0; omax:=0

! 找出剩余工人和机器之间生产率 高的搭配

forall(p in ALLP, m in ALLM)

if OUTP(p,m) > omax then

omax:=OUTP(p,m)

pmax:=p; mmax:=m

end-if

HProd+=omax ! 增加总生产率

ALLP-={pmax}; ALLM-={mmax} ! 将此工人和机器从集合中去除

writeln(" ",pmax, " operates machine ", mmax, " (", omax, ")")

end-do

writeln(" Total productivity: ", HProd)

end-procedure

14.1.3 结果

在下表中列出了对并行和串行机器采用不同方法求解的结果。那些不了解数学规

划的人可能会采用这种直观的启发式方法。然而,对于并行机器问题,启发式算法与

精确算法求得的解之间有显著的差距。

表格 14.2:求出的 优分配方案

工人

算法 1 2 3 4 5 6 生产率

Page 320: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

309

并行机器 启发式 4(19) 1(18) 6(33) 2(26) 3(34) 5(45) 175

精确 3(31) 5(43) 4(25) 6(30) 1(28) 2(36) 193

串行机器 精确 6(29) 3(30) 5(24) 2(26) 1(28) 4(27) 26

14.2 护士工作时间调度

Mr. Schedule 先生受人之托要为 St. Joseph 医院的心脑血管部门制定护士的工

作时间表。在心脑血管部门中一个工作日分为 12 个两小时长的时段,每个时段的人

员要求都不同。例如,在夜间只要求有很少几个护士就足够了,但在早晨为了给病人

提供特殊服务,需要很多护士。下表列出了每个时段的人员需求量。

问题 1:请计算出为满足需求 少需要多少个护士,假定已知每个护士每天工作

8 小时,且在工作四小时后需要休息两个小时。

问题 2:此部门目前只有 80 名护士,这个数目不足以满足给定的需求。因此

Schedule 先生建议每天安排部分人加班。每天加班时间为 2 小时,且紧随在后一个

四小时工作时段之后,中间没有休息。请给出护士工作时间安排方案,以使需要加班

的护士数目 少。

表格 14.3:每个时段的人员需求

编号 时段 需要护士人数

0 00am - 02am 15

1 02am - 04am 15

2 04am – 06am 15

3 06am – 08am 35

4 08am – 10am 40

5 10am – 12pm 40

6 12pm – 02pm 40

7 02pm – 04pm 30

8 04pm – 06pm 31

9 06pm – 08pm 35

10 08pm – 10pm 30

11 10pm – 12am 20

14.2.1 问题 1 的数学表达

令 tstart 为在时段 t 时开始工作的护士数目(第 1 个时段为 0am – 2am,第 2 个

时段为 2am – 4am,等等), NT 为时段的数目, { }10 −= NT,,TIME K 为时段集

合。则目标函数可以写为式(14.2.1)。

minimize ∑∈TIMEt

tstart (14.2.1)

Page 321: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

310

我们需要保证在每个时段都有足够的护士在工作。例如,在时段 6=t (12pm – 2pm)中,需要 40 名护士。在此时段内工作的护士数目等于在此时段开始工作的护

士数目,在前一时段开始工作的护士数目,以及 3 个和 4 个时段之前开始工作的护

士数目之和。即,在时段 6 中,正在工作的护士分别在时段 2,3,5,6 时开始工作。

例如,有个护士在时段 3 时开始工作,则她在时段 3 和时段 4 中将进行工作,在时

段 5 时休息,然后在时段 6 和时段 7 时继续工作。如果将时段 t 内的人员需求量记为

tREQ ,则可以对时段 6 得到如下的约束条件:

66532 REQstartstartstartstart ≥+++ (14.2.2)

类似地,我们可以计算出所有时段的人员需求的约束条件。如果用WORK 表示

对当前所考虑的时段有影响的时段集合(即 { }4310 −−−= ,,,WORK ),则可以写出这

些约束条件的一般形式(14.2.3)。

TIMEt ∈∀ : ( ) tWORKi

NTmodNTit REQstart ≥∑∈

++ (14.2.3)

在每天的头四个时段中,我们需要考虑在前一天的 后四个时段中开始工作的护

士。表达式 ( ) NTmodNTit ++ 将能够正确地对索引进行转换,例如对于一天的第

一个时段( 0=t ),前一天的时段 8,9,11,和当天的时段 0 将被计入考虑。

约束条件(14.2.4)将保证所有变量 tstart 均为整数。

TIMEt ∈∀ : Nstartt ∈ (14.2.4)

14.2.2 问题 1 的程序实现

上述数学模型可以很容易地改写为如下的 Mosel 程序。其中 WORK 是一个包含

负数值及零值的集合。

model "I-2 Scheduling nurses 1"

uses "mmxprs"

declarations

NT = 12 ! 时段编号

TIME = 0..NT-1

WORK: set of integer ! 在其他时段开始工作,且在当前时段中仍然在工作的护士

REQ: array(TIME) of integer ! 每个时段对护士的需求数目

start: array(TIME) of mpvar ! 在一个时段中开始工作的护士

Page 322: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

311

end-declarations

initializations from ‘i2nurse.dat'

REQ

end-initializations

WORK:= {0, -1, -3, -4}

! 目标函数:人员需求量

Total:= sum(t in TIME) start(t)

! 每个时段中正在工作的护士数目

forall(t in TIME) sum(i in WORK) start((t+i+NT) mod NT) >= REQ(t)

forall(t in TIME) start(t) is_integer

! 求解此问题

minimize(Total)

end-model

14.2.3 问题 1 的结果

此心脑血管部门总计需要 100 名护士。表 14.4 列出了这些护士的工作时间调度

方案(存在多个等价的方案)。

表格 14.4:护士工作时间调度方案

时间段 开始工作人数 总工作人数

00am – 02am 6 30

02am – 04am 17 40

04am – 06am 12 29

06am – 08am 17 35

08am – 10am 0 40

10am – 12pm 11 40

12pm – 02pm 0 40

02pm – 04pm 13 30

04pm – 06pm 7 31

06pm – 08pm 17 35

08pm – 10pm 0 30

10pm – 12am 0 20

14.2.4 问题 2 的数学表达

前一个问题求出的 优解为至少需要 100 名护士。然而目前只有 80 名护士。这

样就需要安排一些人加班。

Page 323: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

312

我们仍然使用问题 1 中引入的变量 tstart 。此外,我们还引入变量 tovert ,表示

在 t 时段开始工作的护士中需要加班两个小时的人数。

现在我们的目标是 小化需要加班的护士数目。因此可以得到目标函数为

(14.2.5)式。 .

minimize ∑∈TIMEt

tovert (14.2.5)

护士总数目不能超过总人数 80=NUM ,此约束条件可以表示为式(14.2.6)。

NUMstartTIMEt

t ≤∑∈

(14.2.6)

对于每个时段 t ,在此时段开始工作而且需要加班的护士数目 tovert 不能超过此

时段开始工作的护士总人数 tstart 。因此有约束条件(14.2.7)。

TIMEt ∈∀ : tt startovert ≤ (14.2.7)

与前面一样,应使每个时段的人员需求都得到满足。因此有约束条件(14.2.8),这个约束条件与问题 1 的约束条件(14.2.3)类似,但是我们要将加班的护士也计入

考虑。例如,在时段 6 中工作的护士可能来在时段 2,3,5,或 6 开始工作,这与问

题 1 一样,但也可能是在时段 1 开始工作,但现在在加班。

TIMEt ∈∀ : ( ) ( ) tWORKi

NTmodNTitNTmodNTt REQstartovert ≥+ ∑∈

+++−5 (14.2.8)

后我们加入约束条件(14.2.9)和(14.2.10),限定所有的变量 tstart 和 tovert

均为整数,从而完成了问题 2 的建模。

TIMEt ∈∀ : Nstartt ∈ (14.2.9)

TIMEt ∈∀ : Novertt ∈ (14.2.10)

14.2.5 问题 2 的模型实现

将问题 2 的数学模型转化为 Mosel 程序也很简单。

model "I-2 Scheduling nurses 2"

uses "mmxprs"

declarations

NT = 12 ! 时段数目

Page 324: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

313

TIME = 0..NT-1

WORK: set of integer ! 在其他时段开始工作,且在当前时段中仍然在工作的护士

REQ: array(TIME) of integer ! 每个时段需要的护士数目

NUM: integer ! 护士总人数

start: array(TIME) of mpvar ! 在一个时段开始工作的护士人数

overt: array(TIME) of mpvar ! 在一个时段开始工作,且需要加班的护士人数

end-declarations

initializations from 'i2nurse.dat'

REQ NUM

end-initializations

WORK:= {0, -1, -3, -4}

! 目标函数:总加班人数

TotalOvert:= sum(t in TIME) overt(t)

! 每个时段内工作的护士人数

forall(t in TIME)

overt((t-5+NT) mod NT) + sum(i in WORK) start((t+i+NT) mod NT) >= REQ(t)

! 护士总数限制

Total <= NUM

forall(t in TIME) do

start(t) is_integer

overt(t) is_integer

overt(t) <= start(t)

end-do

! 求解此问题

minimize(TotalOvert)

end-model

14.2.6 问题 2 的结果

这 80 名护士中有 40 名需要加班才能够满足此部门的人员需求。表 14.5 列出了

详细的调度方案(存在多个等价的调度方案)。

表格 14.5:护士工作时间调度方案与加班安排

时间段 开始工作人数 总工作人数 准备加班人数

Page 325: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

314

00am – 02am 13 15 0

02am – 04am 1 17 0

04am – 06am 10 16 0

06am – 08am 7 35 3

08am – 10am 17 49 2

10am – 12pm 4 40 8

12pm – 02pm 14 35 0

02pm – 04pm 9 47 0

04pm – 06pm 0 30 0

06pm – 08pm 0 35 17

08pm – 10pm 3 30 4

10pm – 12am 2 20 6

14.3 制定大学课表

Miller 先生负责为一所大学中两个毕业班制定每周的课表。除去数学和体育课之

外,这两个班级各门课的教师都相同。在此大学中,每节课的长度都是两个小时。此

外,同一个班级的所有学生都将参与相同的课程。从周周一到周五,每节课的时间安

排为:8:00 – 10:00,10:15 – 12:15,14:00 – 16:00,16:15 – 18:15。下表列出了每

个老师每周需要为这两个班各上多少节课。

表格 14.6:每个老师为每个班级授课节数

教师 科目 1 班 2 班

Cheese 先生 英语 1 1

Insulin 女士 生物 3 3

Map 先生 历史-地理 2 2

Geomeo 先生 数学 0 4

Derivate 女士 数学 4 0

Electron 女士 物理 3 3

Wise 先生 哲学 1 1

Muscle 先生 体育 1 0

Biceps 女士 体育 0 1

体育课必须安排在每周四下午 14:00 到 16:00。此外,周一的第一节课将保留用

作作业辅导课。Geomeo 先生在另一所学校也执教一些课程,因此每周一不能来上

班。Insulin 女士每周三不能来上班。 后,为避免学生疲劳,每天每个科目只能占

用一节课。请帮助 Miller 先生制定这两个班级每周的课表。

14.3.1 模型的数学表达

令TEACHERS 和CLASS 分别表示教师集合和课程集合。令 SLOTS 表示每周

课节集合,用从 1 到 NDNP ⋅ 的数字连续标记,其中 NP 为每天可安排的课节数,ND

为每周可上课的天数。用 tcCOURSE 表示教师 t 每周需要为班级 c 上课的节数。

Page 326: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

315

我们引入变量 tclteach ,如果教师 t 在第 l 节课时为 c班授课,则此变量取值为 1。

这样就可以得到如下的数学模型:

minimize ( )( )∑ ∑ ∑∈ ∈

=⋅++⋅ +

TEACHERSt CLASSc

ND

dNPd,c,tNPd,c,t teachteach

1

011 (14.3.1)

CLASSc,TEACHERSt ∈∈∀ : tcSLOTSl

tcl COURSEteach =∑∈

(14.3.2)

SLOTSl,CLASSc ∈∈∀ : 1≤∑∈TEACHERSt

tclteach (14.3.3)

SLOTSl,TEACHERSt ∈∈∀ : 1≤∑∈CLASSc

tclteach (14.3.4)

10 −=∈∈∀ ND,,d,CLASSc,TEACHERSt K : ( )

11

1

≤∑⋅+

+⋅=

NPd

NPdltclteach

(14.3.5)

1151 =,,MrMuscleteach (14.3.6)

1151 =,,MrsBicepsteach (14.3.7)

CLASSc,TEACHERSt ∈∈∀ : 01 =tcteach (14.3.8)

21,l,CLASSc =∈∀ : 0=l,c,MrGeomeoteach (14.3.9)

NP,,NPl,CLASSc ⋅+⋅=∈∀ 312 K : 0=l,c,eMrsInsulinteach (14.3.10)

SLOTSl,CLASSc,TEACHERSt ∈∈∈∀ : { }101 ,teachtc ∈ (14.3.11)

此问题的目的是找到能够满足所有约束条件的课程表。但是我们也可以将 小化

课程表中的“空洞”数作为目标函数。这样即应优先将课程安排在 10:15 – 12:15 或

14:00 – 16:00。如果这些时段未占用,而在每天第一节课或 后一节课安排了科目,

则这一天中即出现了“空洞”。因此我们将对安排在每天第一节课或 后一节课的科

目进行惩罚,即我们需要 小化安排在每天第一节课或 后一节课授课的总课节数,

因此即有目标函数(14.3.1)。

约束条件(14.3.2)将要求教师 t 对 c 班的所有授课任务都需要能够得到安排。

约束条件(14.3.3)将限定每个班级每节课只能安排给一个科目;类似地,约束条件

(14.3.4)将限定每个教师每个时刻只能教一节课。约束条件(14.3.5)限定每天每

个科目至多只能占用一节课时间。

约束条件(14.3.6)和(14.3.10)是本问题特有的约束条件:约束条件(14.3.6)和(14.3.7)要求 Muscle 先生或 Biceps 女士执教的体育课必须安排在周四下午第一

次课(时间片 15)。每周第一次课保留给作业辅导,因此需加入约束条件(14.3.8),限定在此时段不能安排任何课程。约束条件(14.3.9)和(14.3.10)分别用于禁止

将 Geomeo 的课程安排在周一上午,或将 Insulin 女士的课程安排在星期三(时间片

Page 327: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

316

9-12)。 后一组约束条件将限定所有变量均为二值变量。

14.3.2 模型实现

上述数学模型可以用下面的 Mosel 程序来进行实现:

model "I-3 School timetable"

uses "mmxprs"

declarations

TEACHERS: set of string ! 教师集合

CLASS = 1..2 ! 课程集合

NP = 4 ! 每周每天可安排课节数

ND=5 ! 每周可上课天数

SLOTS=1..NP*ND ! 一周可上课的时间片

COURSE: array(TEACHERS,CLASS) of integer ! 每周每个老师为每班上课节数

end-declarations

initializations from 'i3school.dat’

COURSE

end-initializations

finalize(TEACHERS)

declarations

teach: array(TEACHERS,CLASS,SLOTS) of mpvar ! 如果教师 t 在时段 l 内

! 为班级 c 授课,则

! teach(t,c,l) = 1

end-declarations

! 目标函数:课表中的“空洞”数

Hole:=

sum(t in TEACHERS, c in CLASS, d in 0..ND-1) (teach(t,c,d*NP+1) +

teach(t,c,(d+1)*NP))

! 所有课程都应得到安排

forall(t in TEACHERS, c in CLASS) sum(l in SLOTS) teach(t,c,l) = COURSE(t,c)

! 每班每个时刻只能安排一节课

forall(c in CLASS, l in SLOTS) sum(t in TEACHERS) teach(t,c,l) <= 1

! 每个教师每个时刻只能上一节课

forall(t in TEACHERS, l in SLOTS) sum(c in CLASS) teach(t,c,l) <= 1

Page 328: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

317

! 每天每班每个科目只能上一节课

forall(t in TEACHERS, c in CLASS, d in 0..ND-1)

sum(l in d*NP+1..(d+1)*NP) teach(t,c,l) <= 1

! 体育课安排在周四下午第一节课(时间片 15)

teach("Mr Muscle",1,15) = 1teach("Mrs Biceps",2,15) = 1

! 周一上午第一节课不能安排授课

forall(t in TEACHERS, c in CLASS) teach(t,c,1) = 0

! Geomeo 先生周一上午不能安排授课

forall(l in 1..2) teach("Mr Geomeo",2,l) = 0

! 周三不能安排生物课

forall(c in CLASS, l in 2*NP+1..3*NP) teach("Mrs Insulin",c,l) = 0

forall(t in TEACHERS, c in CLASS, l in SLOTS) teach(t,c,l) is_binary

! 求解此问题

minimize(Hole)

end-model

14.3.3 结果

求得的 优解为 10,即在每天第一节课或 后一节课中总计安排了 10 节课。在

表 14.7 和 14.8 中列出了此时这两个班对应的课程表,且其中没有“空洞”。注意,

此问题有多个等价解。

表格 14.7:1 班课程表

8:00 – 10:00 10:15-12:15 14:00-16:00 16:15-18:15

周一 家庭作业 数学(Derivate 女士)生物(Insulin 女士) 物理(Electron 女士)

周二 英语(Cheese 先生) 数学(Derivate 女士)生物(Insulin 女士) 物理(Electron 女士)

周三 - 数学(Derivate 女士)历史-地理(Map 先生)-

周四 - 历史-地理(Map 先生)体育(Muscle 先生) 物理(Electron 女士)

周五 - 生物(Insulin 女士) 数学(Derivate 女士)哲学(Wise 先生)

表格 14.8:2 班课程表

8:00 – 10:00 10:15-12:15 14:00-16:00 16:15-18:15

周一 家庭作业 历史-地理(Map 先生)数学(Geomeo 先生) 生物(Insulin 女士)

周二 - 数学(Geomeo 先生)历史-地理(Map 先生) 生物(Insulin 女士)

周三 - 物理(Electron 女士)数学(Geomeo 先生) -

周四 物理(Electron 女士) 英语(Cheese 先生) 体育(Biceps 先生) 生物(Insulin 女士)

周五 物理(Electron 女士) 哲学(Wise 先生) 数学(Geomeo 先生) -

Page 329: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

318

14.4 考试日程安排

有一所工程大学每个学期三年级学生都需要根据其希望在第四年内学习的内容

(可以从“生产规划”和“质量和安全管理”中选择)从 11 门课程中选择 8 门。在

学生选择了下一个学年内的学习方向后,则在此学期内有些课程即变为必修课。这些

必修课程是统计学(S),图模型与算法(GMA),生产管理(PM),离散系统与事件

(DSE)。其他可选的课程为:数据分析(DA),数值分析(NA),数学规划(MP),C++,Java(J),逻辑规划(LP),以及软件工程(SE)。

表格 14.9:考试科目之间的冲突情况

DA NA C++ SE PM J GMA LP MP S DSE

DA - X - - X - X - - X X

NA X - - - X - X - - X X

C++ - - - X X X X - X X X

SE - - X - X X X - - X X

PM X X X X - X X X X X X

J - - X X X - X - X X X

GMA X X X X X X - X X X X

LP - - - - X - X - - X X

MP - - X - X X X - - X X

S X X X X X X X X X - X

DSE X X X X X X X X X X -

Edeetee 女士负责安排每学期的期末考试。每门考试都需要占用两个小时时间。

安排两天用于考试,每天可用安排考试的时间段为:8:00 – 10:00,10:15 – 12:15,14:00 – 16:00,16:15 – 18:15。在安排考试时间时需要考虑到有些学生同时选定了

一些课程,因此这些课程的考试就不能安排在同时进行。表 14.4.1 列出了这些有冲

突的考试。

请帮助 Edeetee 女士制定一份考试时间表,以使得每个学生每个时刻都只需参

加一门考试。

14.4.1 模型的数学表达

引入二值变量 etplan ,当且仅当考试科目 e安排在时间片 t 时取值为 1,否则为

0。记考试集合为 EXAM ,时间片集合为TIME 。则与此问题所对应的数学模型可

以写成:

EXAMe∈∀ : 1=∑∈TIMEt

etplan (14.4.1)

TIMEt,INCOMPed,EXAMe,d de ∈∀=∧<∈∀ 1 :

1=+ dtet planplan (14.4.2)

Page 330: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

319

TIMEt,EXAMe ∈∈∀ : { }10,planet ∈ (14.4.3)

由于我们只希望找到一个能够满足所有冲突约束条件的解决方案,因此这个数学

模型中没有目标函数。但这对求解算法不会带来影响,算法将计算出任意一个可行解

(如果存在)。但是我们可以加入一个目标函数,例如为考试科目和可用时间段之间

的分配关系设置费用或其他偏好。

约束条件(14.4.1)即表明每个考试科目只能安排进行一次考试。约束条件

(14.4.2)将保证两个有冲突的考试科目不能安排在同时进行。我们用 Boolean 型的

矩阵 INCOMP 表示考试科目之间的冲突(不兼容)。当且仅当考试科目 d 和 e 无法

同时进行(不兼容)时,其中的矩阵元素 deINCOMP 取值才为 1,否则为 0。由于本

问题的不兼容矩阵是对称矩阵,因此只需要为 ed < 的科目 d 和 e 定义约束条件

(14.4.2)即可。 后一组约束条件(14.4.3)将限定所有变量均为二值变量。

这样用约束条件(14.4.1)到(14.4.3)即完成了对此问题的表述。然而,如果

此问题有解,则可以通过将相兼容的考试科目进行排列组合从而得到非常多的等价

(对称)解。因此我们可以加入一些约束条件来打破这些对称性,减少搜索空间大小,

从而帮助进行求解。例如,我们可以将科目 DA 安排到时间 1,将科目 NA 安排到时

间 2(由于它与 DA 不兼容)。由于 PM 与 DA 和 NA 都不兼容,因此可以进一步将

DA 安排到时间 3。类似地,GMA,S,和 DSE 与其他所有科目都不兼容,因此它们

考试时间也都是唯一的(4,5,和 6)。

这些观察能够起到多少作用仍然存在争议,但是尽可能地打破问题的对称性总是

一个好主意。

14.4.2 模型实现

可以使用下面的 Mosel 程序实现上述的数学模型。此问题没有目标函数,但是

我们希望调用优化算法找到一个可行解。因此在调用优化器时我们采用了一个常数作

为目标函数(伪目标函数)——由于我们求解此问题时不需要优化任何项目,因此我

们没有采用 minimize,而是使用 maximize。我们也没有采用上面所讨论的打破对称

性的方法。

model "I-4 Scheduling exams"

uses "mmxprs"

declarations

EXAM = {"DA","NA","C++","SE","PM","J","GMA","LP","MP","S","DSE"}

! 考试科目集合

TIME = 1..8 ! 时间片集合

INCOMP: array(EXAM,EXAM) of integer ! 考试科目之间的不兼容性

plan: array(EXAM,TIME) of mpvar ! 如果将考试安排在某个时间片内,则取值为 1

! 否则为 0

Page 331: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

320

end-declarations

initializations from 'i4exam.dat’

INCOMP

end-initializations

! 所有考试都应安排到时间

forall(e in EXAM) sum(t in TIME) plan(e,t) = 1

! 各门科目之间的不兼容性

forall(d,e in EXAM, t in TIME | d<e and INCOMP(d,e)=1)

plan(e,t) + plan(d,t) <= 1

forall(e in EXAM, t in TIME) plan(e,t) is_binary

! 求解此问题(没有目标函数)

minimize(0)

end-model

14.4.3 结果

对此问题进行线性松弛求解可以得到整数解(但并不总是如此)。下面是一份满

足要求的考试时间表,可以看到只使用了其中的七个时间片。此问题存在很多不同的

可行方案。

表格 14.10:考试时间安排

8:00–10:00 10:15–12:15 14:00-16:00 16:15-18:15

第 1 天 NA,SE,LP,MP PM GMA DA,C++

第 2 天 - S J DSE

14.5 结合人员分配的生产规划

Line Production 公司要对四种产品(P1,P2,P3,P4)在五条生产线(L1 到 L5)上的生产进行规划。产品 P1 和 P4 的单位纯利润为 7 欧元,产品 P2 的单位纯利润

为 8 欧元,产品 P3 的单位纯利润为 9 欧元。在规划期内这五条生产线各自可以进行

生产的时间长度各不相同。L1 到 L5 的 大可用生产时间分别为 4500 小时,5000小时,4500 小时,1500 小时,和 2500 小时。表 14.12 列出了在每条生产线上生产

每种产品各一个单位所需要的时间。产品 P1 到 P4 各应生产多少才能够使总利润

大?

如果在生产过程中允许在生产线之间进行人员转移(从而使工时也相应转移),

如表 14.12 所示,则 大利润是多少?应转移多少个工时,且在何种情况下进行转

移?

Page 332: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

321

表格 14.11:单位生产时间

生产线

产品 L1 L2 L3 L4 L5

P1 1.3 0.9 2.0 0.3 0.9

P2 1.8 1.7 1.4 0.6 1.1

P3 1.3 1.2 1.3 1.0 1.4

P4 0.9 1.1 1.0 0.9 1.0

表格 14.12:可以进行的人员转移

目的地

来源地 L1 L2 L3 L4 L5

大可转

移工时数

L1 - yes yes yes no 400

L2 no - yes no yes 800

L3 yes yes - yes no 500

L4 no no no - yes 200

L5 yes yes yes no - 300

14.5.1 模型的数学表达

令 PRODS 为产品集合, LINES 为生产线集合。产品 p 的单位纯利润记为

pPROFIT ,在生产线 l 上所需的单位生产时间为 plDUR 。每条生产线 l 的可用总工

时数为 lCAP 。按照生产规划问题中的惯例,我们用变量 pproduce 表示生产出的产

品 p 的数量。则第一个问题对应的模型很简单。目标即 大化总利润(14.5.1),同

时不超过各条生产线的可用工时上限(约束条件(14.5.2))。因此可以得到下面的模

型:

maximize : ∑∈

⋅PRODSp

pp producePROFIT (14.5.1)

LIINESl ∈∀ : lPRODSp

ppl CAPproduceDUR ≤⋅∑∈

(14.5.2)

PRODSp∈∀ : 0≥pproduce (14.5.3)

如果允许在生产线之间转移人员,那么用变量 lhours 表示生产线 l 上需要使用的

工时数。我们再引入变量 lktransfer ,表示从生产线 l 转移到生产线 k 的工时数。约

束条件(14.5.5)即取代上面的(14.5.2),即限定总工时数等于生产量乘以单位产

品需要的工时数。

约束条件(14.5.7)将在一条生产线上实际分配的工时数,转移到其他生产线上

的工时数,以及此生产线 初给定的 大工时数之间建立平衡关系。在一条生产线上,

Page 333: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

322

实际工作的工时数为 lhours ,则 lhours 等于此生产线可用工时总数加上从其他生产

线转移来的工时数减去转移到其他生产线的工时数(如果可以将工时从生产线 l 转移

到生产线 k ,则 lkTRANSFER k 为 1,否则为 0)。约束条件(14.5.8)将给出从一条

生产线转移到其他生产线的工时上限。 后两组约束条件(14.5.9)和(14.5.10)

是对变量 lktransfer 和 lhours 的非负性约束。

maximize : ∑∈

⋅PRODSp

pp producePROFIT (14.5.4)

LIINESl ∈∀ : lPRODSp

ppl hoursproduceDUR ≤⋅∑∈

(14.5.5)

PRODSp∈∀ : 0≥pproduce (14.5.6)

LIINESl ∈∀ :

∑∑=

∈=

−+=

11 lkkl TRANSFERLINESk

lk

TRANSFERLINESk

kl transfertransferCAPlhoursl (14.5.7)

LIINESl ∈∀ : l

TRANSFERLINESk

lk TMAXtransfer

lk

≤∑=

∈1

(14.5.8)

LIINESk,l ∈∀ : 0≥lktransfer (14.5.9)

LIINESl ∈∀ : 0≥lhours (14.5.10)

14.5.2 模型实现

下面的 Mosel 程序实现了这两个问题的模型并对其进行求解。首先定义了问题 1的模型,并对其进行求解。然后加入第二个模型需要的新的数据声明和变量。对于第

二个模型,第一个模型的生产线可用工时数约束 Load(14.5.2)将被第二个模型的

约束条件(14.5.5)取代。

model "I-5 Production planning with personnel"

uses "mmxprs"

declarations

PRODS = 1..4 ! 产品集合

LINES = 1..5 ! 生产线集合

PROFIT: array(PRODS) of integer ! 每种产品单位利润

DUR: array(PRODS,LINES) of real ! 每种产品在每条生产线上的单位生产时间

CAP: array(LINES) of integer ! 每条生产线可用工时总数

Page 334: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

323

Load: array(LINES) of linctr ! 实际使用的工时数

produce: array(PRODS) of mpvar ! 生产出的产品数量

end-declarations

initializations from ‘i5pplan.dat'

PROFIT DUR CAP

end-initializations

! 目标函数:总利润

Profit:= sum(p in PRODS) PROFIT(p)*produce(p)

! 生产线的可用工时数约束条件

forall(l in LINES) Load(l):=sum(p in PRODS) DUR(p,l)*produce(p) <= CAP(l)

! 求解此问题

maximize(Profit)writeln("Total profit: ", getobjval)

! **** 允许在生产线之间转移工时 ****

declarations

TRANSF: dynamic array(LINES,LINES) of integer ! 如果允许转移工时,则为 1

! 否则为 0

TMAX: array(LINES) of integer ! 允许转移的工时数上限

hours: array(LINES) of mpvar ! 每条生产线 初的工时总数

transfer: dynamic array(LINES,LINES) of mpvar ! 转移到其他生产线的工时总数

end-declarations

initializations from 'i5pplan.dat’

TRANSF TMAX

end-initializations

forall(k,l in LINES | exists(TRANSF(k,l))) create(transfer(k,l))

! 重新定义生产线的可用工时约束条件

forall(l in LINES) Load(l):=sum(p in PRODS) DUR(p,l)*produce(p) <= hours(l)

! 工时数平衡约束条件

forall(l in LINES)

hours(l) = CAP(l) + sum(k in LINES) transfer(k,l) –

sum(k in LINES) transfer(l,k)

! 转移工时数不能超过上限

forall(l in LINES) sum(k in LINES) transfer(l,k) <= TMAX(l)

Page 335: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

324

! 求解此问题

maximize(Profit)

writeln("Total profit allowing transfer: ", getobjval)

end-model

注意在第二个模型中变量 transfer 定义为动态数组,只有在了解是否允许转移工

时(数组 TRANSF)之后,才会创建实际需要使用的变量 transfer。这样,由于 Mosel将只为所有已经创建的变量 transfer 进行自动求和,因此我们就可以不需要在约束条

件中检验 TRANSFER 的元素值。

14.5.3 结果

如果不允许在生产线之间转移人员(即工时),则 大利润为 18,883 欧元。此

时生产了 1542.55 单位的产品 P1,1010.64 单位的产品 P2,而其他两种产品都不生

产。通过检查生产线的可用工时数约束条件我们发现,只有生产线 3 和 5 用尽了所

有可用工时。这表明可以通过转移工时来增加利润。

当允许在生产线之间转移工时时, 大总利润即增长为 23,431.10 欧元。此时各

种产品的生产量分别为产品 P1 生产 702.35 单位,产品 P2 生产 942.82 单位,产品

P3 生产 554.83 单位,产品 P4 生产 854.84 单位。在生产线 1 上总计使用了 4100个工时,有 400 个工时从这条生产线转移到生产线 4。生产线 2 上使用了 3840 个工

时,有 800 个工时从这条生产线转移到生产线 5。生产线 3 上使用了 4300 个工时,

有 200 个工时从这条生产线转移到生产线 4。生产线 4 上除了使用了原有的 1500 个

工时外,还使用了其他生产线转移来的 600 个工时。生产线 5 也用完了自己原有的

工时数,以及从生产线 2 转移来的 800 个工时,即总计使用了 3300 个工时。

14.6 建筑工地上的人员规划

在建筑工地上负责架设高层建筑的钢结构的建筑工人称为钢结构安装工。下表列

出了一个工地上在六个月内对钢结构安装工的需求人数。在每个月第一天可以从其他

工地向此工地转移工人,每转移一个工人需要支出 100 元。在每月 后一天,工人

可以离开去其他工地,此时每有一个工人离开需要支出 160 元。工人过多或过少都

会带来额外支出,每缺员或冗员一人需要支出 200 元(如果人员不足出现缺员,则

其他工人需要加班,因此有额外支出)。

表格 14.13:每月钢结构安装工需求量

三月 四月 五月 六月 七月 八月

4 6 7 4 6 2

每天加班时间不能超过正常工作时间的 25%。每个月至多只能新来三名工人。

而根据与工会达成的协议,每个月离开此工地去其他工地的工人数不能超过总人数的

1/3。我们假定在二月底此工地上已经有了三名钢结构安装工,且在二月底没有人离

开,并且要求在八月底此工地上仍然应有三名钢结构安装工。那么每个月到来和离开

的工人数为多少才能使总成本 低?

Page 336: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

325

14.6.1 模型的数学表达

令 MONTHS 为此时期内月份的集合,记为用从 FIRST 到 LAST 的连续整数

值。下面是各种不同的基本支出:CARR 和CLEAVE 分别表示一名工人到来或离开

需要的支出;COVER 和CUNDER 分别表示冗员或缺员一人带来的支出。NSTART和 NFINAL 分别表示在规划期开始时和结束时工地上的工人数目。对于每个月份

m ,要求的工人数为 mREQ 。

尽管可以采用更少的参数来表达出此模型,但我们将使用五类用月份进行索引的

变量来进行建模,并表示出人员安排方案。在月份m 中,有 monsite 名钢结构安装工

(在月初有人到来之后,月底有人离开之前)。月初有 marrive 人到来,月底有 mleave

人离开,冗员数为 mover ,缺员数为 munder (14.6.1)。

MONTHSm∈∀ : Nunder,over,leave,arrive,onsite mmmmm ∈ (14.6.1)

在第一个月 FIRST 中,工人总数等于初始工人数加上该月初到来的工人数

(14.6.2)。在 后一月 LAST 结束时,工地上的工人数等于 后一月内的工人数减

去该月底离开的工人数(14.6.3)。

FIRSTFIRST arriveNSTARTonsite += (14.6.2)

LASTLAST leaveonsiteNFINAL −= (14.6.3)

对于中间的月份,现有工人数,新来工人数,和离开工人数之间的关系类似于第

8 章生产规划问题中的库存平衡约束条件,即有(14.6.4)。

{ }11 −+∈∀ LAST,,FIRSTm K :

mmmm arriveleaveonsiteonsite +−= −− 11 (14.6.4)

工地上现有的工人数可能并不等于实际需要的工人数。但是在减去冗员数目并加

上缺员数目之后,即应相等,因此有约束条件(14.6.5)。

MONTHSm∈∀ : mmmm REQunderoveronsite =+− (14.6.5)

对于每个月 m ,约束条件(14.6.6)将对加班时间长度进行限制,约束条件

(14.6.7)将对新来的工人数目进行限制,(14.6.8)将对离开的工人数目进行限制。

MONTHSm∈∀ : 4/onsiteover mm ≤ (14.6.6)

Page 337: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

326

MONTHSm∈∀ : 3≤marrive (14.6.7)

MONTHSm∈∀ : 3/onsiteleave mm ≤ (14.6.8)

目标函数为(14.6.9),即由于工人到来,工人离开,冗员或缺员而带来的总支

出。由于需要 小化总支出,因此不会同时存在冗员和缺员。

minimize (14.6.9)

( )∑∈

⋅+⋅+⋅+⋅MONTHSm

mmmm underCUNDERoverCOVERleaveCLEAVEarriveCARR

14.6.2 模型实现

下面是对上述数学模型的 Mosel 实现。其中使用内联的 if 将约束条件(14.6.2) – (14.6.4)合并到同一个约束条件表达式中。此外还应注意,集合MONTHS 对应

于规划期中包含的月份的序号(不一定要从 1 开始),所有数组都将使用此集合。

model "I-6 Construction site personnel"

uses "mmxprs"

declarations

FIRST = 3; LAST =8

MONTHS = FIRST..LAST ! 时段(月)集合

CARR, CLEAVE: integer ! 每到来/离开一人的支出

COVER, CUNDER: integer ! 每冗员/缺员一人的支出

NSTART, NFINAL: integer ! 规划期 初/ 后的工人数

REQ: array(MONTHS) of integer ! 每月需要的工人数

onsite: array(MONTHS) of mpvar ! 工地上的工人数

arrive,leave: array(MONTHS) of mpvar ! 到来/离开的工人数

over,under: array(MONTHS) of mpvar ! 冗员/缺员数目

end-declarations

initializations from ‘i6build.dat’

CARR CLEAVE COVER CUNDER NSTART NFINAL REQ

end-initializations

! 目标函数:总支出

Cost:= sum(m in MONTHS) (CARR*arrive(m) + CLEAVE*leave(m) +

COVER*over(m) + CUNDER*under(m))

! 满足每个月的工人数需求

forall(m in MONTHS) onsite(m) -over(m) + under(m) = REQ(m)

Page 338: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

327

! 人数平衡

forall(m in MONTHS)

onsite(m) = if(m>FIRST, onsite(m-1) -leave(m-1), NSTART) + arrive(m)

NFINAL = onsite(LAST) -leave(LAST)

! 对工人离开,工人到来,缺员人数的限制;整数性限制

forall(m in MONTHS) do

leave(m) <= 1/3*onsite(m)

under(m) <= 1/4*onsite(m)

arrive(m) <= 3

arrive(m) is_integer; leave(m) is_integer; onsite(m) is_integer

under(m) is_integer; over(m) is_integer

end-do

! 求解此问题

minimize(Cost)

end-model

14.6.3 结果

此问题的 优解为总支出 1780 元。下表列出了详细的人员安排方案(存在多个

等效的方案)。

表格 14.14:建筑工地人员安排 优方案

月 初始 三月 四月 五月 六月 七月 八月 终

需求 - 4 6 7 4 6 2 -

实有 3 4 6 6 6 6 4 3

到来 0 1 2 0 0 0 0 0

离开 0 0 0 0 0 2 1 0

冗员 0 0 0 0 2 0 2 0

缺员 0 0 0 1 0 0 0 0

14.7 参考文献和进阶阅读

我们所讨论的人员与机器之间的分配问题也可以应用于其他场合,例如根据求职

者的具体情况为他们安排合适的工作,或例如第 11 章中的航班连接问题。由于单纯

形算法能够自动找到具有整数值的解,因此可以很容易地处理规模可观(例如 100×100 的矩阵)的问题。

但是也存在更快速的专用算法,如 Papadimitriou 在[PS98]中给出的匈牙利算法

(Hungarian)能够在 ( )3nO 时间内进行求解,或者 Ahuja 等人 [AMO93]和

Page 339: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

328

Prins[Pri94a]提出的寻找 大流的方法。对于序列工作台,数学规划方法的表现不甚

如人意,但这类问题也存在基于图的快速算法[DZ78]。

第 14.2 节中所讨论的护士工作时间安排问题是一个简化形式的人员规划问题。

Jaumard 等在[JSV98]中给出了一个更为复杂的问题,其中需要为每个护士制定工作

时间方案,并需要考虑到法律规定和护士的个人偏好,同时 小化人员支出。在此著

作中作者提出使用列生成算法来进行求解。约束规划 适用于这种类型和相似类型的

人员调度问题(如[HC99]中给出的应用实例)。通常目标只是找出可行的方案,而不

需要进行优化。对于护士工作时间安排问题,目前已经有了专门的约束规划软件工具

([CHW98])。

在 14.3 节和 14.4 节中所讨论的问题是经典的时间表制定问题,此类问题在大中

小学校中非常常见。通常此类问题都具有很多约束条件,有些约束条件也相当困难,

在我们的例子中并没有完全列举出这些约束条件(如教室分配,不同长度的课程或考

试,需要平衡课程或考试在一周各天内的分配等)。这些问题是 NP-hard 问题,通常

采用启发式算法,元启发算法,或约束规划算法进行求解。Carter 和 Laporte 对此类

问题的求解方法进行了综述[CL96]。在[Tri84]中,作者提出了一种使用数学规划的模

型表达方法。Werra[DW97]使用了图着色模型(graph coloring model)。Boufflet 和Negre 在[BN96]中给出了一种禁忌搜索算法,以处理贡比涅技术大学的考表安排问

题。Boizumault 在[BDGP95]中也给出了一种约束规划方法,以求解一个时间表制定

问题和昂热应用数学学院的考表安排问题。

在第 14.5 节中我们给出了人员安排方面的一个应用实例。在第 8 章所研究的生

产规划问题中,忽略了资源管理的某些方面,或故意没有考虑到这些方面。在生产线

之间转移工时,从而对人力资源进行管理,这是非常重要的一项措施,不应忘记。

Clark 和 Hastings 也研究过第 14.6 节的人力规划问题[CH77],他们使用动态规

划方法对此问题进行求解。这个问题与第 8 章中的生产规划问题有些相似。可以将

此问题变形为需要使用许多工作时间段(例如一定时间长度的合同,轮班工作等)来

填充特定的时间片的问题。此问题与第 10 章中货车车队规划的问题也有些相似之处。

Page 340: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

329

Page 341: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions
Page 342: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

331

第 15 章 地方政府和公共服务部门

早对运筹学产生兴趣的是军方,之后才是工业界。在一些 发达的国家中,公

共服务部门越来越多地采用这些方法,以便在预算一定的情况下能够提供 好的服

务。

饮水供应问题是 21 世纪的一个重要民生问题。需要找到新的水源,并扩建原有

的排水系统及供水管道系统,以避免出现瓶颈。在第 15.1 节中我们将计算一个供水

网络的 大总供水能力,这是一个经典的 大化流问题。我们使用的方法也可以应用

于其他液体,及道路网络或电信网络。

第 15.2 节中将研究街道的闭路电视监控系统。在此问题中将研究如何使覆盖所

有街道所需要使用的摄像头数目 少。在第 15.3 节中将讨论一个在一些国家中仍然

会存在的政治问题:有一个党派希望重新划分各个选区,以使下次大选时的能够获得

的席位数 多。在希望使选区划分尽量公平时,也需要考虑此问题。

当路面结冰时需要在路面上铺沙防滑,第 15.4 节即研究应采取怎样的路线进行

铺沙才能够使总路线 短。与第 10.4 节的燃油运输问题不同,在这个问题中任务不

是在结点上执行,而是在弧上执行。第 15.5 节将研究公共服务设施的选址问题,即

选择个人所得税缴纳点的位置。 优方案应能使区域内的居民与 近的纳税点的平均

距离 短。在本章 后我们将使用 DEA 方法对四个医院的表现进行评估。

15.1 供水管理

图 15.1 是一个供水网络的示意图。其中结点用 1 到 10 标记,表示由水管网络

连接起来的城市,水库,及泵站。三个城市分别为 Gotham 市,Metropolis 市,以及

Spider Ville 市,它们的供水来源为两个水库。水库 1 和水库 2 的供水能力分别为 35千立方米/小时和 25 千立方米/小时。在图中每条管道上都标出了该管道的 大通过

量,单位也为千立方米/小时。

图 15.1:供水网络

Page 343: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

332

现在需要研究现有的供水网络能否满足这些城市十年后的用水量(分别为 18,15,20 千立方米/小时)。请求出此网络的 大流。此网络能否满足十年后的供水需

要?

15.1.1 模型的数学表达

在此问题中需要从给定的图中找出一个流,使其能够满足三个城市(结点 8,9,10)的用水量,同时要考虑到水库 1 和水库 2 的供水能力。此问题是一个经典的

大流问题。

首先通过如下方法对原图进行变形:

♦ 加入第一个假想的结点,名为 SOURCE (图 15.2 中的结点 11),用两条

弧(11,1)和(11,2)在它与水库之间建立连接,这两条弧的通过量即对应于对

应水库的供水能力(35 和 25 千立方米/小时)。

♦ 加入第二个假想的结点,名为 SINK(图 15.2 中的结点 12),并用弧(8,12),(9,12)和(10,12)连接此结点与三个城市,这三条弧的通过量即对应于对应城

市的用水需求量(18,15,和 20 千立方米/小时)。

这 样 就 得 到 如 图 15.2 所 示 的 运 输 网 络 ( transport network ) 图

( )SINK,SOURCE,CAP,ARCS,NODESG = ,其中:

♦ NODES 是结点的集合; ♦ ARCS 是弧的集合;

♦ nmCAP 表示弧 ( )m,n 的 大通过量;

♦ SOURCE 是源结点(结点 11); ♦ SINK 是宿结点(结点 12)。

图 15.2:加入了源结点和宿结点之后的供水网络

nSUCC 表示与结点 n 直接相连的前辈结点集合, nPRED 表示与结点 n 直接相

连的后辈结点集合。则在此运输网络中总通过量为TotalFlow 的流应满足如下的约束

条件:

Page 344: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

333

( ) ARCSm,n ∈∀ : nmnm CAPflow ≤ (15.1.1)

SINK,SOURCEn ≠∀ : ∑∑∈∈

=nn predm

mnSUCCm

nm flowflow (15.1.2)

∑∈

=SINKPREDn

SINK,nflowTotalFlow (15.1.3)

( ) ARCSm,n ∈∀ : 0≥nmflow (15.1.4)

约束条件(15.1.1)限定每条弧 ( )m,n 上的流 nmflow 不超过此弧的通过量上限

nmCAP 。约束条件(15.1.2)限定进入结点 n 的总流量等于离开结点n 的总流量(源

结点和宿结点除外)。此约束条件也称为 Kirchhoff 定理。约束条件(15.1.3)表明网

络中的总流量TotalFlow 应等于流入宿结点的流量(也等于流出源节点的流量)。

终,(15.1.4)式限定所有变量均为非负值。这样我们要解决的问题即找出结点

SOURCE 和 SINK 之间的 大流,即使TotalFlow 大化的流。因此目标函数就可

以写为(15.1.5)式:

maximize TotalFlow (15.1.5)

很明显,每条弧上的流都可以取非整数值。但是,在这种类型的问题中,如果所

有弧的通过量限制均为整数值,则单纯形算法求得的线性问题的 优解就是整数解。

15.1.2 模型实现

下面是对上述模型的 Mosel 程序实现,其中我们将弧集合表示为列表 PIPE ,

每条弧 ARCSa∈ 即表示为 ( )21 aa PIPE,PIPEa = 。出于效率考虑,数组CAP 和

flow 都使用弧的序号进行索引,而不再像前面的数学表达式一样使用对应于两个结

点的二重索引 ( )m,n 。通过这种索引方式,我们所定义的数组大小即等于需要使用的

大小。

model "J-1 Water supply"

uses "mmxprs"

declarations

ARCS: range ! 弧集合

NODES=1..12

PIPE: array(ARCS,1..2) of integer ! 弧(水管)定义

CAP: array(ARCS) of integer ! 弧的 大通过量

SOURCE,SINK: integer ! 源结点和宿结点

end-declarations

Page 345: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

334

initializations from 'j1water.dat’

PIPE CAP SOURCE SINK

end-initializations

finalize(ARCS)

declarations

flow: array(ARCS) of mpvar ! 弧上的流

end-declarations

! 目标函数:总流量

TotalFlow:= sum(a in ARCS | PIPE(a,2)=SINK) flow(a)

! 结点上的流平衡

forall(n in NODES | n<>SOURCE and n<>SINK)

sum(a in ARCS | PIPE(a,1)=n) flow(a) = sum(a in ARCS | PIPE(a,2)=n) flow(a)

! 通过量限制

forall(a in ARCS) flow(a) <= CAP(a)

! 求解此问题

maximize(TotalFlow)

end-model

15.1.3 结果

图 15.3: 大流

此网络中可以通过的 大流为 52,000 立方米/小时。图 15.3 即显示出此时流通

过网络的方案(存在多个等价方案)。在此图中,每条弧上都标记出通过此弧的流量

及此弧的允许 大通过量(均为千立方米/小时)。例如,弧(1,3)上的流为 17,此弧

的 大通过量为 20。

大流量不足以满足十年后这些城市的总用水量:在此网络布局和通过量条件

Page 346: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

335

下,向 Gotham 市供水的量只能达到 17,000 立方米,而实际上需要 18,000 立方米。

15.2 闭路电视监控

在过去几个月里,Billston 市的工业区发生了多起夜间入室行窃案件。此工业区

有保安巡逻,但保安人数太少。因此负责此区域安全的相关市政部门决定安装监控摄

像头,以协助保安工作。这些监控摄像头都可以 360 度旋转。因此在几条街道的交

汇处安装一个摄像头就可以同时对这些街道进行监控。图 15.4 是此工业区的地图,

其中给出了需要用闭路电视进行监控的区域范围,并用数字标记出了 49 个可以安装

摄像头的位置。应选择在哪些位置安装摄像头才能使需要使用的摄像头数目 少?

图 15.4:Billston 市的工业区

15.2.1 模型的数学表达

此问题中 繁琐的工作是要对该地区的地图进行编码,但为了使用计算机求解此

问题,就必须先完成这一步骤。用 NODES 表示可以安装摄像头的位置(大多为街

道交汇处)的集合。街道网络可以建模为图 ( )STREETS,NODESG = ,其中

STREETS 是摄像头位置( NODES )之间的连接(街道)。

Page 347: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

336

定义二值变量 nplace ,当且仅当在位置 n 处设置了摄像头时此变量取值才为 1,

否则为 0。约束条件(15.2.2)即限定每条街道都应至少处于一个摄像头监控之下。

因此,如果在位置 n 和m 之间存在一条街道,则需要在位置 n 上( 1=nplace )或

位置m 上( 1=mplace )安装一个摄像头,或者在这两个位置上都安装摄像头。可

以同时用两个摄像头监控一条街道,并且有些时候这样做能够带来一些好处:在图

15.4 中,在位置 4 和位置 6 上同时安装摄像头似乎对于这条街道显得有些多余,但

这两个摄像头同时也能够对位置 5,7,和 8 方向的死胡同进行监控。目标函数为

(15.2.1),即 小化需要安装的摄像头数目。在定义了此图之后,就可以得到一个

非常简单的 0-1 整数规划问题。

minimize ∑∈NODESn

nplace (15.2.1)

( ) STREETSm,n ∈∀ : 1≥+ mn placeplace (15.2.2)

NODESn∈∀ : { }10,placen ∈ (15.2.3)

15.2.2 模型实现

无向图可以用对称的邻接矩阵 STREET 来进行编码。如果 1=nmSTREET ,则

表示在 n 和m 之间存在一条街道 ( )m,n ,否则表示不存在这样的街道。此矩阵在数据

文件中间将保存为稀疏矩阵的形式,即只有值为 1 的矩阵元素才有定义。为减少文

件中保存的数据量,将只给出 mn < 的弧 ( )m,n 。邻接矩阵的另外一半将在 Mosel

程序中计算出。

model "J-2 Surveillance"

uses "mmxprs"

declarations

NODES=1..49

STREET: dynamic array(NODES,NODES) of integer ! 如果两个结点之间有街道相连

! 则为 1,否则为 0

place: array(NODES) of mpvar ! 如果结点上安装了摄像头

! 则为 1,否则为 0

end-declarations

initializations from ‘j2bigbro.dat’

STREET

end-initializations

Page 348: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

337

forall(n,m in NODES | exists(STREET(n,m)) and n<m )

STREET(m,n):= STREET(n,m)

! 目标函数:安装的摄像头总数

Total:= sum(n in NODES) place(n)

! 结点上的流平衡条件

forall(n,m in NODES | exists(STREET(n,m)) ) place(n)+place(m) >= 1

forall(n in NODES) place(n) is_binary

! 求解此问题

minimize(Total)

end-model

15.2.3 结果

优化算法可以求得整数解为需要使用 24 个摄像头,在图 15.5 中用圆圈标记出

了这些摄像头的位置(此问题存在多个等价解)。

图 15.5:摄像头位置

Page 349: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

338

15.3 选区划分

在一个遥远的国家,Sark Mevo 所领导的政党 终击败了 Reguel Tekris 王子领

导的联合党派。Mevo 希望巩固他的在首都地区的席位。首都由 14 个街区组成,这

些街区将分组为多个选区。图 15.6 是首都地区的示意图。在图中用加粗的数字 1 到

14 对这些街区进行了编号。每个街区中的另外两个数字是预计该街区会投票给 Mevo的选民数和该街区的选民总数。所有选民都必须投票,且选举胜出方必须得到绝对多

数选票。一个选区可以由多个相邻的街区组成,且选取内总选民数应在 30,000 到

100,000 之间。如果两个街区不相邻,例如 12 和 13,则它们不能组成一个选区。如

果某个街区选民人数超过 50,000,则允许此街区单独作为一个选区。但是由于 Mevo本人就居住在街区 10 内,因此迫于舆论压力,他不能将这个街区单独作为一个选区。

请设计出一个将首都划分为 5 个选区的方案,以使 Mevo 得到的席位数 多。如

果这样做有困难,可以尝试划分为 6 个选区。Mevo 的宠臣 Snirp 精于数学,他建议

Mevo 采用数学规划方法...

图 15.6:首都地图及每个街区数据

15.3.1 模型的数学表达

我们所考虑的问题是一个划分问题(partitioning problem):给定了所有可能存

在的选区集合,我们需要选择其中的一个子集,以使每个街区都出现且只出现在其中

的一个选区中。

令QUARTERS 为首都的街区集合,MINSINGLE 为单街区选区的 小选民数,

MINPOP和MAXPOP 分别表示多街区选区的 小选民数和 大选民数。每个选区

的选民人数记为数组 POP 。这样我们就可以使用下面的算法计算出所有可能的选

区:

♦ 对于QUARTERS 中的所有街区q :

Page 350: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

339

- 如果q 中选民数 MINSINGLE≥ 且 10≠q q,则将 q 加入到选区列表。

- 对 于 q 的 所 有 邻 居 p : 如 果 ( )qp + MAXPOP≤ , 则 调 用

{ }( )q,pneighbor_add

♦ 过程 ( )set,toaddneighbor_add

- 将 toadd 加入到 set 中

- 如果 set 的选民数 MINPOP≥ ,则将 set 加入到选区列表

- 对于 toadd 的所有邻居 p ,如果 { }pset U 的选民数 MAXPOP≤ :调

用 ( )set,pneighbor_add 。

如果定义每个街区的邻居集合只包含那些与此街区相邻且编号比它大的街区,则

上述算法将只计算每个可能的选区一次。

下面我们可以假定已经将所有可能的选区的集合 RDIST 保存为数组 DISTR

(本例中存在 48 个可能的选区)。则当且仅当街区q 位于选区 d 中时,此数组中的

元素 dqDISTR 取值才为 1,否则为 0。根据给定的每个街区的选票预测,我们可以计

算出每个选区 d 的多数标记 dMAJ 。如果此选区内投给 Mevo 的选票数目超过其中所

有街区选票总数的 50%(即 Mevo 得到多数选票),则 dMAJ 取值为 1,否则为 0。

为写出此问题的数学表达,我们还需要为每个选区 d 引入一个二值变量

dchoose ,当在划分方案中含有街区 d 时 dchoose 取值才为 1(15.3.3)。约束条件

(15.3.2)将保证只形成 REQD个选区,其中 REQD表示要求得到的选区数目。目

标函数为(15.3.1),即 大化所选择的划分方案中 Mevo 能够获得的席位数。

maximize ∑∈

⋅RDISTd

dd chooseMAJ (15.3.1)

REQDchooseRDISTd

d =∑∈

(15.3.2)

RDISTd ∈∀ : { }10,choosed ∈ (15.3.3)

每个街区都至少被包含在一个选区中,此约束条件可以表示为(15.3.4)。

Page 351: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

340

QUARTERSq∈∀ : 1=⋅∑∈RDISTd

ddq chooseDISTR (15.3.4)

在完成数据预处理之后,数学模型就具有十分简单的形式。此数学模型的特点是

系数矩阵的元素全部为二值变量,且关系式右手侧均为常数项。

15.3.2 模型实现

为使表达清晰,我们将此问题的 Mosel 实现分为两个文件,以将模型与数据预

处理过程分开。在下面我们将先列出此数学模型的 Mosel 程序。在模型程序 初,

完成声明数据数组之后,我们将包含入文件 j3elect_calc.mos,此文件将为模型生成

所需要使用的数据。所有使用 include 语句包含到 Mosel 程序中的代码都等同于将其

代码直接插入到程序中的此位置。因此被包含的代码中不能含有 model "...",和

end-model。要求得到的选区数目将定义为参数 REQD,这样用户无须修改代码就

可以使用不同的 REQD值来执行此模型。

model "J-3 Election districts"

uses "mmxprs"

parameters

REQD = 5 ! 要求的选区数目

end-parameters

declarations

QUARTERS = 1..14 ! 街区数目

RDIST: range ! 选区集合

MAJ: array(RDIST) of integer ! 如果获得多数选票,则为 1,否则为 0

DISTR: array(RDIST,QUARTERS) of integer ! 如果街区位于选区中,则为 1,否则为 0

end-declarations

include "j3elect_calc.mos"

declarations

choose: array(RDIST) of mpvar ! 如果选择了选区,则为 1,否则为 0

end-declarations

! 目标函数:获得席位数

Votes:= sum(d in RDIST) MAJ(d)*choose(d)

! 一个街区只能属于一个选区

forall(q in QUARTERS) sum(d in RDIST) DISTR(d,q)*choose(d) = 1

! 选区总数应等于要求选区数

Page 352: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

341

sum(d in RDIST) choose(d) = REQD

forall(d in RDIST) choose(d) is_binary

! 求解此问题

maximize(Votes)

! 打印输出求解结果

if(getprobstat<>XPRS_OPT) then

writeln("Problem is infeasible")

else

writeln("Total number of votes: ", getobjval)

end-if

end-model

在这个模型中,我们将对优化器的状态进行检验(使用函数 getprobstat),以决

定是否打印出求解结果。如果没有求出 优值(XPRS_OPT),则此问题可能不可行

(XPRS_INF),或无界(XPRS_UNB),或算法尚未结束(XPRS_UNF),例如由

于时间限制而没有结束。

下面的 Mosel 过程将实现 15.3.1 节中所描述的算法。数据文件中包含首都的每

个街区的选民数 POP 和预期投票给 Mevo 的选民数 VOTES,此外数据文件中还包

含有每个标号比此街区大的相邻街区集合。过程 calculate_distr 将根据输入数据计算

出可能的选区列表 DISTR。在这段代码 后将调用此过程,以执行完整的数据预处

理算法。在建立了可能的选区列表 DISTR 之后,还将计算出每个选区 d 的多数标记

MAJ(d)。

declarations

NUMD: integer ! 可能的选区数目

RN: range ! 相邻的街区

NEIGHB: array(QUARTERS,RN) of integer ! 相邻街区的集合

POP: array(QUARTERS) of integer ! 选民人数(千人)

VOTES: array(QUARTERS) of real ! 投票给 Mevo 的选民数(千人)

MINPOP,MAXPOP,MINSINGLE: integer ! 选区的选民数限制

end-declarations

initializations from 'j3elect_rev.dat’

NEIGHB POP VOTES MINPOP MAXPOP MINSINGLE

end-initializations

!**** 将可能的选区保存在选区列表中 ****

procedure save_distr(sQ: set of integer)

NUMD+=1

Page 353: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

342

forall(q in sQ) DISTR(NUMD,q):=1

end-procedure

!**** 将邻居街区加入到当前的街区集 ****

procedure add_neighb(toadd:integer, sQ:set of integer)

declarations

nQ: set of integer

end-declarations

nQ:=sQ+{toadd}

if(sum(q in nQ) POP(q) >= MINPOP) then ! 选民人数足够多

save_distr(nQ)

end-if

forall(p in RN | exists(NEIGHB(toadd,p))) ! 尝试加入每个邻居街区

if(sum(q in nQ) POP(q)+POP(NEIGHB(toadd,p))<=MAXPOP) then

add_neighb(NEIGHB(toadd,p), nQ)

end-if

end-procedure

!**** 计算可能选区的列表 ****

procedure calculate_distr

NUMD:=0

forall(q in QUARTERS) do

if (POP(q) >= MINSINGLE and q<>10) then ! 单街区选区

save_distr({q})

end-if

forall(p in RN | exists(NEIGHB(q,p))) ! 尝试加入每个邻居街区

if(POP(q)+POP(NEIGHB(q,p))<=MAXPOP) then

add_neighb(NEIGHB(q,p),{q})

end-if

end-do

forall(d in 1..NUMD) ! 计算多数标记

MAJ(d):= if(((sum(q in QUARTERS | DISTR(d,q)>0) VOTES(q)) /

(sum(q in QUARTERS | DISTR(d,q)>0) POP(q)) >= 0.5), 1, 0)

finalize(RDIST)

end-procedure

!**** 开始计算可能的选区的列表 ****

calculate_distr

Page 354: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

343

15.3.3 结果

当 5=REQD 时此问题无解。Snirp也应该注意到这一点,因为总人口为 540,000

人,而每个选区人数都不能超过 100,000;这样显然我们至少需要 6 个选区。Mevo很生气,于是杀掉了 Snirp,然后任命 Che Pike 为御用数学家。

我们使用 6=REQD 再次运行此 Mosel 程序。这时得到的划分方案如图 15.7 所

示:除了一个选区之外(灰色区域),在其他选区中 Mevo 都获得了多数票。

图 15.7: 6=REQD 时的选区划分

15.4 路面铺沙

图 15.8: 村庄街道图

Page 355: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

344

在一个村庄中,应对路面结冰的措施是向路面上铺沙防滑。图 15.8 是这个村庄

的街道示意图。其中的结点表示街道的交汇处,弧表示需要铺砂的街道。在弧上标出

了每条街道的长度。

由养路站负责铺沙,养路站位于交汇点 1 处,铺沙所使用的卡车就在此养路站

内。卡车的载沙量足够大,能够不需要中途加沙就完成所有路面的铺沙任务。由于有

些街道是单行线,因此有时候可能需要多次经过一条街道。请为此铺沙车选择一条路

线,使得完成所有街道铺沙所需的路程 短。对于双向的街道,需要为每个方向的车

道分别进行铺沙。

15.4.1 模型的数学表达

令 ( )LEN,ARCS,ISECG = 为表示此村庄街道网络的有向图。 ISEC 表示街道

交汇点集合, ARCS 表示弧集合, ijLEN 表示弧 ( )j,i 的长度,单位为米。我们所寻

找的路线方案即对应于起点和终点均为养路站结点即结点 1 的一条回路,此回路必

须至少通过每条弧一次,我们需要找出此回路的 短长度。这是一个经典的问题,

早由中国数学家管梅谷给出了解答,因此称为中国邮递员问题(Chinese postman problem)。

在有向图中欧拉回路(Eulerian circuit)是指每条弧都通过一次且仅一次的回路。

如果存在欧拉回路,则这样的回路长度等于所有弧长度之和,因此它必定是我们这个

问题的 优解。为判断图G 中是否存在欧拉回路,存在一个简单的判据:每个结点 i都应平衡,即进入结点 i 和离开结点 i 的弧数目应相等,请参考 Gibbons 的工作

[Gib85]。不要将这个判据与更著名的无向图中欧拉回路存在判据混淆,在后者中当

且仅当有 0 个或 2 个结点的度为 2 时才存在欧拉回路。

此问题的图G 中由于结点 1 不能平衡,因此不存在欧拉回路。这样回路必须多

次通过某一条或多条已经完成铺沙的街道。目标函数是 小化这样不进行工作的路程

的总长度。很难写出直接处理此问题的数学模型,因此我们将首先处理一个较为简单

的问题,即向图G 中加入一些弧,来使所有结点都平衡,从而将它转化为欧拉图'G ,

同时使所加入的弧的总长度 短。然后问题就变为找出'G 中的欧拉回路,而这个问

题目前已经有了一些简单的解法。

以 小的代价使图平衡的问题可以建模为一个相当简单的数学模型:对于

ARCS 中的每条弧 ( )j,i ,都定义一个整数变量 ijuse ,表示此弧在整个路程中被经过

的次数(5.4.3)。此次数包括一次进行铺沙,以及可能存在的其他几次只是路过而没

有进行铺沙的情况(我们加入的弧)。由于必须对每段路面都进行铺沙,因此 ijuse 至

少应取值为 1。约束条件(15.4.2)要求转换后得到的图'G 中的所有结点都满足平衡

要求。这些约束条件与流问题(如 15.2 中的供水问题)中的 Kirchhoff 定理相似。目

Page 356: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

345

标函数为(15.4.1),即 小化总路程。

minimize ( )∑∈

⋅ARCSj,i

ijij useLEN (15.4.1)

ISECi∈∀ : ( ) ( )

∑∑∈∈

=ARCSj,i

ijARCSi,j

ji useuse (15.4.2)

( ) ARCSj,i ∈∀ : Nuseuse ijij ∈∧≥ 1 (15.4.3)

实际上由于此模型的矩阵是一个结点-弧关联矩阵,因此不需要指定所有的变量

均为整数。单纯形算法将自动求得整数解。通过优化将能够得到每条弧的经过次数

ijuse 和 优的总路程。如果我们的目的不是找出具体路线,那么现在就已经完成任

务了。到此为止我们已经通过为每条弧 ( )j,i 加入 1−ijuse 个副本得到了欧拉图'G 。

原有的弧就是路面铺沙第一次经过每段街道的路线。

为得到一个欧拉回路,我们需要使用一个过程 add_path(i,tour)。此过程将从结

点 i 开始沿着尚未走过的弧前进尽可能远的距离。将对已经访问过的弧进行标记,以

避免重复访问。 后,此过程将返回找到的路径 tour 。可以证明路径 tour 总是在结

点 i 处结束,因此能够形成一个欧拉回路。如果不能形成欧拉回路,则我们从 tour 中仍然有未访问的弧的结点出发,再次调用 add_path,从而将原先的路径 tour 扩展。

我们将在下一节数学模型的 Mosel 程序之后给出此算法的实现。下面是此算法的伪

代码。.

♦ 调用 add_path(1,tour)

♦ 如果此路径 tour 没有访问所有弧:

- 搜索找到 tour 中第一个还有未访问的弧的结点 i

- 调用 add_path(i,tour)

♦ 过程 add_path(node,tour)

- 找到插入点 pos

- 找到一条尚未访问过的路径 subtour ,它从 pos出发且返回 pos。

- 将新的路径 subtour 插入到原路径 tour 中的位置 pos处

15.4.2 模型实现

可以将上述数学模型转化为如下的 Mosel 程序。我们已经知道,可以将图编码

为两种形式:弧列表的形式,或者邻接矩阵的形式。在本书 6.5 节的露天采矿问题,

第 7.6 节的装配线平衡问题,以及第 11.2 节的机组编成问题中都使用了前一种形式。

在这个例子中我们将使用后一种,即基于矩阵的表示形式,在第 12.1 节网络可靠性

Page 357: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

346

问题,第 15.2 节闭路电视监控问题中也采用了这种表示形式。

可以将图定义为弧长度矩阵 LEN ,其中如果弧 ( )j,i 不存在,则 0=ijLEN 。在

数据文件中图保存为稀疏矩阵形式(即,只包含有非零元素的值及非零元素的索引

值)。我们将 LEN 定义为动态数组,这样只有那些在数据文件中列出来的元素才会

创建,因此我们可以对此数组使用函数 exists,来检测一条街道是否存在(同时有效

地枚举出 LEN 中有定义的元素)。在读入数据之后,只为 LEN 中存在的元素创建变

量use。在对这些变量进行求和时,不需要每次都重复 exists(LEN(i,j)):Mosel 将自

动忽略那些未定义的元素。

model "J-4 Gritting circuit"

uses "mmxprs"

declarations

ISEC = 1..12 ! 街道交汇点集合

LEN: dynamic array(ISEC,ISEC) of integer ! 街道长度

use: dynamic array(ISEC,ISEC) of mpvar ! 街道经过次数

end-declarations

initializations from 'j4grit.dat'

LEN

end-initializations

forall(i,j in ISEC | exists(LEN(i,j))) create(use(i,j))

! 目标函数:回路总长度

Length:= sum(i,j in ISEC | exists(LEN(i,j))) LEN(i,j)*use(i,j)

! 平衡交汇点处的交通流

forall(i in ISEC) sum(j in ISEC) use(i,j) = sum(j in ISEC) use(j,i)

! 每条街道都应铺沙

forall(i,j in ISEC) use(i,j) >= 1

! 求解此问题

minimize(Length)

end-model

变量 ijuse 表示卡车经过某一条街道的次数,但我们实际希望知道的是卡车经过

所有街道的总行程。为打印出有意义的结果,我们需要计算出一个欧拉回路。为此可

以向上述程序中加入下面的代码。这些代码即实现了上一节中描述的算法。我们将过

程 add_path 改为一个函数,返回新的(子)路径中的弧数目。定义计数器 ct,来控

制何时完成计算欧拉回路。此计数器初始值设置为上述优化算法求得的结果,当将子

Page 358: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

347

路径加入到主路径中时,即从计数器值中减去子路径包含的弧数目。当计数器值为 0时,算法即停止。

forward function find_unused(J: array(range) of integer):integer

forward function add_path(node:integer, J: array(range) of integer):integer

ct:=round(getsol(sum(i,j in ISEC) use(i,j)))

declarations

TOUR: array(1..ct+1) of integer

COUNT: array(ISEC,ISEC) of integer

end-declarations

! 欧拉回路算法的主循环

forall(i,j in ISEC | exists(LEN(i,j))) COUNT(i,j):=round(getsol(use(i,j)))

TOUR(1):=1

ct-=add_path(1,TOUR)

while(ct>0)

ct-=add_path(find_unused(TOUR),TOUR)

writeln("Tour: ", TOUR)

!----------------------------------------------------------------

! 找到列表中第一个仍然有未访问的弧的结点

function find_unused(J: array(range) of integer):integer

i:=1

returned:=1

while(J(i)>0 and i<getsize(J))

if (sum(j in ISEC) COUNT(J(i),j) > 0) then

returned:=J(i)

break

else

i+=1

end-if

end-function

!----------------------------------------------------------------

! 向当前的回路中加入一条子回路

function add_path(node:integer, J: array(range) of integer):integer

declarations

NEWJ: array(1..getsize(J)) of integer

end-declarations

Page 359: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

348

! 插入点

pos:=1

while(J(pos)<>node and pos<getsize(J)) pos+=1

! 找到一条新回路

cur:=node; newct:=0

while(sum(j in ISEC) COUNT(cur,j) > 0) do

forall(j in ISEC) if(COUNT(cur,j) > 0) then

COUNT(cur,j)-=1

newct+=1; NEWJ(newct):=j

cur:=j

break

end-if

end-do

! 将新的回路加入到原主路径

i:=getsize(J)-newct

while(i>pos) do

J(i+newct):=J(i)

i-=1

end-do

forall(j in 1..newct) J(pos+j):=NEWJ(j)

returned:=newct

end-function

15.4.3 结果

通过优化可以得到路径总长度 小值为 5990 米。此时街道(3,4),(4,8),(5,1),(6,9),(10,6),和(11,7)经过了两次,其他街道都只经历了一次。

图 15.9:加入新的弧后的欧拉图

Page 360: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

349

图 15.9 中是得到的欧拉图'G ;在其中用加重线绘出了两次经过的弧。此图中的

一条欧拉回路为:1→2→6→5→6→7→8→12→11→7→11→10→7→3→4→3→4 →8→4→8→11→7→6→9→5→6→9→10→6→10→6→2→3→2→5→1→5→1(存

在多条等价路径)。

15.5 所得税交纳点选址

所得税管理部门计划对某个地区中的所得税交纳点网络进行重新设计。图 15.10是对此地区内的城市和主要道路的示意图。城市旁边的黑体数字表示城市的居民数

目,单位为千人。在连接城市之间的弧上标出了它们之间的距离,单位为千米(斜体

字)。为覆盖各个城市,所得税管理部门决定在三个城市中设置纳税点。应在哪三个

城市中设置纳税点才能够使居民与 近的纳税点之间平均距离 小?

图 15.10:此区域内的城市和道路图

15.5.1 模型的数学表达

这个问题属于一类著名的问题,称为 p-中位问题(p-median problem)。令

CITIES 表示在此地区内的城市集合,NUMLOC 为要设置的纳税点数目。记 cPOP

为城市 c 的人口数目。下表中给了城市之间的 短路径矩阵 DIST 。

可以使用任意两点间 短路径算法,如 Floyd-Warshall 算法[AMO93]来根据图

15.10 求出此距离矩阵。

♦ 对于所有结点对 ( )d,c :将距离 cdDIST 的值初始化为正无穷(足够大的正

数值)。

Page 361: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

350

♦ 对所有结点 c ,设置 0=ccDIST 。

♦ 对于所有弧 ( )d,ca = ,设置 cdDIST 为此弧的长度

♦ 对于所有的结点 b , c , d ,如果 bdcbcd DISTDISTDIST +> ,则设置

bdcbcd DISTDISTDIST += 。

表格 15.1:距离矩阵

1 2 3 4 5 6 7 8 9 10 11 12

1 0 15 37 55 24 69 18 33 48 49 58 67

2 15 0 22 40 38 52 33 48 42 55 61 61

3 37 22 0 18 16 30 43 28 20 58 39 39

4 55 40 18 0 34 12 61 46 24 62 43 34

5 24 38 16 34 0 36 27 12 24 49 37 43

6 60 52 30 12 36 0 57 42 12 50 31 32

7 18 33 43 61 27 57 0 15 45 22 40 61

8 33 48 28 46 12 42 15 0 30 37 25 46

9 48 42 20 24 24 12 45 30 0 38 19 40

10 40 55 58 62 49 50 22 37 38 0 19 40

11 58 61 39 43 37 31 40 25 19 19 0 21

12 67 61 39 34 43 22 61 46 19 40 21 0

为写出此问题的数学表达形式,我们需要引入两组二值变量:变量 cbuild ,当

且仅当在城市 c 建立了纳税点时取值才为 1(15.5.1);变量 cddepend ,当且仅当城

市 c 中的居民需要到城市 d 的纳税点纳税时取值才为 1(15.5.2)。变量 cddepend 将

用于计算每个居民到 近的纳税点的平均距离,并找出城市与纳税点之间的依赖关

系。

CITIESc∈∀ : { }10,buildc ∈ (15.5.1)

CITIESd,c ∈∀ : { }10,dependcd ∈ (15.5.2)

应开设 NUMLOC 个纳税点,即可以表示为约束条件(15.5.3)。约束条件

(15.5.4)将限定每个城市的居民只能到一个纳税点缴税。

NUMLOCbuildCITIESc

c =∑∈

(15.5.3)

CITIESc∈∀ : 1=∑∈CITIESd

cddepend (15.5.4)

Page 362: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

351

目标函数为(15.5.5),即 小化根据每个城市居民人数进行加权的距离总和。将

求得的值除以此地区的居民总人数就可以得到每个居民到 近的纳税点的平均距离。

minimize ∑ ∑∈ ∈

⋅⋅CITIESc CITIESd

cdcdc dependDISTPOP (15.5.4)

如果模型表达就到此为止,那么可能会出现将城市分配给不存在的纳税点的情

况。因此我们需要将 00 =⇒= cdc dependbuild 这个隐含关系表示为线性约束条

件。为此可以写出约束条件(15.5.6):当 cbuild 取值为 0 时, cddepend 取值也为 0。

CITIESd,c ∈∀ : dcd builddepend ≤ (15.5.2)

15.5.2 模型实现

下面的 Mosel 程序即实现了上述的数学模型。理论上说,需要将所有变量都限

定为二值变量,但是在求解时可以忽略 cddepend 的二值约束条件,以减少整数变量

的总数目。

model "J-5 Tax office location"

uses "mmxprs"

forward procedure calculate_dist

declarations

CITIES = 1..12 ! 城市集合

DIST: array(CITIES,CITIES) of integer ! 距离矩阵

POP: array(CITIES) of integer ! 城市的人口

LEN: dynamic array(CITIES,CITIES) of integer ! 公路网

NUMLOC: integer ! Desired number of tax offices

build: array(CITIES) of mpvar ! 如果在城市中设置纳税点,则为 1

! 否则为 0

depend: array(CITIES,CITIES) of mpvar ! 如果城市 c 中的居民需要到城市 d

! 的纳税点纳税,则为 1,否则为 0

end-declarations

initializations from ‘j5tax.dat’

LEN POP NUMLOC

end-initializations

! 计算距离矩阵

calculate_dist

Page 363: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

352

! 目标函数:加权总距离

TotDist:= sum(c,d in CITIES) POP(c)*DIST(c,d)*depend(c,d)

! 为城市指定纳税点

forall(c in CITIES) sum(d in CITIES) depend(c,d) = 1

! 限制纳税点数目

sum(c in CITIES) build(c) <= NUMLOC

! 城市-纳税点之间依赖关系与建造的纳税点之间的关系

forall(c,d in CITIES) depend(c,d) <= build(d)

forall(c in CITIES) build(c) is_binary

! 求解此问题

minimize(TotDist)

end-model

我们在过程 calculate_dist 中实现了 Floyd-Warshall 算法,以找出每对结点之间

的 短距离。

procedure calculate_dist

! 将所有距离值初始化为足够大的值

BIGM:=sum(c,d in CITIES | exists(LEN(c,d))) LEN(c,d)

forall(c,d in CITIES) DIST(c,d):=BIGM

! 设置对角线上的值为 0

forall(c in CITIES) DIST(c,c):=0

! 已有的道路连接长度

forall(c,d in CITIES | exists(LEN(c,d))) do

DIST(c,d):=LEN(c,d)

DIST(d,c):=LEN(c,d)

end-do

! 更新每个结点三元组对之间的距离

forall(b,c,d in CITIES | c<d )

if DIST(c,d) > DIST(c,b)+DIST(b,d) then

DIST(c,d):= DIST(c,b)+DIST(b,d)

DIST(d,c):= DIST(c,b)+DIST(b,d)

end-if

Page 364: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

353

end-procedure

15.5.3 结果

如果不指定变量 cddepend 为二值变量,优化器也能够找到一个所有变量取值均

为整数的 优解,其对应的加权距离和为 2438,我们运气不错。由于此区域内的总

居民数为 185,000 人,因此每个居民到 近纳税点的平均距离为 2438/185 = 13.178千米。将在结点 1,6,和 11 设置纳税点。城市 1,2,5,7 的居民将去结点 1 的纳

税点缴税,城市 3,4,6,9 的居民将去结点 6 的纳税点缴税,城市 8,10,11,12将去结点 11 的纳税点缴税。

15.6 医院的工作效率

巴黎的医院管理部门决定对四家主要医院的外科部门的工作效率进行评估,以提

高服务的质量。为保证此项调查为匿名调查,我们用 H1 到 H4 来表示这四家医院。

所采用的调查方法是数据包络分析法(Data Envelopment Analysis,DEA)。在此方

法中将比较一家虚拟医院与这四家医院的效率。

将考虑三种初始指标(资源):非医务人员数目,日常支出,可用病床总数。并

分析四种 终指标(服务):每天入院人数,每天门诊人数,每天值班护士人数,以

及每天值班的实习医生及医生人数。所分析的时间长度为两年,下面两个表格给出了

每个医院平均每天的数据。

表格 15.2:资源指标

H1 H2 H3 H4

非医务人员数 90 87 51 66

日常支出(千欧元) 38.89 109.48 40.43 48.41

病床数 34 33 20 33

表格 15.3:服务指标

H1 H2 H3 H4

入院人数 30.12 18.54 20.88 10.42

门诊人数 13.54 14.45 8.52 17.74

实习生和医生数 13 7 8 26

值班护士数 79 55 47 50

请使用 DEA 方法将医院 H2 的效率与其他医院进行比较。

15.6.1 模型的数学表达

15.6.1.1 DEA 方法概要

为使用 DEA 方法对医院的效率进行评估,我们需要创建一个数学模型,此数学

Page 365: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

354

模型将用于待评估的每家医院。这里以医院 H2 为例,其他医院的效率评估方法也都

与之相似。

通过使用数学规划方法,我们将根据这四家医院的数据创建一家虚拟的医院。此

虚拟医院的服务指标即为医院 H1 到 H4 的服务指标的加权平均值。类似地,它的资

源指标也就等于这四家医院的资源指标的加权平均值,使用的权重与前面相同。

虚拟医院的服务指标必须比医院 H2 高。否则虚拟医院只需要比医院 H2 更少的

资源就能提供至少同等水平的服务。也就是说医院 H2 的效率比虚拟医院差,因此也

比其他医院差。

15.6.1.2 问题建模

令 HOSP 为所研究的医院的集合, 'h 为我们希望评估其效率的医院。令 hcoef 为

医院 h 对应的 DEA 系数(决策变量)。则 DEA 法要求所有这些系数之和为 1(15.6.1)。

1=∑∈HOSPh

hcoef (15.6.1)

用常数 shINDSERV 表示医院 h 的服务指标 s (表 15.3)。索引 s 的取值范围是

服务指标类型集合 SERV 。类似地, rhINDRES 表示医院 h 的资源指标 r(表 15.2),

其中索引 r 的取值范围即为资源指标类型集合 RES 。为简化模型表达,我们引入变

量 sfserv 和 rfres ,分别表示每个服务指标和每个资源指标用系数 hcoef 进行加权后

的和,因此有约束条件(15.6.2)和(15.6.3)。

SERVs∈∀ : sHOSPh

hsh fservcoefINDSERV =⋅∑∈

(15.6.2)

RESr ∈∀ : rHOSPh

hrh frescoefINDRES =⋅∑∈

(15.6.3)

变量 sfserv (虚拟医院的服务指标)必须高于我们希望评估其表现的医院 'h 的

服务指标。式(15.6.4)即为 SERV 中的所有服务类型确立了此约束条件。

SERVs∈∀ : 'shs INDSERVfserv ≥ (15.6.4)

将不会直接在资源指标加权和 rfres (即虚拟医院的资源指标)和医院 'h 的资源

指标之间进行比较,而是与后者的比例为 eff 的一部分进行比较。约束条件(15.6.5)

建立了系数 hcoef 和此新的变量 eff 之间的关系。由于我们希望证明医院 'h 使用的资

源低于虚拟的医院,因此该不等关系应为小于或等于。例如,医院 'h 中的病床床位

Page 366: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

355

数为 33,则 eff⋅33 就对应于虚拟医院的床位数。如果 1=eff ,则虚拟医院的床位

数即与医院 'h 相同。如果 eff 大于或等于 1,则虚拟医院的床位数超过医院 'h ;反之

则医院 'h 的此项资源不如此虚拟医院。

RESr ∈∀ : effINDRESfres 'rhr ⋅≤ (15.6.5)

如果存在 1<eff 的解,则表明虚拟医院所使用的资源量低于医院 'h 。DEA 方法

的目标函数为(15.6.6),即 小化 eff 的值,即虚拟医院的资源需求量。我们还需要

为所有变量加入非负约束条件(15.6.7)到(15.6.10),这样就完成了此数学模型。

minimize eff (15.6.6)

HOSPh∈∀ : 0≥hcoef (15.6.7)

0≥eff (15.6.8)

SERVs∈∀ : 0≥sfserv (15.6.9)

RESr ∈∀ : 0≥rfres (15.6.10)

15.6.2 模型实现

下面是对上述数学模型的 Mosel 程序实现,在其中将为集合 HOSP 中的每家医

院都求解此问题。DEA 系数和的约束条件(15.6.1)和假想医院的服务及资源指标

的定义关系(约束条件(15.6.2)和(15.6.3))都将只表述一次。在每次执行循环

时,都将用当前所考察的医院的约束条件取代原有的约束条件(即约束条件(15.6.4)和(15.6.5))。为能够在 Mosel 程序中替换(或删除)一个约束条件,需要将此约束

条件进行命名,如下面程序中的 LimServ 和 LimRes。(可以选择是否对约束条件进

行声明,但出于效率原因,如果数组大小已知,如本例,则建议对约束条件进行声明。)

model "J-6 Hospital efficiency"

uses "mmxprs"

declarations

HOSP = 1..4 ! 医院集合

SERV: set of string ! 服务指标

RES: set of string ! 资源指标

INDSERV: array(SERV,HOSP) of real ! 服务指标值

INDRES: array(RES,HOSP) of real ! 资源指标值

Page 367: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

356

end-declarations

initializations from ‘j6hospit.dat’

INDSERV INDRES

end-initializations

finalize(SERV); finalize(RES)

declarations

eff: mpvar ! 效率值

coef: array(HOSP) of mpvar ! DEA 方法的系数

fserv: array(SERV) of mpvar ! 虚拟医院的服务指标

fres: array(RES) of mpvar ! 虚拟医院的资源指标

LimServ: array(SERV) of linctr ! 每个医院的服务指标约束条件

LimRes: array(RES) of linctr ! 每个医院的资源指标约束条件

end-declarations

! DEA 系数

sum(h in HOSP) coef(h) = 1

! 服务指标和资源指标之间的关系

forall(s in SERV) fserv(s) = sum(h in HOSP) INDSERV(s,h)*coef(h)

forall(r in RES) fres(r) = sum(h in HOSP) INDRES(r,h)*coef(h)

! 对每个医院求解此问题

forall(h in HOSP) do

! 当前所考察的医院的服务指标和资源指标的约束条件

forall(s in SERV) LimServ(s):= fserv(s) >= INDSERV(s,h)

forall(r in RES) LimRes(r):= fres(r) <= INDRES(r,h)*eff

! 小化效率指数 eff

minimize(eff)

writeln("Evaluation of hospital ", h, ": ", getobjval)

end-do

end-model

15.6.3 结果

程序可以求得医院 1,3,4 的效率值均为 1,因此这些医院与假想医院的效率相

同。对于医院 2,算法求得的值为 0.921。这表示虚拟医院只需使用医院 2 的约 92%的资源就能达到与其相同的服务水平。也就是说,医院 2 的效率比所研究的其他医

Page 368: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

357

院差。在每次模型运行时,系数 hcoef 都表示这四家医院在组成虚拟医院时所占的比

例。

15.7 参考文献和进阶阅读

使用第 15.1 节中的数学模型可以处理较大规模的 大流问题。但是也存在更有

效的图算法。第一个提出这种算法的是 Ford 和 Fulkerson[FF67]。此算法的复杂度

为 ( )2nmO ,其中n 为图中的结点数目,m 为弧的数目。Ahuja 和 Orlin 在[AMO94]

中给出了另一种更快速的方法,其复杂度为 ( )mnO 2。在后者中也给出了一种改进的

方法,复杂度为 ( )UmnO log⋅ ,其中U 表示弧容量的 大值。

15.2节中的问题是图论中用结点覆盖所有边的问题,称为结点覆盖(node cover)或顶点覆盖(vertex cover)。这个问题是 NP-hard 问题[CLR90]。Papadimitriou 和

STeiglitz 给出了此问题的一种启发式方法[PS98]。

在划分问题(partitioning problem)中,我们将研究具有m 个元素的集合 S ,

以及 S 的 n 个预先选定的子集组成的集合U 。划分问题即在U 中选择一些 S 的子集,

这些子集必须能够组成对 S 的完全划分,并 优化此选择的总费用。每个子集都可以

编码为一个二值矢量,这些矢量即组成一个二值矩阵 ( )nmA × 。划分的约束条件即

可以写成 sxA =⋅ , s 表示m 个元素均为 1 的矢量。覆盖问题与此很相似,但 S 中

的元素可以属于多个子集,因此约束条件可以写成 sxA ≥⋅ 。当需要将一些地理区域

划分为若干个服务区时,就经常出现此类问题。

除了第 15.3 节中的划分问题之外,本书中还给出了另外两个覆盖问题:第 9 章

中的金属板切割问题,以及第 12 章中移动电话基站选址问题。由于覆盖问题总是有

平凡解,即使用了所有可能的子集的解,因此此类问题较为简单。而在划分问题中,

可能会出现问题不可行(无解)的情况,如选区划分问题。在这两种问题中,单纯形

算法都能够找到一个大多数变量均为整数值的 优解,这样就可以减小对小数值的变

量进行树搜索的计算量。在 Beasley 的工作[Bea87]可以找到覆盖问题的实例;在

Fisher 的工作[FK90]可以找到覆盖问题和划分问题的实例。

Syslo 的著作[SDK83]中给出了这两种问题的启发式算法和精确树搜索算法,并

附有 Pascal 源码。 近在[CFT99]中给出了一种非常有效的启发式算法,这种启发

式算法利用了线性规划松弛作为引导,用于求解很大规模的覆盖问题。

第 15.4 节路面铺沙的问题属于中国邮递员问题,对于无向图也存在此问题。

Edmonds 和 Johnson 就有向和无向情况都给出了有效的多项式算法[EJ73]。在 Prins的著作[Pri94a]中给出了寻找欧拉回路和求解有向中国邮递员问题的 Pascal 代码。如

果只需要访问其中的一部分弧,则中国邮递员问题就变成了一个乡村邮递员问题

(Rural Postman problem)。

如果对弧上的铺沙量有要求,且卡车的容量有限,则可能需要多次通过同一段街

Page 369: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

358

道进行铺沙,这样我们就得到了一个容量限制弧路径问题(Capacitated Arc Routing Problem,CARP)。乡村邮递员问题和容量限制弧路径问题都是 NP-hard 问题。在

Evans 和 Minieka 的著作[EM92]中给出了一些数值实例和启发式算法。Hertz 等人给

出了乡村邮递员问题的局部搜索方法[HLNH99]以及求解容量限制弧路径问题的禁忌

搜索方法[HLM00]。

位置选择问题,如所得税征收点选址问题(第 15.5 节),可以组成一大类组合问

题,Daskin 的著作[Das95]即完全专注于此类问题。p-中心问题(p-center probem)

属于另一类经典的问题,其目标函数与 p-中位问题(p-median problem)不同,即

需要 小化办公点与城市之间的 大距离。本书中也有此类问题的另一些实例,例如

第 10 章中的仓库选址问题,和第 12 章中的移动电话基站选址问题。

第 15.6 节中介绍的 DEA 方法(数据包络分析法)广泛用于对若干个几乎相同的

环境设置的效率进行比较。此方法的第一个应用实例就是比较医院的效率。在

Sherman的著作[She84]和Lewin等人的著作[LM81]中可以找到此方法的另一些应用

实例。Cooper 等人 近编著的一本著作[CST99]中对 DEA 方法及其各种应用领域进

行了详尽的综述。

Page 370: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

359

参考文献

[AA95] E. D. Andersen and K. D. Andersen. Presolving in Linear Programming. Mathematical Programming, 71(2):221–245, 1995.

[AC91] D. Applegate and W. Cook. A Computational Study of the Job-Shop Scheduling Problem. ORSA Journal on Computing, 3(2):149–156, 1991.

[AD93] R. W. Ashford and R. C. Daniel. Mixed-Integer Programming in Production Scheduling: A Case Study. In T. Ciriani and R. C. Leachman, editors, Optimization in Industry, pages 231–239, New York, 1993. John Wiley & Sons.

[AMO93] R. K.. Ahuja, T. L. Magnanti, and J. B. Orlin. Network Flows. Theory, Algorithms and Applications. Prentice Hall, Englewood Cliffs, NJ, 1993.

[Arb93] A. Arbel. Exploring Interior-Point Linear Programming: Algorithms and Software. The MIT Press, 1993.

[ARVK89] I. Adler, M. Resende, G. Veiga, and N. Karmarkar. An Implementation of Karmarkar’s Algorithm for Linear Programming. Mathematical Programming, 44:297–335, 1989.

[Baa88] S. Baase. Computer Algorithms. Addison-Wesley, 1988.

[BC96] J. E. Beasley and B. Cao. A Tree Search Algorithm for the Crew cheduling Problem. European Journal of Operational Research, 94:517–526, 1996.

[BDB95] H. Beringer and B. De Backer. Combinatorial Problem Solving in Constraint Logic Programming with CooperatingSolvers. In C. Beierle and L. Plümer, editors, Logic Programming: Formal Methods and Practical Applications, pages 245–272, Amsterdam, 1995. Elsevier Science B. V./North-Holland.

[BDGP95] P. Boizumault, Y Delon, C. Guéret, and L. Péridy. Résolution de problèmes en Programmation Logique avec Contraintes. Revue d’Intelligence Artificielle, 9(3):383–406, 1995.

[Bea59] E. M. L. Beale. On Quadratic Programming. Naval. Res. logist. Q., 6:227–243, 1959.

[Bea87] J. E. Beasley. An Algorithm for Set Covering Problems. European Journal of Operational Research, 31:85–93, 1987.

[BESW93] J. Błazewicz, K. Ecker, G. Schmidt, and J. W¸ eglarz. Scheduling in Computer and Manufacturing Systems. Springer, Berlin , Heidelberg, 1993.

[BF76] E. M. L. Beale and J. J. H. Forrest. Global Optimization Using Special Ordered Sets. Mathematical Programming, 10(1):52–69, 1976.

[BHJS95] C. Barnhart, C. A. Hane, E. L. Johnson, and G. Sigismondi. A Column Generation and Partitioning Approach for Multi-commodity Flow Problems. Telecommunication Systems, 3:239–258, 1995.

[BJ90] M. S. Bazaraa and J. J. Jarvis. Linear Programming and Network Flows. Wiley,

Page 371: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

360

1990. [BJN+98]

C. Barnhart, E. L. Johnson, G. L. Nemhauser, M.W. P. Savelsbergh, and P. H. Vance. Branch-and-Price: Column Generation for Solving Huge Integer Programs. Operations Research, 46(3):316–329, 1998

[BK98] A. Bockmayr and T. Kasper. Branch and Infer: A Unifying Framework for Integer and Finite Domain Constraint Programming. INFORMS Journal on Computing, 10(3):287–300, 1998.

[BKSA00] J. E. Beasley, M. Krishnamoorthy, Y. M. Sharaiha, and D. Acramson. Scheduling Aircraft Landings – the Static Case. Transportation Science, 34:180–197, 2000.

[BL83] E. Balas and P. R. Landweer. Traffic Assignment in Communication Satellites. Operation Research Letters, 2(4):141–147, 1983.

[BMR94] L. Bianco, A. Mingozzi, and S. Ricciardelli. A Set Partitioning Approach to the Multiple Depot Vehicle Scheduling Problem. Optimization Methods and Software, 3:163–194, 1994.

[BN96] J. P. Boufflet and S. Nègre. Three Methods Used to Solve an Examination Timetabling Problem. In E.K. Burke and P. Ross, editors, Practice and Theory of Automated Timetabling, pages 327–344. Springer-Verlag Lecture Notes in Computer Science, 1996.

[Bow56] E. H. Bowman. Production Scheduling by the Transportation Method of Linear Programming. Operations Research, 4(1):100–103, 1956.

[BS87] E. S. Buffa and R. K. Sarin. Modern Production/Operations Management. Wiley, 1987.

[BT70] E. M. L. Beale and J. A. Tomlin. Special Facilities in a General Mathematical Programming System for Nonconvex Problems Using Ordered Sets of Variables. In J. Lawrence, editor, Operational Research 69, pages 447–454. Tavistock Publishing, London, 1970.

[BT79] E. S. Buffa and W. Taubert. Production-Inventory Systems: Planning and control (3rd Ed.). Homewood III, R.D. Irwin, 1979.

[CA99] C. Chu and J. Antonio. Approximation Algorithms to Solve Real-Life Multicriteria Cutting Stock Problems. Operations Research, 47(4):495–508, 1999.

[Cam96] J. F. Campbell. Hub Location and the p-hub Median Problem. Operations Research, 44(6):923–935, 1996.

[Can77] D. Candea. Issues of Hierarchical Planning in Multistage Production Systems. Technical Report 134, Operations Research Center, MIT, Cambridge, Mass., USA, 1977.

[CC88] J. Carlier and P. Chrétienne. Problèmes d’ordonnancement : modélisation / complexité / algorithmes. Masson, 1988.

[CCE+93] J. Carlier, Chrétienne, J. Erschler, C. Hanen, P. Lopez, A. Munier, E. Pinson, M.-C. Portmann, C. Prins, C. Proust, and P. Villon. Les problèmes d’ordonnancement. RAIRO-Recherche Opérationnelle, 27(1):77–150, 1993.

[CD99] G. Cornuejols and M. Dawande. A Class of Hard Small 0-1 Programs. INFORMS

Page 372: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

361

Journal on Computing, 11(2):205–210, 1999. [CFT99] A. Caprara, M. Fischetti, and P. Toth. A Heuristic Method for the Set Covering

Problem. Operations Research, 47(5):730–743, 1999. [CGJ96] E. G. Coffman, M. R. Garey, and D. S. Johnson. Approximation Algorithms for

Bin-packing: a Survey. In D. Hochbaum, editor, Approximation Algorithms for NP-Hard Problems, pages 46–93. PWS Publishing, Boston, 1996.

[CH77] J. A. Clark and N. A. J. Hastings. Decision Networks. Operations Research Quaterly, 20:51–68, 1977.

[CH02] Y. Colombani and S. Heipcke. Mosel: An Extensible Environment for Modeling and Programming Solutions. In N. Jussien and F. Laburthe, editors, Proceedings of CP-AI-OR’02, pages 277–290, Le Croisic, March 2002.

[Chv83] V. Chvàtal. Linear Programming. W.H. Freeman, 1983.

[CHW98] P. Chan, K. Heus, and G.Weil. Nurse Scheduling with Global Constraints in CHIP: GYMNASTE. In Proceedings of the Fourth International Conference on the Practical Application of Constraint Technology, PACT98, pages 157–169, London, UK, March 1998. The Practical Application Company.

[CL96] M. W. Carter and G. Laporte. Recent Development in Practical Examination Timetabling. In E.K. Burke and P. Ross, editors, Practice and Theory of Automated Timetabling, pages 3–21. Springer-Verlag Lecture Notes in Computer Science, 1996.

[CLR90] T. H. Cormen, C. L. Leiserson, and R. L. Rivest. Introduction to Algorithms. MIT Press and McGraw-Hill, New York, 1990.

[CMT79a] N. Christofides, A. Mingozzi, and P. Toth. Loading Problems. In N. Christofides and al., editors, Combinatorial Optimization, pages 339–369. Wiley, 1979.

[CMT79b] N. Christofides, A. Mingozzi, and P. Toth. The Vehicle Routing Problem. In N. Christofides and al., editors, Combinatorial Optimization, pages 315–338. Wiley, 1979.

[CST99] W. W. Cooper, L. M. Seiford, and K. Tone. Data Envelopment Analysis. Kluwer, 1999.

[CW64] G. Clarke and J. W. Wright. Xheduling of Vehicles from a Central Depot to a Number of Delivery Points. Operations Research, 12(4):568–581, 1964.

[Dan63] G. B. Dantzig. Linear Programming and Extensions. Princeton University Press, Princeton, NJ, 1963.

[Das95] M. S. Daskin. Network and Discrete Location. Wiley, 1995.

[DDS92] M. Desrochers, J. Desrosiers, and M. Solomon. A New Optimization Algorithm for the Vehicle Routing Problem with Time Windows. Operations Research, 40(2):342–354, 1992.

[DE73] E. M. Dar-El. MALB, a Heuristic Technique for Balancing Large Scale Single-Model Assembly Lines. AIIE Transactions, 5(4):–, 1973.

[DK99] A. Dutta and P. Kubat. Design of Partially Survivable Networks for Cellular Telecommunications Systems. European Journal of Operational Research, 118(1):52–64, 1999.

[DPL94] S. Dauzère-Pérès and J. B. Lasserre. An Integrated Approach in Production Planning

Page 373: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

362

and Schedulin. In Lecture Notes in Economics and Mathematical Systems 411. Springer-Verlag, 1994.

[DW97] D. DeWerra. The Combinatorics of Timetabling. European Journal of Operational Research, 96(3):504–513, 1997.

[DZ78] U. Derigs and U. Zimmerman. An Augmenting Path Method for Solving Linear Bottleneck Assignment Problems. Computing, 19:285–295, 1978.

[EJ73] J. Edmonds and E. L. Johnson. Matching, Euler Tours, and the Chinese Postman. Mathematical Programming, 5:88–124, 1973.

[EM92] J . E. Evans and E. Minieka. Optimization Algorithms for Networks and Graphs. Marcel Dekker Inc., 1992.

[Erl78] D. Erlenkotter. A Dual-Based Procedure for Uncapacited Facility Location. Operations Research, 26:992–1009, 1978.

[Eva64] H. F. Evart. Introduction to PERT. Allyn & Bacon, 1964.

[FF67] L. Ford and D. Fulkerson. Flots dans les graphes. Gauthier-Villars, Paris, 1967.

[FJVW86] M. L. Fisher, R. Jaikumar, and L. N. Van Wassenhove. A Multiplier Adjustment Method for the Generalized Assignment Problem. Management Science, 39(2):1095–1103, 1986.

[FK90] M. L. Fisher and P. Kedia. Optimal Solutions of Set Covering/Partitioning Problems Using Dual Heuristics. Management Science, 36:674–688, 1990.

[Fle87] R. Fletcher. Practical Methods of Optimization (2nd ed.). John Wiley, Chichester UK, 1987.

[Fre82] S. French. Sequencing and Scheduling. An Introduction to the Mathematics of the Job-Shop. John Wiley and Sons, New York, 1982.

[Gar63] L. L. Garver. Power Scheduling by Integer Programming. IEEE Transactions on Power Apparatus and Systems, 81:730–735, 1963.

[Gar00] D. T. Gardner. Efficient Formulation of Electric Utility Resource Planning Models. Journal of the Operational Society, 51(2):231–236, 2000.

[GG61] P. C. Gilmore and R. E. Gomory. A Linear Programming Approach to the Cutting Stock Problem. Part I. Operations Research, 9:849–859, 1961.

[GG63] P. C. Gilmore and R. E. Gomory. A Linear Programming Approach to the Cutting Stock Problem. Part II. Operations Research, 11:863–888, 1963.

[GH91] M. Grötschel and O. Holland. Solution of Large-Scale Symmetric Traveling Salesman Problems. Mathematical Programming, 51:141–202, 1991.

[GHL94] M. Gendreau, A. Hertz, and G. Laporte. A Tabu Search Algorithm for the Vehicle Routing Problem. Management Science, 40:1276–1290, 1994.

[Gib85] A. Gibbons. Algorithmic Graph Theory. Cambridge University Press, Cambridge, New York, 1985.

[GJ79] M. R. Garey and D. S. Johnson. Computers and Intractability: A Guide to the Theory of NP-completeness. W.H. Freeman & Company, San Francisco, 1979.

[Gle80] J. J. Glen. A Parametric Programming Method for Beef Cattle Ration Formulation. Journal of the Operational Research Society, 31:689–690, 1980.

[GM90] M. Gondran and M. Minous. Graphes et algorithmes (2nd Ed.). Eyrolles, 1990.

Page 374: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

363

[GP98] C. Guéret and C. Prins. Classical and New Heuristics for the Open-Shop Scheduling Problem: a Computational Evaluation. European Journal of Operational Research, 107(2):306–314, 1998.

[GP01] Gunluk and Y. Pochet. Mixing mixed-integer inequalities. Mathematical Programming, 90:429–457, 2001.

[Gra69] R. L. Graham. Bounds on Multiprocessing Timing Anomalies. Siam Journal on Applied Mathematics, 17:416–429, 1969.

[GS76] T. Gonzalez and S. Sahni. Open-Shop Scheduling to Minimize Finish Time. Journal of the ACM, 23:665–679, 1976.

[GS87] A. Gersht and A. Shulman. A New Algorithm for the Solution of the Minimum Cost Multicommodity Flow Problem. In IEEE 26th Conference on Decision and Control (CDC’87), pages 748–758, Los Angeles, December 1987.

[GTdW93] F. Glover, E. Taillard, and D. de Werra. A User’s Guide to Tabu Search. Annals of Operations Research, 41(1–4):3–28, 1993.

[HC84] A. C. Hax and D. Candea. Production and Inventory Management. Prentice Hall, 1984.

[HC99] S. Heipcke and Y. Colombani. Julian’s Problem. Work Assignment at a Disabled Care Centre. ORInsight, 12(1):16–20, 1999.

[Hei99a] S. Heipcke. Combined Modelling and Problem Solving in Constraint Programming and Mathematical Programming. PhD thesis, University of Buckingham, 1999.

[Hei99b] S. Heipcke. Comparing Constraint Programming and Mathematical Programming Approaches to Discrete Optimisation. The Change Problem. Journal of the Operational Research Society, 50(6):581–595, 1999.

[HH60] F. Hanssmann and S. W. Hess. A Linear Programming Approach to Production and Employment Scheduling. Management Technology, 1:–, 1960.

[Hit41] F. L. Hitchcock. The Distribution of a Product from Several Sources to Numerous Localities. J. Math. Phys., 20(2):224–230, 1941.

[HK70] M. Held and R. Karp. The Traveling Salesman Problem and Minimum Spanning Trees. Operations Research, 18:1138–1162, 1970.

[HLM00] A. Hertz, G. Laporte, and M. Mittaz. A Tabu Search Heuristic for the Capacited Arc Routing Problem. Operations Research, 48(1):129–135, 2000.

[HLNH99] A. Hertz, G. Laporte, and P. Nanchen Hugo. Improvement Procedures for the Undirected Rural Postman Problem. INFORMS Journal on Computing, 11(1):53–62, 1999.

[HW95] J. L. Ho and J. S.Wong. Makespan Minimization for m Parallel Identical Processors. Naval Research Logistics, 42(6):935–948, 1995.

[HZ96] M. Hifi and V. Zissimopoulos. A Recursive Exact Algorithm for Weighted Two-Dimensional Cutting. European Journal of Operational Research, 91:553–564, 1996.

[Jak96] S. Jakobs. On Genetic Algorithms for the Packing of Polygons. European Journal of Operational Research, 88:165–181, 1996.

[JM74] L. A. Johnson and D. C. Montgomery. Operations Research in Production

Page 375: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

364

Planning, Scheduling, and Inventory Control. Wiley, New York, 1974. [JNS00] E. L. Johnson, G. L. Nemhauser, and M.W. P. Savelsbergh. Progress in Linear

Programming Based Algorithms for Integer Programming: An Exposition. INFORMS Journal on Computing, 12(1):2–23, 2000.

[JSV98] B. Jaumard, F. Semet, and T. Vovor. A Generalized Linear Programming Model for Nurse Scheduling. European Journal of Operational Research, 107(1):1–18, 1998.

[Kao79] E. P. C. Kao. A Multi-Product Dynamic Lot-Size Problem with Individual and Joint Set-up Costs. Operations Research, 27(2):279–289, 1979.

[Kar84] N. Karmarkar. A New Polynomial Time Algorithm for Linear Programming. Combinatorica, 4:373–395, 1984.

[Kas98] R. G. Kasilingam. Logistics and Transportation. Kluwer Academic Publishers, 1998.

[KGV83] S. Kirkpatrick, C. D. Gelatt, and M. P. Vecchi. Optimization by Simulated Annealing. Science, 220:671–680, 1983.

[Kua62] M. K. Kuan. Graphic Programming Using Odd and Even Points. Chinese Mathematics, 1:273–277, 1962.

[LD60] A. H. Land and A. G. Doig. An Automatic Method for Solving Discrete Programming Problems. Econometrica, 28:497–520, 1960.

[LDN84] G. Laporte, M. Desrochers, and Y. Nobert. Two Exact Algorithms for the Distance-Constrained Vehicle Routing Problem. Networks, 14:161–172, 1984.

[LM81] A. Y. Lewin and R. C. Morey. Measuring the Relative Efficiency and Output Potential of Public Sector Organizations: an Application of Data Envelopment Analysis. International Journal of Policy Analysis and Information Systems, 5(4):267–285, 1981.

[LMV99] A. Lodi, S. Martello, and D. Vigo. Heuristics and Metaheuristics for a class of two-Dimensional Bin Packing Problems. INFORMS Journal on Computing, 11(4):345–357, 1999.

[LQ92] J. B. Lasserre and M. Queyranne. Generic Scheduling Polyedra and a new Mixed-Integer Formulation for a Single Machine Scheduling. In Second IPCO Conference, Pittsburg, 1992. Carnegie-Mellon University.

[LR99] P. Lopez and F. Roubellat. Ordonnancement. Economica, 1999.

[LS98] J. T. Linderoth and M. W. P. Savelsbergh. A Computational Study of Search Strategies for Mixed Integer Programming. INFORMS Journal on Computing (to appear), 1998.

[LT71] L. S. Lasdon and R. C. Terjung. An Efficient Algorithm for Multi-Item Scheduling. Operations Research, 19(4):946–969, 1971.

[Lue84] D. G. Luenberger. Linear and Non-Linear Programming. Addison-Wesley, 1984.

[Man86] A. S. Manne. GAMS/MINOS: Three Examples. Technical report, Department of Operations Research, Stanford University, 1986.

[MB86] M. Minoux and G. Bartnik. Graphes, algorithmes, logiciels. Dunod, 1986.

[McC69] W. H. S. McColl. Management and Operations in an Oil Company. Operations Research Quaterly, 20:64–65, 1969.

Page 376: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

365

[Min75] M. Minoux. Résolution des problèmes de multiflots en nombres entiers dans les grands réseaux. RAIRO - Recherche Opérationnelle, 3:–, 1975.

[MS98] K. Marriott and P. J. Stuckey. Programming with Constraints. MIT Press, Cambridge MA, 1998.

[MT79] S. Martello and P. Toth. The 0-1 Knapsack Problem. In N. Christofides and al., editors, Combinatorial Optimization. Wiley, 1979.

[MT90] S. Martello and P. Toth. Knapsack Problems: Algorithms and Computer Implementations. John Wiley, New York, 1990.

[MW01] H. Marchand and L. Wolsey. Aggregation and mixed-integer rounding to solve MIPs. Operations Research, 49:363–371, 2001.

[NEH83] M. Nawaz, E.E. Enscore, and I. Ham. A Heuristic Algorithm for the m-Machine, n-Job Flow-Shop Sequencing Problem. Omega, 11(1):91–95, 1983.

[Orl75] J. A. Orlicky. Material Requirement Planning: the New Way of Life in Production and Inventory Management. McGraw-Hill, New York, 1975.

[PFTVed] W. H. Press, B. P. Flannery, S. A. Teukolsky, andW. T. Vetterling. Numerical Recipes in C – The Art of Scientific Computing. Cambridge University Press, Cambridge, 1992 (2nd ed.).

[Pin95a] M. Pinedo. Scheduling: Theory, Algorithms and Systems. Prentice Hall, 1995.

[Pin95b] E. Pinson. The Job Shop Scheduling Problem: A Concise Survey and Some Recent Developments. In Ph. Chrétienne, E. G. Coffman, J. K. Lenstra, and Z. Liu, editors, Scheduling Theory and its Applications, pages 277–294, Chichester, New York, 1995. John Wiley.

[Pri94a] C. Prins. Algorithmes de graphes avec programmes en Pascal. Eyrolles, 1994.

[Pri94b] C. Prins. An Overview of Scheduling Problems Arising in Satellite Communications. J. Opl. Res. Soc., 45(6):611–623, 1994.

[PS98] C. H. Papadimitriou and K. Steiglitz. Combinatorial Optimization. Dover, 1998.

[Roo97] K. Roos. Theory and Algorithms for Linear Optimization. An Interior Point Approach. John Wiley, Chichester, New York, 1997.

[Ros85] Roseaux. Exercices et problèmes résolus de Recherche Opérationnelle – Tome 3. Masson, 1985.

[RWH99] R. Rodošek, M. G. Wallace, and M. T. Hajian. A New Approach to Integrating Mixed Integer Programming and CLP. Annals of Operations Research, 86:63–87, 1999.

[Sav94] M. W. P. Savelsbergh. Preprocessing and Probing Techniques for Mixed Integer Programming Problems. ORSA Journal on Computing, 6(4):445–454, 1994.

[SC81] D. W. Sutton and P. A. Coates. On-Line Mixture Calculation System for Stainless Steel Production by BSC Stainless: the Least Through Cost Mix System (LTCM). Journal of the Operational Research Society, 32:165– 169, 1981.

[Sch86] A. Schrijver. Theory of Linear and Integer Programming. Wiley, 1986.

[Sch97] L. Schrage. Optimization Modeling with LINDO (5th ed.). Duxbury, 1997.

[Sch99] A. Scholl. Balancing and Sequencing of Assembly Lines. Physica-Verlag, 1999.

Page 377: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

366

[SDK83] M. M. Syslo, N. Deo, and J. S. Kowalik. Discrete Optimization Algorithms with Pascal Programs. Prentice Hall, 1983.

[Sev98] M. Sevaux. Étude de deux problèmes d’optimisation en planification et ordonnancement. PhD thesis, Thèse de l’université Pierre-et-Marie-Curie, Paris VI, 1998.

[She84] H. D. Sherman. Hospital Efficiency Measurement and Evaluation. Medical Care, 22(10):922–938, 1984.

[SM74] A. M. Sasson and H. M. Merrill. Some Applications of Optimization Techniques to Power Systems Problems. In IEEE,62, pages 959–972, 1974.

[SN96] A. Sofer and S. G. Nash. Linear and Non-Linear Programming. McGraw-Hill, 1996.

[SPP98] E. Silver, D. F. Pyke, and R. Peterson. Inventory Management and Production Planning and Scheduling. Wiley, 1998.

[SRP92] P. E. Sweeney and E. Ridenour Paternoster. Cutting and Packing Problems: a Categorized, Application-Oriented Research Bibliography. Journal of the Operational Research Society, 43(7):691–706, 1992.

[SS98] B. Sansò and P. Soriano. Telecommunication Network Planning. Kluwer, 1998.

[SSR00] C. H. Scott, O. G. Skelton, and E. Rolland. Tactical and Strategic Models for Satellite Customer Assignment. Journal of the Operational Research Society, 51(1):61–71, 2000.

[Tri84] A. Tripathy. School Timetabling: a Case in Large Binary Integer Linear Programming. Management Science, 30(12):1473–1489, 1984.

[VH98] P. Van Hentenryck. The OPL Optimization Programming Language. MIT Press, Cambridge, MA, 1998.

[VW02] S. Voß and D. L. Woodruff. Introduction to Computational Optimization Methods for Production Planning in a Supply Chain. Springer, Berlin, 2002.

[WA88] E. A. Wasil and A. A. Assad. Project Management on the PC: Software, Applications and Trends. Interfaces, 18(2):75–84, 1988.

[Wag59] H. M.Wagner. An Integer Programming Model for Machine Scheduling. Naval Research LogisticsWuaterly, 6:131–140, 1959.

[Wal76] W. E. Walker. A Heuristic Adjacent Extreme Point Algorithm for the Fixed Charge Problem. Management Science, 22(5):587–596, 1976.

[WH89] M. Widmer and A. Hertz. A New Heuristic Method for the Flow Shop Sequencing Problem. European Journal of Operational Research, 41:186–193, 1989.

[Wil93] H. P. Williams. Model Building in Mathematical Programming. (3rd Rev. Ed.). John Wiley, Chichester, 1993.

[Win94] W. L. Winston. Operations Research: Applications and Algorithms (3rd ed.). Duxbury Press, Belmont, 1994.

[Win98] W. L. Winston. Financial Models Using Simulation and Optimization. Palisade, 1998.

[Wol98] L. A. Wolsey. Integer Programming. Wiley Interscience, 1998.

[WW58] H. M. Wagner and T. M. Whitin. A Dynamic Version of the Economic Lot Size Model. Management Science, 50(1):89–96, 1958.

Page 378: Xpress-MP 优化实例精选read.pudn.com/downloads80/doc/fileformat/312108... · Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom ©2000,Editions

367

[Zen96] Z. A. Zenios. Financial Optimization. Cambridge University Press, 1996.


Recommended