optimizer 优化器入门

30
Optimizer 优优优优优 林林林林 2007.6

Upload: ken

Post on 17-Mar-2016

196 views

Category:

Documents


3 download

DESCRIPTION

Optimizer 优化器入门. 林森科技 2007.6. 概述. 矩阵输入 输入和求解线性规划问题 混合整数规划 二次规划. 第 1 章 矩阵输入. 初始化 Xpress-Optimizer 优化器; 载入 MPS 格式或者 LP 格式的矩阵到优化器; 求解问题; 将问题的解写入文件。. 矩阵文件. 扩展 MPS 格式 扩展 LP 格式 这些文件可以通过其他一些工具产生,例如 Mosel 建模语言或者 BCL 库 Xpress-Optimizer 优化器可以读入这些文件. 实现. 初始化 Xpress-Optimizer 优化器 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Optimizer 优化器入门

Optimizer 优化器入门 林森科技

2007.6

Page 2: Optimizer 优化器入门

概述 矩阵输入 输入和求解线性规划问题 混合整数规划 二次规划

Page 3: Optimizer 优化器入门

第 1 章 矩阵输入 初始化 Xpress-Optimizer 优化器; 载入 MPS 格式或者 LP 格式的矩阵到优化器; 求解问题; 将问题的解写入文件。

Page 4: Optimizer 优化器入门

矩阵文件 扩展 MPS 格式 扩展 LP 格式 这些文件可以通过其他一些工具产生,例如Mosel 建模语言或者 BCL 库 Xpress-Optimizer 优化器可以读入这些文件

Page 5: Optimizer 优化器入门

实现 初始化Xpress-Optimizer 优化器

XPRSinit(NULL); 生成问题。

XPRScreateprob(&prob); 读取矩阵文件。

XPRSreadprob(prob, "Folio", ""); 求解问题

XPRSmaxim(prob, ""); 写入文件

XPRSwriteprtsol(prob, "Folio.prt", ""); 释放求解器XPRSdestroyprob(prob); XPRSfree();

Page 6: Optimizer 优化器入门

编译和编程执行 Window dos 命令行:

cl /MD /I D:\xpressmp\include D:\xpressmp\lib\xprb.lib foliomat.c

Window vc6.0 :将 xprb_cpp.h , xprb.lib 文件执行文件夹下面,并添加到工程

Linux 或者 Solaris 系统:cc -D_REENTRANT -I${XPRESSDIR}/include -L${XPRESSDIR}/lib foliomat -o foliolp -lxprb

Page 7: Optimizer 优化器入门

第 2 章 输入和求解线性规划问题 将 LP 模型转化为矩阵形式; 将 LP 问题输入 Xpress-Optimizer 优化器; 求解和结果输出。

Page 8: Optimizer 优化器入门

LP矩阵 frac1 frac2 frac3 frac4 frac5 frac6 frac7 frac8 frac9 frac10

0 1 2 3 4 5 6 7 8 9 Oper. RHS

Risk 0 12 15 18 115 117 ≤ 1/3

MinNA 1 10 13 16 19 ≥ 0.5

Allfrac 2 11 14 17 110 111 112 113 114 116 118 = 1

↑ ↑

rowidx matval

colbeg 0 2 5 8 11 12 13 14 15 17 19

nelem 2 3 3 3 1 1 1 1 2 2 2

Page 9: Optimizer 优化器入门

LP 矩阵表解释 列表示决策变量 行表示约束条件 将所有非零系数输入到表格

Page 10: Optimizer 优化器入门

实现 定义行列

int ncol = 10;int nrow = 3; 定义列数据double obj[] = { 5, 17, 26, 12, 8, 9, 7, 6, 31, 21};double lb[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};double ub[] = {0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3}; 定义行数据char rowtype[] = { ’L’,’G’,’E’};double rhs[] = {1.0/3,0.5, 1}; 定义矩阵系数int colbeg[] = {0, 2, 5, 8, 11,12,13,14,15, 17, 19};int rowidx[] = {1,2, 0,1,2, 0,1,2, 0,1,2, 2, 2, 2, 2, 0, 2, 0,2};double matval[] = {1,1,1,1,1,1,1,1,1,1,1, 1, 1, 1, 1, 1,1, 1,1};

Page 11: Optimizer 优化器入门

矩阵系数的另一种表示方法int colbeg[] = {0, 2, 5, 8, 11,12,13,14,15, 17};int nelem[] = {2, 3, 3, 3, 1, 1, 1, 1, 2, 2};int rowidx[] = {1,2,0,1,2,0,1,2,0,1,2, 2, 2, 2, 2, 0,2, 0,2};double matval[] = {1,1,1,1,1,1,1,1,1,1,1, 1, 1, 1, 1, 1,1, 1,1};

