Xpres s-Mosel 入门 林森科技

68
Xpress-Mosel 入入 入入入入 2007.6

description

Xpres s-Mosel 入门 林森科技. 2007.6. 概述. 安装 建模 输入和求解线性规划问题 数据处理 绘制用户曲线 混合整数规划 二次规划 启发式算法. 第 1 章 安装 Xpress-MP. 完整版 双击 xp2006a_win32_setup 安装文件 将 xpauth.ini 文件复制到 bin 文件夹下 学生版 双击 student 安装文件 安装密码 studentonly. 第 2 章 建模. 优化流程 Xpress-MP 系列软件介绍 建模示例. 优化工程流程. Xpress-MP 系列软件. 建模示例. - PowerPoint PPT Presentation

Transcript of Xpres s-Mosel 入门 林森科技

Page 1: Xpres s-Mosel 入门 林森科技

Xpress-Mosel入门 林森科技

2007.6

Page 2: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

概述 安装 建模 输入和求解线性规划问题 数据处理 绘制用户曲线 混合整数规划 二次规划 启发式算法

Page 3: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

第 1 章 安装 Xpress-MP 完整版

双击 xp2006a_win32_setup 安装文件 将 xpauth.ini 文件复制到 bin 文件夹下

学生版 双击 student 安装文件 安装密码 studentonly

Page 4: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

第 2 章 建模 优化流程 Xpress-MP 系列软件介绍 建模示例

Page 5: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

优化工程流程

问 题 描 述 建 模

分 析

求 解

开 发

Page 6: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Xpress-MP 系列软件 图 形 用 户 界 面

建 模 语 言

IVE

M o se l建 模 语 言

优 化 器( LP /M IP /Q P ) SLP 外 部 数 据 源 外 部

求 解 器外 部

应 用 工 程

求 解 器 /数 据 /应 用 工 程

M ose l模 块

B CL库库 mm xpr s mm xs l p mm odbc用 户 模 块

...M o se l库

Page 7: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

建模示例 一个投资者希望用一定数量的资金进行投资。他对十种不同的股票进行投资,并估计在一年内投资的收益。下表给出了每种股票的国别,风险类别( R :高风险, N :低风险)和期望投资是收益率( ROI )。投资者确定了某些约束条件。为了分摊风险,他希望对每种股票的投资最多占总资金的30 %。进一步,他希望资金的一半能够投资在北美的股票和最多三分之一是高风险投资。这些资金应该怎样在各种股票中进行分配才能达到最大化的收益的目的呢?

Page 8: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

股票的国别和估计投资收益列表 编号 描述 国别 风险类型 期望收益率

1 国库券 加拿大 N 5

2 硬件 美国 R 17

3 剧院 美国 R 26

4 电信 美国 R 12

5 酿酒 英国 N 8

6 高速公路 法国 N 9

7 汽车 德国 N 7

8 银行 卢森堡 N 6

9 软件 印度 R 31

10 电子 日本 R 21

Page 9: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

定义变量 定义决策变量 frac 定义辅助变量 SHARES 作为投资者希望投资的股票的集合 RET 作为股票 s 的期望 ROI 。 NA 表示北美国家股票集合 RISK 表示高风险股票集合。

Page 10: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

设定约束条件 所有变量的边界

不同股票的分数之和必须为 100 %: 0 0.3ss SHARES frac

1ss SHARES

frac

Page 11: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

投资者对北美的股票的投资最少 50 % 投资到这个类型股票的资金之和不能超过整个资金的 0.33

设定目标函数 投资者的目标是最大化所有股票投资的收益

1/ 3ss RISK

frac

0.5ss NA

frac

s ss SHARES

RET frac

Page 12: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

第 3 章 输入和求解线性规划问题 启动 Xpress-IVE 图形用户界面 线性规划模型 修正错误和调试模型 求解,优化显示和查看解

Page 13: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

启动 Xpress-IVE 图形用户界面 双击桌面上的图标 开始 -> 所有程序 -> Xpress-MP->

Xpress-IVE 命令启动程序 window的 Dos 环境下输入 ive 命令 双击模型文件(扩展名为 .mos )

