xprog用户指南.docx

上传人:b****9 文档编号:25817299 上传时间:2023-06-15 格式:DOCX 页数:40 大小:557.30KB
下载 相关 举报
xprog用户指南.docx_第1页
第1页 / 共40页
xprog用户指南.docx_第2页
第2页 / 共40页
xprog用户指南.docx_第3页
第3页 / 共40页
xprog用户指南.docx_第4页
第4页 / 共40页
xprog用户指南.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

xprog用户指南.docx

《xprog用户指南.docx》由会员分享,可在线阅读,更多相关《xprog用户指南.docx(40页珍藏版)》请在冰豆网上搜索。

xprog用户指南.docx

xprog用户指南

 

XProg1.0用户指南

MATLAB工具箱-不确定条件下的优化

1介绍

XProg是一个用于在MATLAB环境下构造不确定性优化模型的工具箱。

(2012A或以上版本)。

它能够解决确定性的、随机的、鲁棒的和分布式的。

鲁棒优化问题〔1,2,3〕。

灵感来自决策规则技术[1,2,4,5],这工具箱还支持将多阶段问题中的可调整资源决策建模为可处理的决策规则近似。

与MATLAB的矩阵计算语法一致,XProg非常易于实现,并且与其他MATLAB的数值函数和图形函数兼容。

针对大规模优化问题,开发了基于高效矩阵处理函数的工具箱,能够利用不确定集的特殊结构来降低计算成本。

IBMILOGCPLEX混合整数优化器在当前版本中用于求解以线性、二次或二阶锥形程序形式的模型。

在整个用户指南中,我们将使用粗体字母来表示矩阵和向量。

矩阵或向量的条目用带表示索引下标的常规字母表示。

工具箱中的所有函数都被写为函数“functions”,而输入和输出参数则写作“arguments”。

随后的章节组织如下。

下一章介绍了该工具箱的配置、数据结构和基本功能。

利用几个确定性和随机性编程实例演示了XProg的实现。

第三章给出了求解鲁棒优化问题的一般步骤,包括建立随机变量和不确定性集合,以及为可调整决策建立决策规则函数。

最后一章讨论了分布式鲁棒优化问题的建模与求解。

2从XPorg开始

2.1准备工作

XProg在32位和64位Matlab下工作,版本2012A或以上。

它需要安装IBMILOGCPLEX作为混合整数优化器。

这个软件是一个流行的商业求解器,而且对学校使用人员是免费的。

2.2配置

XProg使用IBMILOGCPLEXOptimizationStudio12.6.3/12.6.2/12.6.1作为求解器。

如果这些解决程序已经安装在默认目录下,那么它们可以轻松地与我们的工具箱链接。

用户只需要在命令窗口中运行交互式输入程序configure。

如图2.1所示,您可以选择您正在使用的CPLEX优化器的版本。

然后程序将询问所选的解决程序是否安装在默认目录中。

一旦用户键入“Y”,程序就完成了配置过程。

如果使用其他版本的CPLEX优化器,或者如果这些求解器安装在其他目录中,那么一旦指定了求解器的版本和目录,程序配置将帮助用户编译求解器函数。

如果使用其他版本的CPLEX优化器,或者指定了这些求解器。

请注意,在这种情况下,您需要在计算机中安装兼容的C/C++编译器,并且编译器应该在MATLAB命令提示符下通过调用“MEX安装程序”来预先激活。

详细过程如图2.2所示。

配置XProg的第一步是将“dll”文件“cplexXXXX.dll”从“CPLEX根目录CPLEXXXXcpleXXXX\cple\bin”目录复制到XProg工具箱的\function”文件夹中,其中“XXXX”表示CPLEX优化器的版本号。

请注意,在使用XPROG之前,只需要进行编译。

除非使用不同版本的CPLEX优化器,否则不需要为将来的实现重复这些步骤。

图2.1配置xprogCPLEX12.6.3安装在默认目录

图2.2配置XPROG为用户指定的求解器

2.3XProg基础

2.3.1XProg的模型,决策,约束

在XProg工具箱中定义了以下对象和函数来构造和解决优化模型。

1)start_xprog和end_xprog

函数start_xprog用于把XProg工具箱包含到工作目录中,并且在运行基于XProg的任何代码之前都需要它。

一旦工具箱被包含到工作目录中,用户可以在任何文件夹中执行XPROG程序。

函数end_xprog用于从当前工作目录中删除XPROG。

如果函数或对象名称与其他工具箱存在矛盾,则使用此函数。

在下表中列出了所有XPROG对象的名称。

表2.1XPorg工具箱的对象

名称定义

absexp线性仿射表达式的绝对值

bound决策变量或随机变量的界

constraint约束条件

drcconstraint具有期望条件的不确定约束的鲁棒对偶

