Xpres s-Mosel 入门 林森科技
description
Transcript of Xpres s-Mosel 入门 林森科技
Xpress-Mosel入门 林森科技
2007.6
DIMACS/EMRE April 20, 2006
概述 安装 建模 输入和求解线性规划问题 数据处理 绘制用户曲线 混合整数规划 二次规划 启发式算法
DIMACS/EMRE April 20, 2006
第 1 章 安装 Xpress-MP 完整版
双击 xp2006a_win32_setup 安装文件 将 xpauth.ini 文件复制到 bin 文件夹下
学生版 双击 student 安装文件 安装密码 studentonly
DIMACS/EMRE April 20, 2006
第 2 章 建模 优化流程 Xpress-MP 系列软件介绍 建模示例
DIMACS/EMRE April 20, 2006
优化工程流程
问 题 描 述 建 模
分 析
求 解
开 发
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库
DIMACS/EMRE April 20, 2006
建模示例 一个投资者希望用一定数量的资金进行投资。他对十种不同的股票进行投资,并估计在一年内投资的收益。下表给出了每种股票的国别,风险类别( R :高风险, N :低风险)和期望投资是收益率( ROI )。投资者确定了某些约束条件。为了分摊风险,他希望对每种股票的投资最多占总资金的30 %。进一步,他希望资金的一半能够投资在北美的股票和最多三分之一是高风险投资。这些资金应该怎样在各种股票中进行分配才能达到最大化的收益的目的呢?
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
DIMACS/EMRE April 20, 2006
定义变量 定义决策变量 frac 定义辅助变量 SHARES 作为投资者希望投资的股票的集合 RET 作为股票 s 的期望 ROI 。 NA 表示北美国家股票集合 RISK 表示高风险股票集合。
DIMACS/EMRE April 20, 2006
设定约束条件 所有变量的边界
不同股票的分数之和必须为 100 %: 0 0.3ss SHARES frac
1ss SHARES
frac
DIMACS/EMRE April 20, 2006
投资者对北美的股票的投资最少 50 % 投资到这个类型股票的资金之和不能超过整个资金的 0.33
设定目标函数 投资者的目标是最大化所有股票投资的收益
1/ 3ss RISK
frac
0.5ss NA
frac
s ss SHARES
RET frac
DIMACS/EMRE April 20, 2006
第 3 章 输入和求解线性规划问题 启动 Xpress-IVE 图形用户界面 线性规划模型 修正错误和调试模型 求解,优化显示和查看解
DIMACS/EMRE April 20, 2006
启动 Xpress-IVE 图形用户界面 双击桌面上的图标 开始 -> 所有程序 -> Xpress-MP->
Xpress-IVE 命令启动程序 window的 Dos 环境下输入 ive 命令 双击模型文件(扩展名为 .mos )
DIMACS/EMRE April 20, 2006
编辑窗口工程工具栏
运行栏
信息栏
执行模型
编译模型模型转换
执行选项
DIMACS/EMRE April 20, 2006
行号显示
DIMACS/EMRE April 20, 2006
线性规划 - 一般结构 定义模型: model, end-model 引用求解: uses, maximize,minimize 声明部分 :declarations ,end-declarations 输出: writeln 格式 分行:可以用分号将多个语句分开写到一行内 注释: Mosel 中单独一行的注释以!开始。多行的注释以(!开始并且以!)结束
DIMACS/EMRE April 20, 2006
修改错误和调试模型 定义模型: model, end-model 引用求解: uses, maximize,minimize 声明部分 :declarations ,end-declarations 输出: writeln 格式 分行:可以用分号将多个语句分开写到一行内 注释: Mosel 中单独一行的注释以!开始。多行的注释以(!开始并且以!)结束
DIMACS/EMRE April 20, 2006
DIMACS/EMRE April 20, 2006
错误分析 error 100: Syntax error 指向下面一行 RET:= [5,17,26,12,8,9,7,6,31,21 我们需要添加中括号以结束的定义(如果定义一直延续到下一行,我们需要添加在行的末端添加一个逗号表示当前行并没有结束)。
DIMACS/EMRE April 20, 2006
warning 121: Statement with no effect Return = sum(s in SHARES) RET(s)*frac(s) 警告在模型执行时并不隐藏,但是当Mosel编译器提示这行没有意义时,则这一行一定存在错误。查找这个错误需要仔细检查:我们使用了=而不是 := 。这样 Return 应该被定义为右边所有项之和并对它进行赋值,这句现在并没有意义
DIMACS/EMRE April 20, 2006
error 123: ‘maximize’ is not defined 跳转到这一行 maximize(Return) 这是由于在模型中定义了 maximize处理过程,但是我们忘记了在 Mosel 模型开始部分添加以下这行。 uses "mmxprs"
DIMACS/EMRE April 20, 2006
调试 选择 Build->Options 命令或者点击运行选项按钮 将会显示表 Matrix visualization ,选择
Show original matrix ,然后点击确认 Apply 。 执行一个模型时,它可以在 IVE 图形用户界面右边的运行工具栏产生可视化的矩阵显示 显示的另一个变化是在工作区窗口的左边:显示模型定义中的所有项目。可以通过点击“+”号对所有信息进行查看
DIMACS/EMRE April 20, 2006
DIMACS/EMRE April 20, 2006
DIMACS/EMRE April 20, 2006
断点调试 选择Debug->Start/Continue 命令或者点击按钮启动 或者停止调试 。 Debug菜单的项目和调试按钮允许用户完成标准的调试任务,例如设置断点(按钮 ),运行模型到指针位置(按钮 ),或者单步执行(按钮 和 )。
DIMACS/EMRE April 20, 2006
求解,优化显示和查看解 运行后可以在表 Output/input 看到程序的输出 表 Stats 获得详细的 LP 优化信息
DIMACS/EMRE April 20, 2006
DIMACS/EMRE April 20, 2006
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"}
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
DIMACS/EMRE April 20, 2006
第 4 章 数据处理 从文件输入数据
从外部文件读取 从 Excel 电子表格读取 与数据库进行数据交换
格式化输出
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"] 格式化输出
DIMACS/EMRE April 20, 2006
Mosel 模型修改 initializations from "folio.dat"
RISK RET NAend-initializations
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)
DIMACS/EMRE April 20, 2006
设置参数 目的: 以参数的形式定义例如文件名和数值约束条件,从而在执行模型时可以修改这些参数的值,而不用改变模型本身 参数的定义必须添加到模型的开始部分,直接在 uses 语句后使用
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
DIMACS/EMRE April 20, 2006
第 5 章 绘制用户曲线 目的 对高风险股票部分进行不同的限制,然后执行 LP 模型并且将结果以曲线表示,绘制每种结果的收益-偏差曲线图作为风险评估
DIMACS/EMRE April 20, 2006
实现1. 定义模型在参数变化时保持不变的部分。2. 对每个参数值:• 重新定义限制高风险股票投资比例的约束。• 求解问题结果。• 如果问题可行,保存问题解。3. 绘制结果曲线。
DIMACS/EMRE April 20, 2006
为了存储问题解和在每次优化后估计所有结果的偏差,我们定义以下两个矩阵:declarations
SOLRET: array(range) of real ! 解的值(总共收益)SOLDEV: array(range) of real ! 解的值(平均偏差)
end-declarations
DIMACS/EMRE April 20, 2006
定义约束条件名称,循环执行
DIMACS/EMRE April 20, 2006
绘制曲线 加载绘图模块 uses "mmive“ 实现
DIMACS/EMRE April 20, 2006
DIMACS/EMRE April 20, 2006
第 6 章 混合整数规划 定义不同类型的离散变量; 在 IVE 图形用户界面中理解和使用混合整数规划的显示。
DIMACS/EMRE April 20, 2006
扩展问题描述 投资者不希望持有少量的股票。因此他提出了以下两个可能的约束条件: 1. 限制投资组合中不同股票的支数。 2. 如果买进一种股票,它所占的资金至少占预算的 10%即。
DIMACS/EMRE April 20, 2006
MIP 模型 1 :购买股票数有限 引入二值变量 buy 引入股票数小于MAXNUM 约束条件 把新的二值变量 buy与原变量 frac相关联
ss SHARES
buy MAXNUM
: s ss SHARES frac buy
DIMACS/EMRE April 20, 2006
循环定义变量和约束 forall(s in SHARES) buy(s) is_binary forall(s in SHARES) frac(s) <= buy(s)
DIMACS/EMRE April 20, 2006
结果分析 Build ->Options 命令 表 Pause 下面的表 view matrix )使矩阵可视化
DIMACS/EMRE April 20, 2006
详细结果
DIMACS/EMRE April 20, 2006
MIP 模型 2 :增加最小投资量限制 新的约束条件 如果买进一支股票,则投资该股票的金额占整个资金的比例至少大于一个最小值
: 0ss SHARES frac
sMINVAL frac MAXVAL
DIMACS/EMRE April 20, 2006
引入新的变量类型:半连续变量 半连续变量:决策变量是一个取值为 0 或者在指定的上界和下界之间的值。半连续变量适用于变量被使用时则具有一个最小值的情况。 forall(s in SHARES) do
frac(s) <= MAXVAL frac(s) is_semcont MINVAL
end-do
DIMACS/EMRE April 20, 2006
第 7 章 二次规划 定义二次规划目标函数; 逐步定义和求解问题; 在 IVE 图形用户界面中理解和使用 MIP 优
化的显示。
DIMACS/EMRE April 20, 2006
问题描述 投资者可能从不同的角度考虑投资组合选择问题:现在他希望限制投资风险并获得一定的目标收益,而不是最大化估计收益和限制高风险投资的比例。他采用 Markowitz方法来得到股票投资的估计收益的方差 /协方差矩阵的估计值。(例如,硬件和软件公司价值趋势趋于一致,但是与戏剧产业的成功相反,因为当人们厌烦新的计算机和计算机游戏时人们会更多的选择去剧院。)戏剧产业的收益是容易发生变化的,但是国债收益是一定的。估计收益和方差 /协方差矩阵在下表给出:
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
DIMACS/EMRE April 20, 2006
问题 问题 1 :投资者采用哪种投资策略可以达到在给定最小目标收益约束的情况下使方差最小? 问题 2 :如果投资者希望最多投资四种不同的股票,哪种投资策略的方差最小(同样是在给定最小目标收益约束的情况下)?
DIMACS/EMRE April 20, 2006
模型修改 新目标函数:以均方差代替总收益。
移除与风险相关的约束条件。 增加新的约束条件:目标收益。
,st s t
s t SHARES
VAR frac frac
s ss SHARES
RET frac TARGET
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
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)
DIMACS/EMRE April 20, 2006
有效边沿图
DIMACS/EMRE April 20, 2006
混合整数二次规划 表达在投资组合中至多有给定支股票 引入二值变量 buy 引入股票数小于MAXNUM 约束条件 把新的二值变量 buy与原变量 frac相关联
ss SHARES
buy MAXNUM
: s ss SHARES frac buy
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
DIMACS/EMRE April 20, 2006
结果分析( 1 )MIQP 解的详细信息
DIMACS/EMRE April 20, 2006
MIQP 分支定界搜索树
DIMACS/EMRE April 20, 2006
MIQP 解
DIMACS/EMRE April 20, 2006
第 8 章 启发式算法 通过定义子程序构造Mosel 模型; 通过参数设置,保存和恢复基可行解 修改变量边界等方法的启发式算法求解过程。
DIMACS/EMRE April 20, 2006
固定二值变量启发式算法 求解 LP松弛问题并保存最优解的基可行解。 圆整启发式算法:如果投资比例变量接近 0 则将对应的“购买”变量等于 0 ,反之,如果相应的值是一个较大的值则它等于 1 。 求解 MIP 问题。 如果搜索到整数可行解,保存为最好解。 通过将所有变量设置为原有边界恢复原问题,并加载存储的基可行解。 求解原MIP 问题,以启发式算法的解作为切割值。
DIMACS/EMRE April 20, 2006
实现( 1 )子程序 过程:一个过程以关键字 procedure 开始,紧接着是过程名称,并且以关键字 end-
procedure 结束 函数:具有参数列表并且对于函数还附加返回类型索引,使用关键字 function 子程序的定义是可以重载:一个子程序可以有多种参数组合
DIMACS/EMRE April 20, 2006
优化器参数和函数 禁止自动割平面处理:保持系数矩阵不发生变化 最优性状态:希望求解 LP松弛的顶部节点 保存和重载基可行解:不再需要重新从头开始求解 LP 问题 边界修改:通过 setlb和 setub直接改变并传递给优化器
DIMACS/EMRE April 20, 2006
误差比较 当前误差 TOL和Mosel 的设置误差 如果误差小于Mosel 误差,则停止计算