Page 14: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

编辑窗口工程工具栏

运行栏

信息栏

执行模型

编译模型模型转换

执行选项

Page 15: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

行号显示

Page 16: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

线性规划 - 一般结构 定义模型: model, end-model 引用求解: uses, maximize,minimize 声明部分 :declarations ,end-declarations 输出: writeln 格式 分行:可以用分号将多个语句分开写到一行内 注释: Mosel 中单独一行的注释以!开始。多行的注释以(!开始并且以!)结束

Page 17: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

修改错误和调试模型 定义模型: model, end-model 引用求解: uses, maximize,minimize 声明部分 :declarations ,end-declarations 输出: writeln 格式 分行:可以用分号将多个语句分开写到一行内 注释: Mosel 中单独一行的注释以!开始。多行的注释以(!开始并且以!)结束

Page 18: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Page 19: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

错误分析 error 100: Syntax error 指向下面一行 RET:= [5,17,26,12,8,9,7,6,31,21 我们需要添加中括号以结束的定义(如果定义一直延续到下一行,我们需要添加在行的末端添加一个逗号表示当前行并没有结束)。

Page 20: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

warning 121: Statement with no effect Return = sum(s in SHARES) RET(s)*frac(s) 警告在模型执行时并不隐藏,但是当Mosel编译器提示这行没有意义时,则这一行一定存在错误。查找这个错误需要仔细检查:我们使用了=而不是 := 。这样 Return 应该被定义为右边所有项之和并对它进行赋值,这句现在并没有意义

Page 21: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

error 123: ‘maximize’ is not defined 跳转到这一行 maximize(Return) 这是由于在模型中定义了 maximize处理过程,但是我们忘记了在 Mosel 模型开始部分添加以下这行。 uses "mmxprs"

Page 22: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

调试 选择 Build->Options 命令或者点击运行选项按钮 将会显示表 Matrix visualization ,选择

Show original matrix ,然后点击确认 Apply 。 执行一个模型时,它可以在 IVE 图形用户界面右边的运行工具栏产生可视化的矩阵显示 显示的另一个变化是在工作区窗口的左边:显示模型定义中的所有项目。可以通过点击“+”号对所有信息进行查看

Page 23: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Page 24: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Page 25: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

断点调试 选择Debug->Start/Continue 命令或者点击按钮启动 或者停止调试 。 Debug菜单的项目和调试按钮允许用户完成标准的调试任务,例如设置断点(按钮 ),运行模型到指针位置(按钮 ),或者单步执行(按钮 和 )。

Page 26: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

求解,优化显示和查看解 运行后可以在表 Output/input 看到程序的输出 表 Stats 获得详细的 LP 优化信息

Page 27: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Page 28: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Page 29: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

字符串索引 利用字符串索引代替数值索引

SHARES = 1..10RISK = {2,3,4,9,10}NA = {1,2,3,4}

替换为:SHARES = {"treasury", "hardware", "theater",

"telecom", "brewery","highways", "cars", "bank", "software",

"electronics"}RISK = {"hardware", "theater", "telecom",

"software", "electronics"}NA = {"treasury", "hardware", "theater",

"telecom"}

Page 30: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

在初始化矩阵 RET时,我们需要使用以下索引:RET("treasury"):=5; RET("hardware"):=17; RET("theater"):=26RET("telecom"):=12; RET("brewery"):=8;RET("highways"):=9; RET("cars"):=7RET("bank"):=6; RET("software"):=31; RET("electronics"):=21

Page 31: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

第 4 章 数据处理 从文件输入数据

从外部文件读取 从 Excel 电子表格读取 与数据库进行数据交换

格式化输出

Page 32: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

从外部文件读取 使用的数据文件为 folio.dat

! 用于‘ folio*.mos’ 的数据文件RET: [("treasury") 5 ("hardware") 17 ("theater") 26

("telecom") 12("brewery") 8 ("highways") 9 ("cars") 7 ("bank") 6("software") 31 ("electronics") 21 ]RISK: ["hardware" "theater" "telecom" "software"

"electronics"]NA: ["treasury" "hardware" "theater" "telecom"] 格式化输出

Page 33: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Mosel 模型修改 initializations from "folio.dat"

RISK RET NAend-initializations

Page 34: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

格式化数据文件输出 调用函数 fopen和 fclosefopen("result.dat", F_OUTPUT)

writeln("Total return: ", getobjval)forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")

fclose(F_OUTPUT)

Page 35: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

设置参数 目的: 以参数的形式定义例如文件名和数值约束条件,从而在执行模型时可以修改这些参数的值,而不用改变模型本身 参数的定义必须添加到模型的开始部分,直接在 uses 语句后使用

Page 36: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

parametersDATAFILE= "folio.dat" ! File with problem dataOUTFILE= "result.dat" ! Output fileMAXRISK = 1/3 ! Max. investment into high-risk valuesMAXVAL = 0.3 ! Max. investment per shareMINAM = 0.5 ! Min. investment into N.-American values

end-parameters

Page 37: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

第 5 章 绘制用户曲线 目的 对高风险股票部分进行不同的限制,然后执行 LP 模型并且将结果以曲线表示,绘制每种结果的收益-偏差曲线图作为风险评估

Page 38: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

实现1. 定义模型在参数变化时保持不变的部分。2. 对每个参数值:• 重新定义限制高风险股票投资比例的约束。• 求解问题结果。• 如果问题可行,保存问题解。3. 绘制结果曲线。

Page 39: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

为了存储问题解和在每次优化后估计所有结果的偏差,我们定义以下两个矩阵:declarations

SOLRET: array(range) of real ! 解的值(总共收益)SOLDEV: array(range) of real ! 解的值(平均偏差)

end-declarations

Page 40: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

定义约束条件名称,循环执行

Page 41: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

绘制曲线 加载绘图模块 uses "mmive“ 实现

Page 42: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Page 43: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

第 6 章 混合整数规划 定义不同类型的离散变量; 在 IVE 图形用户界面中理解和使用混合整数规划的显示。

Page 44: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

扩展问题描述 投资者不希望持有少量的股票。因此他提出了以下两个可能的约束条件: 1. 限制投资组合中不同股票的支数。 2. 如果买进一种股票,它所占的资金至少占预算的 10%即。

Page 45: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

MIP 模型 1 :购买股票数有限 引入二值变量 buy 引入股票数小于MAXNUM 约束条件 把新的二值变量 buy与原变量 frac相关联

ss SHARES

buy MAXNUM

: s ss SHARES frac buy

Page 46: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

循环定义变量和约束 forall(s in SHARES) buy(s) is_binary forall(s in SHARES) frac(s) <= buy(s)

Page 47: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

结果分析 Build ->Options 命令 表 Pause 下面的表 view matrix )使矩阵可视化