exp线性仿射表达式的指数函数

expconstraint期望条件约束

explinfun一类不确定线性函数的期望

expoconstraint指数约束

linfun线性函数

linoptim确定性优化程序

normconstraint二阶锥约束

normexp二阶锥表达式

qexpconstraint圆锥指数二次约束

qexpfun圆锥指数二次函数

rcconstraint不确定约束的鲁棒对应

refrule带索引的决策规则函数

rule决策规则函数

sqconstraint平方项的约束

sqconstraints平方项约束

sqexp平方表达式

sqmat矩阵形式的平方表达式

subsets置信集

unconstraints不确定性约束

unconstraints不确定线性函数

variables决策变量或随机变量

xprogXPROG模型

2)xprog

函数xprog创建一个新的XPROG优化模型对象

Model=xprog创建优化模型对象模型

model=xprog(name)创建一个优化对象model带有用户定义的标题name

3)decision

函数decision为模型对象定义新的决策变量

x=model.decision为模型对象model定义一个连续决策变量x

x=model.decision(N)为model定义N*1的向量x为连续决策变量

x=model.decision(N,M)为model定义N*M的向量x为连续决策变量

x=model.decision(N,M,type)为model定义N*M的向量x为连续决策变量。

如果type=0,则这些变量是连续的;如果type=1,则这些变量是二进制的;如果type=2,则这些变量是通用整数。

x=model.decision(N,M,type,name)这组变量的名称是name

4)add

函数add用于添加一组约束到模型对象中

model.add(constraint)添加constraint到优化模型对象model中。

参数constraint可以是任何确定性二次可表示约束,或者线性约束,包括随机变量或期望项。

model.add(constraint,name)指定name为约束名称

5)min和max

函数min和max用来定义对象函数。

对象函数必须是1*1的形式。

注意不允许对同一个模型定义对象函数超过一次。

如果对象函数被修改,将会给出错误信息。

model.min(Fun)最小化对象函数Fun。

model.max(Fun)最大化对象函数Fun。

6)solve

函数solve解答Xprog工具箱构建的优化问题。

model.solve解决对象model的优化问题。

相对混合整数规划(MIP)的间隔设置为10-4如果问题中包含整数变量。

model.solve(MIPGAP)求解程序将终止当MIP间隔小于误差MIPGAP。

注意MIP间隔误差是无效的当model中所有决策变量都是连续的。

7)get

函数get用来检索模型的目标值,或选择决策变量的最优解。

model.get得到对象model的值。

x.get得到决策变量矩阵x的解

2.3.2矩阵索引与算术运算

XProg应用与MATLAB相同的索引系统访问矩阵中的决策变量。

下面的示例演示如何为索引决策变量制定约束。

model=xprog;%createamodel;

x=model.decision(5,6);%definea5*6decisionvariablematrix

model.add(x>=0);%eachelementofxisnonnegative

model.add(x>=zeros(5,6));%sameasabove

model.add(3*x(1,5)<=10);%3*x_15<=10

model.add(x(1,:

)<=x(5,:

));%the1strowofxisnolargerthanthe5th

model.add(x(:

end-1:

end)<=1);%thelasttwocolumnsarenolargerthan1

model.add(x([135],[24])<=1);%x_12,x_32,x_52,x_14,x_34,x_54<=1

model.add(x(8)<=x(14));%x_32<=x_43

此外,XProg与MATLAB在大多数数组运算和矩阵运算(如加法、减法、求和、矩阵和逐元乘法等)中是一致的。

下面给出一些实例。

model=xprog;%createamodel;

x=model.decision(5);%definea5*1decisionvariablematrix

y=model.decision(3);%definea3*1decisionvariablematrix

A=ones(3,5);%Aisa3*5matrix

b=ones(5,1);%bisa5*1vector

c=rand(3,1);%cisa3*1vector

model.add(A*x+b>=0);%matrixmultiplicationA*x

model.add(sum(x)-y'*c==1);%transposeofy,sumofeachrowofx

model.add(c.*y<=2)%element-wisemultiplicationc.*y

model.add(sum(b,2)==sum(c,2));%sumofeachcolumnofbandc

最后,还可以将决策变量、随机变量及其线性表达式的矩阵和向量相互连接,并通过函数重塑来修改矩阵和向量的维数。

具体示例如下所示。

model=xprog;%createamodel;

x=model.decision(8,2);%definea2*8decisionvariablematrix

y=model.decision(2,8);%definea2*8decisionvariablematrix

model.add([x;y(:

2:

3)]>=0);%verticalconcatenation...

%xandy(:

2:

3)havethesamenumberofrows

model.add([xy']==1);%horizontalconcatenation...

%xandy'havethesamenumberofcolumns

model.add(reshape(y,4,4)>=eye(4));%reshapeyintoa4*4matrix...

%thenumberofelementsmustnotchange

2.3.3凸函数

一些常用的凸函数被并入XPROG工具箱中。

注意,为了保持凸性,凸函数只允许小于或等于线性表达式。

异常导致错误消息,指示约束是非凸的。

1)abs

函数abs返回线性仿射表达式的绝对值。

abs(fun)返回线性仿射函数矩阵fun的绝对值。

2)norm

函数norm返回线性仿射表达式的F-范数。

norm(fun)返回线性仿射表达fun的F-范数作为矩阵范数。

假设fun是C=AX+B的矩阵范数,C∈RM*N,norm返回

3)square

