680 likes | 925 Views
Xpres s-Mosel 入门 林森科技. 2007.6. 概述. 安装 建模 输入和求解线性规划问题 数据处理 绘制用户曲线 混合整数规划 二次规划 启发式算法. 第 1 章 安装 Xpress-MP. 完整版 双击 xp2006a_win32_setup 安装文件 将 xpauth.ini 文件复制到 bin 文件夹下 学生版 双击 student 安装文件 安装密码 studentonly. 第 2 章 建模. 优化流程 Xpress-MP 系列软件介绍 建模示例. 优化工程流程. Xpress-MP 系列软件. 建模示例.
E N D
Xpress-Mosel入门林森科技 2007.6
概述 • 安装 • 建模 • 输入和求解线性规划问题 • 数据处理 • 绘制用户曲线 • 混合整数规划 • 二次规划 • 启发式算法 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 系列软件 DIMACS/EMRE April 20, 2006
建模示例 • 一个投资者希望用一定数量的资金进行投资。他对十种不同的股票进行投资,并估计在一年内投资的收益。下表给出了每种股票的国别,风险类别(R:高风险,N:低风险)和期望投资是收益率(ROI)。投资者确定了某些约束条件。为了分摊风险,他希望对每种股票的投资最多占总资金的30%。进一步,他希望资金的一半能够投资在北美的股票和最多三分之一是高风险投资。这些资金应该怎样在各种股票中进行分配才能达到最大化的收益的目的呢? DIMACS/EMRE April 20, 2006
股票的国别和估计投资收益列表 DIMACS/EMRE April 20, 2006
定义变量 • 定义决策变量frac • 定义辅助变量 • SHARES作为投资者希望投资的股票的集合 • RET作为股票s的期望ROI。 • NA表示北美国家股票集合 • RISK表示高风险股票集合。 DIMACS/EMRE April 20, 2006
设定约束条件 • 所有变量的边界 • 不同股票的分数之和必须为100% DIMACS/EMRE April 20, 2006
投资者对北美的股票的投资最少50% • 投资到这个类型股票的资金之和不能超过整个资金的 0.33 • 设定目标函数 • 投资者的目标是最大化所有股票投资的收益 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
错误分析 • 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
断点调试 • 选择Debug->Start/Continue命令或者点击按钮启动 或者停止调试 。 • Debug菜单的项目和调试按钮允许用户完成标准的调试任务,例如设置断点(按钮 ),运行模型到指针位置(按钮 ),或者单步执行(按钮 和 )。 DIMACS/EMRE April 20, 2006
求解,优化显示和查看解 • 运行后可以在表Output/input看到程序的输出 • 表Stats获得详细的LP优化信息 DIMACS/EMRE April 20, 2006
字符串索引 • 利用字符串索引代替数值索引 SHARES = 1..10 RISK = {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"):=26 RET("telecom"):=12; RET("brewery"):=8;RET("highways"):=9; RET("cars"):=7 RET("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 NA end-initializations DIMACS/EMRE April 20, 2006
格式化数据文件输出 • 调用函数fopen和fclose fopen("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
parameters DATAFILE= "folio.dat" ! File with problem data OUTFILE= "result.dat" ! Output file MAXRISK = 1/3 ! Max. investment into high-risk values MAXVAL = 0.3 ! Max. investment per share MINAM = 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
第6章 混合整数规划 • 定义不同类型的离散变量; • 在IVE图形用户界面中理解和使用混合整数规划的显示。 DIMACS/EMRE April 20, 2006
扩展问题描述 • 投资者不希望持有少量的股票。因此他提出了以下两个可能的约束条件: • 1. 限制投资组合中不同股票的支数。 • 2. 如果买进一种股票,它所占的资金至少占预算的10%即。 DIMACS/EMRE April 20, 2006
MIP 模型1:购买股票数有限 • 引入二值变量buy • 引入股票数小于MAXNUM约束条件 • 把新的二值变量buy与原变量frac相关联 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:增加最小投资量限制 • 新的约束条件 • 如果买进一支股票,则投资该股票的金额占整个资金的比例至少大于一个最小值 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