Page 48: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

详细结果

Page 49: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

MIP 模型 2 :增加最小投资量限制 新的约束条件 如果买进一支股票,则投资该股票的金额占整个资金的比例至少大于一个最小值

: 0ss SHARES frac

sMINVAL frac MAXVAL

Page 50: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

引入新的变量类型:半连续变量 半连续变量:决策变量是一个取值为 0 或者在指定的上界和下界之间的值。半连续变量适用于变量被使用时则具有一个最小值的情况。 forall(s in SHARES) do

frac(s) <= MAXVAL frac(s) is_semcont MINVAL

end-do

Page 51: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

第 7 章 二次规划 定义二次规划目标函数; 逐步定义和求解问题; 在 IVE 图形用户界面中理解和使用 MIP 优

化的显示。

Page 52: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

问题描述 投资者可能从不同的角度考虑投资组合选择问题:现在他希望限制投资风险并获得一定的目标收益,而不是最大化估计收益和限制高风险投资的比例。他采用 Markowitz方法来得到股票投资的估计收益的方差 /协方差矩阵的估计值。(例如,硬件和软件公司价值趋势趋于一致,但是与戏剧产业的成功相反,因为当人们厌烦新的计算机和计算机游戏时人们会更多的选择去剧院。)戏剧产业的收益是容易发生变化的,但是国债收益是一定的。估计收益和方差 /协方差矩阵在下表给出:

