300 likes | 698 Views
Optimizer 优化器入门. 林森科技 2007.6. 概述. 矩阵输入 输入和求解线性规划问题 混合整数规划 二次规划. 第 1 章 矩阵输入. 初始化 Xpress-Optimizer 优化器; 载入 MPS 格式或者 LP 格式的矩阵到优化器; 求解问题; 将问题的解写入文件。. 矩阵文件. 扩展 MPS 格式 扩展 LP 格式 这些文件可以通过其他一些工具产生,例如 Mosel 建模语言或者 BCL 库 Xpress-Optimizer 优化器可以读入这些文件. 实现. 初始化 Xpress-Optimizer 优化器
E N D
Optimizer优化器入门 林森科技 2007.6
概述 • 矩阵输入 • 输入和求解线性规划问题 • 混合整数规划 • 二次规划
第1章 矩阵输入 • 初始化Xpress-Optimizer优化器; • 载入MPS格式或者LP格式的矩阵到优化器; • 求解问题; • 将问题的解写入文件。
矩阵文件 • 扩展MPS格式 • 扩展LP格式 • 这些文件可以通过其他一些工具产生,例如Mosel建模语言或者BCL库 • Xpress-Optimizer优化器可以读入这些文件
实现 • 初始化Xpress-Optimizer优化器 XPRSinit(NULL); • 生成问题。 XPRScreateprob(&prob); • 读取矩阵文件。 XPRSreadprob(prob, "Folio", ""); • 求解问题 XPRSmaxim(prob, ""); • 写入文件 XPRSwriteprtsol(prob, "Folio.prt", ""); • 释放求解器 XPRSdestroyprob(prob); XPRSfree();
编译和编程执行 • 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
第2章 输入和求解线性规划问题 • 将LP模型转化为矩阵形式; • 将LP问题输入Xpress-Optimizer优化器; • 求解和结果输出。
LP矩阵表解释 • 列表示决策变量 • 行表示约束条件 • 将所有非零系数输入到表格
实现 • 定义行列 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};
矩阵系数的另一种表示方法 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};
载入问题矩阵 XPRSloadlp(prob, "FolioLP", ncol, nrow, rowtype, rhs, NULL,obj, colbeg, nelem, rowidx, matval, lb, ub); • 求解问题 XPRSmaxim(prob,"");
编译和编程执行 • 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
第3章 混合整数规划 • 将MIP模型转换为矩阵格式; • 定义不同类型的离散变量; • 将不同MIP问题中不同类型的离散变量输入到Xpress-Optimizer优化器; • 求解MIP问题和输出解。
扩展问题描述 • 投资者不希望持有少量的股票。因此他提出了以下两个可能的约束条件: • 1. 限制投资组合中不同股票的支数。 • 2. 如果买进一种股票,它所占的资金至少占预算的10%即。
MIP 模型1:购买股票数有限 • 引入二值变量buy • 引入股票数小于MAXNUM约束条件 • 把新的二值变量buy与原变量frac相关联
实现 • 矩阵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};
定义矩阵系数 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};
定义整数变量 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");
MIP模型 2:增加最小投资量限制 • 新的约束条件 • 如果买进一支股票,则投资该股票的金额占整个资金的比例至少大于一个最小值
实现 • 在前面的基础上将变量定义为半连续类型 double sclim[] = {0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1};
第4章 二次规划 • 将QP模型转换为矩阵格式; • 使用Xpress-Optimizer优化器输入和求解QP问题。
问题描述 • 投资者可能从不同的角度考虑投资组合选择问题:现在他希望限制投资风险并获得一定的目标收益,而不是最大化估计收益和限制高风险投资的比例。他采用Markowitz方法来得到股票投资的估计收益的方差/协方差矩阵的估计值。(例如,硬件和软件公司价值趋势趋于一致,但是与戏剧产业的成功相反,因为当人们厌烦新的计算机和计算机游戏时人们会更多的选择去剧院。)戏剧产业的收益是容易发生变化的,但是国债收益是一定的。估计收益和方差/协方差矩阵在下表给出:
问题 • 问题1:投资者采用哪种投资策略可以达到在给定最小目标收益约束的情况下使方差最小? • 问题2:如果投资者希望最多投资四种不同的股票,哪种投资策略的方差最小(同样是在给定最小目标收益约束的情况下)?
模型修改 • 新目标函数:以均方差代替总收益。 • 移除与风险相关的约束条件。 • 增加新的约束条件:目标收益。
定义二次项系数矩阵 • 定义一个被乘项 qcol1[] • 定义一个乘项 qcol2[] • 定义系数矩阵 qval[]
载入矩阵问题 • XPRSloadqp(prob, "FolioQP", ncol, nrow, rowtype, rhs, NULL, obj, colbeg, NULL, rowidx, matval, lb, ub,nqt, qcol1, qcol2, qval);