Page 12: Optimizer 优化器入门

载入问题矩阵XPRSloadlp(prob, "FolioLP", ncol, nrow, rowtype, rhs, NULL,obj, colbeg, nelem, rowidx, matval, lb, ub);

求解问题XPRSmaxim(prob,"");

Page 13: Optimizer 优化器入门

编译和编程执行 Window dos 命令行:cl /MD /I D:\xpressmp\include D:\xpressmp\lib\xprb.lib foliolp.c Window vc6.0 :将 xprb_cpp.h , xprb.lib 文件执行文件夹下面,并添加到工程 Linux 或者 Solaris 系统:cc -D_REENTRANT -I${XPRESSDIR}/include -L${XPRESSDIR}/lib foliolp.C -o foliolp -lxprb

Page 14: Optimizer 优化器入门

第 3 章 混合整数规划 将 MIP 模型转换为矩阵格式; 定义不同类型的离散变量; 将不同 MIP 问题中不同类型的离散变量输入到 Xpress-Optimizer 优化器; 求解 MIP 问题和输出解。

Page 15: Optimizer 优化器入门

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

Page 16: Optimizer 优化器入门

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

ss SHARES

buy MAXNUM

: s ss SHARES frac buy

Page 17: Optimizer 优化器入门

矩阵表示

Page 18: Optimizer 优化器入门

实现 矩阵 miptype 和矩阵 mipcol 中表示 MIP 的特殊信息 。 定义行列int ncol = 20;int nrow = 14;int nmip = 10; 定义列数据double obj[]= { 5, 17, 26, 12, 8, 9, 7, 6, 31, 21,0,0,0,0,0,0,0,0,0,0};double lb[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0};double ub[] = {0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.3,1,1,1,1,1,1,1,1,1,1}; 定义行数据char rowtype[]= { ’L’,’G’,’E’,’L’,’L’,’L’,’L’,’L’,’L’,’L’,’L’,’L’,’L’,’L’};double rhs[] = {1.0/3,0.5, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Page 19: Optimizer 优化器入门

定义矩阵系数int colbeg[] = {0,3,7,11,15,17,19,21,23,26,29,31,33,35,37,39,41,43,45,47,49};int rowidx[] = {1,2,4,0,1,2,5,0,1,2,6,0,1,2,7,2,8,2,9,2,10,2,11,0,2,12,0,2,13,3,4,3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,3,13};double matval[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1};

Page 20: Optimizer 优化器入门

定义整数变量char miptype[] = {’B’,’B’,’B’,’B’,’B’,’B’,’B’,’B’,’B’,’B’};int mipcol[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};

载入问题矩阵XPRSloadglobal(prob, "FolioMIP1", ncol, nrow, rowtype, rhs, NULL,obj, colbeg, NULL, rowidx, matval, lb, ub,nmip, 0, miptype, mipcol, NULL, NULL, NULL, NULL, NULL);

求解问题XPRSmaxim(prob,"g");

Page 21: Optimizer 优化器入门

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

: 0ss SHARES frac

sMINVAL frac MAXVAL

Page 22: Optimizer 优化器入门

实现 在前面的基础上将变量定义为半连续类型

double sclim[] = {0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1};

Page 23: Optimizer 优化器入门

第 4 章 二次规划 将 QP 模型转换为矩阵格式; 使用 Xpress-Optimizer 优化器输入和求解QP 问题。

Page 24: Optimizer 优化器入门

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

Page 25: Optimizer 优化器入门

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

国库券 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 26: Optimizer 优化器入门

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

Page 27: Optimizer 优化器入门

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

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

,st s t

s t SHARES

VAR frac frac

s ss SHARES

RET frac TARGET

Page 28: Optimizer 优化器入门

矩阵表示frac1 frac2 frac3 frac4 frac5 frac6 frac7 frac8 frac9 frac10

0 1 2 3 4 5 6 7 8 9 Oper. RHS

MinNA 0 10 13 16 19 ≥

Allfrac 1 11 14 17 110 112 114 116 118 120 = 1

Yield 2 12 175 268 1211 813 915 717 619 3121 2123 ≥ 9

↑ ↑

rowidx matval

colbeg 0 3 6 9 12 14 16 18 20 22 24

Page 29: Optimizer 优化器入门

定义二次项系数矩阵 定义一个被乘项qcol1[]

定义一个乘项 qcol2[]

定义系数矩阵qval[]

Page 30: Optimizer 优化器入门

载入矩阵问题 XPRSloadqp(prob, "FolioQP", ncol, nrow, rowtype, rhs, NULL,

obj, colbeg, NULL, rowidx, matval, lb, ub,nqt, qcol1, qcol2, qval);