函数square返回线性仿射表达式fun的平方作为向量。

假设fun是Ax+b形式的向量,则函数返回(Ax+b)T(Ax+b)

4)element-wisesquare:

.^2

运算符“.^2”返回矩阵元素的平方

(fun).ˆ2返回线性仿射表达式fun的元素平方,输入参数fun通常是以C=AX+B的矩阵形式

5)exp

函数exp用二阶二次曲线近似线性仿射表达式的指数函数。

exp(Fun)用二阶二次曲线近似线性仿射表达式fun的指数函数。

近似的精度取决于参数model.Param.ExpL.。

6)quadexpcone

函数quadexpcone用二阶二次曲线近似文献[6]提出的二次指数锥函数。

quadexpcone(a,b,c)近似

当输入参数a,b,c都是1*1变量或者线性仿射函数。

使用这些凸函数构造约束的示例如下。

model=xprog;%createamodel

x=model.decision(8,2);%definea2*8decisionvariablematrix

y=model.decision(2,8);%definea2*8decisionvariablematrix

A=ones(1,8);%Aisa3*8matrix

B=ones(3,2);%Bisa3*2matrix

model.add(abs(x)<=y');%absolutevalueofx

model.add(y

(1)>=norm(x));%normofx

model.add(-square(A*x)+4>=0);%squareofA*x,whichisequivalentto

(A*x)'*(A*x)

model.add(x(1:

3,:

).ˆ2-B<=0);%element-wisesquareofx(1:

3,:

2.3.4XPorg模型的数学公式

XProg允许用户访问优化公式的重要数据,如问题维数、约束矩阵、决策变量的类型和边界等。

这些数据可以通过函数problem以MATLAB结构数据格式返回。

我们还开发了一个函数showsparse来揭示线性和二阶锥约束矩阵的稀疏性。

这两个函数的细节如下所示。

1)problem

函数problem返回优化问题的数据。

Problem=model.problem返回model问题的MATLAB结构数据。

次结构的细节如下。

Problem.A是所有约束的左手边矩阵。

Problem.b是所有约束的右手边矩阵。

Problem.sense是表示每个约束意义的向量。

“0”表示“≤”,“1”表示“=”。

Problem.Fun是目标函数协方差向量。

Problem.M是表示可变类型的向量。

“0”表示连续,“1”表示二进制,“2”表示一般整数。

Problem.LB是可变下界。

Problem.UB是可变上界。

Problem.Qmat是包含所有二阶锥约束数据的稀疏矩阵。

2)showsparse

函数showsparse显示稀疏矩阵的稀疏性或优化模型。

Model.showsparse显示model约束矩阵的稀疏性。

线性约束通过蓝圈表示,二阶锥约束用红圈表示。

Showsparse(A)显示矩阵A的稀疏性。

2.3.5参数

对于每个XPorg对象,都有一个名为“Param”的字段,用于分配优化模型的某些参数。

下面列出这些参数。

model.Param.DecRand为减少鲁棒优化问题的规模设置选项。

如果DecRand设置为“1”,xprog产生更小的鲁棒counterpart公式通过利用不确定集的特殊结构。

默认值是“0”,不应用减小规模。

更多细节在第3章3.1.3中给出。

model.Param.ExpName是导出“lp”文件的名称。

默认值是空的。

导出文件的名称和模型名称相同,如果这个字段没有被定义。

model.Param.IsExport是输出选项。

如果IsExport被设置为“1”,则生成和模型关联的“lp”文件,如果是“0”,就不输出文件。

默认值是“0”。

model.Param.IsPrint是输出选项。

如果Isprint设置为“1”,则显示解决时间和状态,如果是“0”就不显示。

默认值是“0”。

model.Param.MIPGap设置包含整数变量的问题的相对MIP间隙。

默认值为10-4。

本字段也可也由函数solve的输入参数设置。

model.Param.IntTol设置整型变量的完整性公差。

默认值为10-5。

这个参数在处理Big-M术语的约束时非常有用。

model.Param.ExpL设置用于近似指数和二次指数锥约束的常数L。

l必须是正整数,默认值是4。