Page 53: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

方差 /协方差矩阵 国库券 硬件 剧院 电信 酿酒 高速公路 汽车 银行 软件 电子

国库券 0.1 0 0 0 0 0 0 0 0 0

硬件 0 19 -2 4 1 1 1 0.5 10 5

剧院 0 -2 28 1 2 1 1 0 -2 -1

电信 0 4 1 22 0 1 2 0 3 4

酿酒 0 1 2 0 4 -1.5 -2 -1 1 1

高速公路 0 1 1 1 -1.5 3.5 2 0.5 1 1.5

汽车 0 1 1 2 -2 2 5 0.5 1 2.5

银行 0 0.5 0 0 -1 0.5 0.5 1 0.5 0.5

软件 0 10 -2 3 1 1 1 0.5 25 8

电子 0 5 -1 4 1 1.5 2.5 0.5 8 16

Page 54: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

问题 问题 1 :投资者采用哪种投资策略可以达到在给定最小目标收益约束的情况下使方差最小? 问题 2 :如果投资者希望最多投资四种不同的股票,哪种投资策略的方差最小(同样是在给定最小目标收益约束的情况下)?

Page 55: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

模型修改 新目标函数:以均方差代替总收益。

移除与风险相关的约束条件。 增加新的约束条件:目标收益。

,st s t

s t SHARES

VAR frac frac

s ss SHARES

RET frac TARGET

Page 56: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

模型数学表达式,

minimize st s ts t SHARES

VAR frac frac

1ss NA

frac

s ss SHARES

RET frac TARGET

: 0 ss SHARES frac MAXVAL

Page 57: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

Mosel 模型实现 使用二次优化器 Xpress-Optimizer

uses "mmxprs", "mmquad" 定义估计收益的方差 /协方差矩阵

VAR: array(SHARES,SHARES) of real 定义目标函数:平均差

Variance:= sum(s,t in SHARES) VAR(s,t)*frac(s)*frac(t)

Page 58: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

有效边沿图

Page 59: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

混合整数二次规划 表达在投资组合中至多有给定支股票 引入二值变量 buy 引入股票数小于MAXNUM 约束条件 把新的二值变量 buy与原变量 frac相关联

ss SHARES

buy MAXNUM

: s ss SHARES frac buy

Page 60: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

实现sum(s in SHARES) buy(s) <= MAXNUM

forall(s in SHARES) dobuy(s) is_binaryfrac(s) <= buy(s)

end-do

Page 61: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

结果分析( 1 )MIQP 解的详细信息

Page 62: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

MIQP 分支定界搜索树

Page 63: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

MIQP 解

Page 64: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

第 8 章 启发式算法 通过定义子程序构造Mosel 模型; 通过参数设置,保存和恢复基可行解 修改变量边界等方法的启发式算法求解过程。

Page 65: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

固定二值变量启发式算法 求解 LP松弛问题并保存最优解的基可行解。 圆整启发式算法:如果投资比例变量接近 0 则将对应的“购买”变量等于 0 ,反之,如果相应的值是一个较大的值则它等于 1 。 求解 MIP 问题。 如果搜索到整数可行解,保存为最好解。 通过将所有变量设置为原有边界恢复原问题,并加载存储的基可行解。 求解原MIP 问题,以启发式算法的解作为切割值。

Page 66: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

实现( 1 )子程序 过程:一个过程以关键字 procedure 开始,紧接着是过程名称,并且以关键字 end-

procedure 结束 函数:具有参数列表并且对于函数还附加返回类型索引,使用关键字 function 子程序的定义是可以重载:一个子程序可以有多种参数组合

Page 67: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

优化器参数和函数 禁止自动割平面处理:保持系数矩阵不发生变化 最优性状态:希望求解 LP松弛的顶部节点 保存和重载基可行解:不再需要重新从头开始求解 LP 问题 边界修改:通过 setlb和 setub直接改变并传递给优化器

Page 68: Xpres s-Mosel 入门 林森科技

DIMACS/EMRE April 20, 2006

误差比较 当前误差 TOL和Mosel 的设置误差 如果误差小于Mosel 误差,则停止计算