2.4说明性实例

2.4.1确定性优化实例

通过两个实例说明了使用XProg解决优化问题的一般过程。

首先给出一个简单的确定性线性规划问题,然后给出一个实际的风力分配问题,作为对二次函数和整数决策变量的示例。

例2.4.1考虑一个简单的线性规划问题

该线性规划可以方便地用下面的代码表示,它给出了最优值为36,最优解为x=4和y=6。

model=xprog('SimpleLP');%createamodel,named"SimpleLP"

x=model.decision;%createadecisionxformodel

y=model.decision;%createadecisionyformodel

model.max(3*x+4*y);%defineobjectivefunction

model.add(2.5*x+y<=20);%addthe1stconstrainttomodel

model.add(3*x+3*y<=30);%addthe2ndconstrainttomodel

model.add(x+2*y<=16);%addthe3rdconstrainttomodel

model.add(x>=0);%boundofx

model.add(y>=0);%boundofy

model.solve;%solvetheproblem

Obj=model.get;%gettheobjectivevalue

X=x.get;%getsolutionx

Y=y.get;%getsolutiony

这个例子表明,制定优化问题的第一步是创建一个XProg对象。

然后用户可以决定决策变量、目标函数和约束。

这种优化模型可以通过调用函数“solve”来解决。

目标函数值和最优解可以通过函数“get”来访问。

例2.4.2第二个例子。

第二个例子考虑40个风力涡轮机跨越7个地点的最优分配[7],以便使总风力方差最小。

假设所有地点的预期风能由向量

表示,风电功率的标准偏差用向量

表示,风电功率的相关性用相关矩阵

表示。

向量σ和矩阵P的输入值可以在说明中找到。

假定

即所有站点的涡轮数矢量,预期总风力输出为50MW,该风力分散问题可以表示为如下的二次规划问题。

下面列出了基于XPROG的相应代码。

%inputdataisomitted.Pleaserefertoexample_2_4_2_winddiv.m

%mu(7*1)istheexpectedwindpowerfromeachsite

%sig(7*1)iswindpowerstandarddeviationsofeachsite

%P(7*7)isthecorrelationmatrix

model=xprog('WindDiv');%createamodel,named"WindDiv"

model.Param.IsExport=1;%exportmodelinlpformat

model.Param.ExpName='WindDiv';%nameoftheexportfileis"WindDiv"

n=model.decision(7,1,2,'#Turbine');%integerdecisionsastheno.ofturbines

Fun=square(P^(1/2)*(diag(sig)*n));%defineaquadraticexpressionbyfunction"square"

model.min(Fun);%defineobjectivefunction

MeanWind=50;%expectedtotalwindoutput

model.add(mu'*n==MeanWind);%add1stconstrainttomodel

model.add(sum(n)==40);%add2ndconstrainttomodel

model.add(n>=0);%boundofn

model.solve(1e-5)%solvetheproblem,MIPgapsettobe1e-5

Obj=model.get;%getoptimalobjective

N=n.get;%getoptimalsolutionofn

目标值是1265.67MW2,最优风电机组配置是n=(12,20,1,0,0,2,5)。

作为整数规划问题,我们可以利用第20行的函数solve将对偶间隙公差改为le-5。

这个参数,连同完整性容差变量,也可以通过给model.Param字段赋值来改变。

此外,通过将参数“IsExport”设置为“1”,将“lp”文件导出到当前目录,并具有用户指定的名称“WindDiv”。

如果没有指定导出的“lp”文件名称,则文件名与模型名相同。

通过调用函数model.showsparse,可以显示约束矩阵的稀性,如图2.3所示。

注意,XProg将所有问题推广到二阶锥规划中,因此在公式中引入一些中间变量,以便将二次约束转换为等效的二阶锥约束。

2.4.2随机规划实例

Xprog也能解决随机规划问题。

例2.4.3展示了如何利用MATLAB的单元阵列为不同场景创建决策变量和制定约束条件。

例2.4.3考虑参考文献[8]中讨论的家具制造问题。

一家家具公司生产桌子、桌子和椅子,分别卖60美元、40美元和10美元。

每种产品的制造需要木材和两种类型的熟练工人:

精加工和木工。

表2.2给出了每种资源的成本和制造每种家具所需的数量。

表2.2产品需求

一般

书桌

50

150

250

桌子

20

110

250

椅子

200

225

500

可能性

0.3

0.4

0.3

在这个例子中,每个产品的需求都是不确定的。

不确定的需求通过三种情况来表达:

低的、一般的和高的。

需求情景和相关概率的结果列于表2.3中。

表2.3家具的成本资源

资源

成本(元)

书桌

桌子

椅子

木工

5.2

2

1.5

0.5

精加工

4

4

2

1.5

木材

2

8

6

1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1