赞
踩
RSOME1.2安装包:鲁棒优化工具箱Xprog和RSOME
RSOME安装和基本使用方法:鲁棒优化入门(一)——工具箱Xprog和RSOME的安装与使用
rsome函数用于创建一个RSOME模型,基本用法如下:
% 创建一个默认名称为“untitled”的RSOME模型。
model = rsome
% 创建一个名为“modelName”的RSOME模型。
model = rsome(modelName)
例如,下面的代码就是新建一个名为"test"的RSOME模型:
model = rsome('test')
看一下model的属性,还是挺多的。
decision函数用于定义决策变量(variables),基本用法如下:
% 定义一个连续型决策变量x x = model.decision % 定义N维连续型列向量x x = model.decision(N) % 定义N行M列的连续型决策矩阵x x = model.decision(N,M) % 定义N行M列的决策矩阵x % type='C'表示连续变量,type='B'表示二进制变量,type='I'表示整数变量 x = model.decision(N,M,type) % 定义N行M列的决策矩阵x % type='C'表示连续变量,type='B'表示二进制变量,type='I'表示整数变量 % name表示决策变量名称 x = model.decision(N, M, type, name)
例如,下面的代码就是新建一个名为"电压",2行24列的连续型决策矩阵V:
V = model.decision(2, 24, 'C', '电压')
看看决策变量的属性:
cplex等求解器默认求min,求max只能加个负号,rsome中可以直接表示目标函数是max还是min,这一点确实方便一些。
基本用法如下:
% 求目标函数function的最小值
model.min(function)
% 求目标函数function的最大值
model.max(function)
例如,下面的代码就是将目标函数设为求f(V)=V的最大值。
model.max(V)
set函数用于定义决策变量的可行域,基本用法如下:
% 用约束条件1,约束条件2···规定决策变量的可行域
model.set(constraint1, constraint2, ...)
例如,下面的代码就是将m定义为V≤1表示的可行域:
m=model.set(V<=1)
append函数用于给模型添加约束条件:
% 将约束条件constraint添加到模型中
model.append(constraint)
% 将决策变量的可行域添加到模型中
model.append(set)
例如,下面的代码就是将给模型新增一个约束条件V≥1:
model.append(V>=1)
solve函数用于求解RSOME模型,基本用法如下:
% 采用默认设置求解模型
model.solve
% 采用指定的间隙mipGap求解模型
model.solve(mipGap)
例如,下面的代码就是以 1 0 − 4 10^{-4} 10−4的间隙求解RSOME模型:
model.solve(1e-4)
求解模型之后,可以用get函数获取目标函数的取值或决策变量的取值,基本用法如下:
% 获取模型目标函数的取值
model.get
% 获取决策变量x的取值
x.get
除了一些基本的线性运算,rsome中还提供了一些决策变量常用的凸函数,可以用来描述非线性约束,具体如下:
% abs函数:决策变量x的绝对值 abs(x) % norm函数:决策变量x的范数 norm(x,1) % 1范数 norm(x,2) 或norm(x,2)% 2范数 norm(x,inf) % ∞范数 % .^2:按元素求平方 x.^2 % sumsqr函数:求元素的平方和,只能用于向量不能用于矩阵 sumsqr(x) % maxfun/minfun:求最大值/最小值,只能用于元胞数组 maxfun(exprCell) minfun(exprCell)
model.Param用于设置模型的参数,基本用法如下:
设置方法 | 默认值 | 功能描述 |
---|---|---|
model.Param.solver | ‘cplex’ | ‘cplex’–求解器采用cplex ‘gurobi’–求解器采用gurobi |
model.Param.display | 0 | 0–不显示求解过程 1–显示求解过程 |
model.Param.mipgap | 1e-4 | 设置求解间隙 |
% 设置求解器为gurobi
model.Param.solver = 'gurobi';
% 设置求解器为cplex
model.Param.solver = 'cplex';
%显示求解过程
model.Param.display = 1;
%不显示求解过程
model.Param.display = 0;
%设置求解间隙
model.Param.mipgap = 1e-5;
鲁棒优化最重要的特点就是参数具有不确定性,因此不确定集的建立也是相当重要的。
RSOME中模糊集的通用形式如下:
RSOME工具箱中提供了用matlab代码表示该模糊集的功能,一些基本的用法如下:
random函数用于创建不确定变量,基本用法如下:
% 定义一个不确定变量z
z = model.random
% 定义N维不确定向量z
z = model.random(N)
% 定义N行M列的不确定变量矩阵z
z = model.random(N,M)
% 定义N行M列的不确定变量矩阵z
% name表示不确定变量名称
z = model.random(N,M,name)
ambiguity函数用于创建一个模糊集,基本用法如下:
% 创建只有一个场景的模糊集P
P = model.ambiguity
% 创建有S个场景的模糊集P
P = model.ambiguity(S)
suppset函数用于定义模糊集场景的可行域,基本用法如下:
% 令模糊集P中所有场景都满足set描述的可行域
P.suppset(set)
% 令模糊集P中第s个场景满足set描述的可行域
P(s).suppset(set)
% 令模糊集P中所有场景都满足约束条件1,约束条件2,···
P.suppset(constraint1, constraint2, ...)
% 令模糊集P中第s个场景满足约束条件1,约束条件2,···
P(s).suppset(constraint1, constraint2, ...)
expect函数用于求随机变量的期望,基本用法如下:
% 求随机变量z的期望ez
ez = expect(z)
exptset函数用于定义随机变量期望的可行域,基本用法如下:
% 令模糊集P中所有场景下随机变量的期望都满足set描述的可行域
P.suppset(set)
% 令模糊集P中第s个场景中随机变量的期望满足set描述的可行域
P(s).suppset(set)
% 令模糊集P中所有场景下随机变量的期望都满足约束条件1,约束条件2,···
P.suppset(constraint1, constraint2, ...)
% 令模糊集P中第s个场景中随机变量的期望满足约束条件1,约束条件2,···
P(s).suppset(constraint1, constraint2, ...)
prob函数用于求模糊集场景的概率,基本用法如下:
% 求模糊集P中所有场景的概率,用列向量的形式存储
probability=P.prob
probset函数用于定义场景概率的不确定集,基本用法如下:
% 令模糊集P中所有场景概率满足set描述的可行域
P.suppset(set)
% 令模糊集P中所有场景概率满足约束条件1,约束条件2,···
P(s).suppset(constraint1, constraint2, ...)
with函数用于给模型选择模糊集,基本用法如下:
% 选择模糊集P作为模型的不确定集
model.with(P)
考虑一个单产品的报童问题,报童问题是一个典型的存贮问题,也可以用分布式鲁棒优化模型来表示。假设p为一份报纸的售价,c为一份报纸的成本,w为决策变量,表示报童订购的报纸数,为用户的不确定性需求,。是一个随机变量,服从于概率分布,即,概率分布包含于模糊集,也就是。用Wasserstein模糊集表示为:
式中,S是样本数量,是Wasserstein球半径,为场景s下需求的估计值,表示两者之间的Wasserstein距离,通过引入一个中间变量,可以把模糊集改写为如下形式:
则该问题的分布式鲁棒优化模型可以表示为:
取p=1.5,c=1,=100,S=500,=0.01,则该鲁棒优化问题可以用matlab代码表示为:
%% 参数 Ubar = 100; % 不确定需求的上限 S = 500; % 样本数 Uhat = Ubar * rand(1, S); % 需求的经验分布 p = 1.5; % 一份报纸的售价 c = 1.0; % 一份报纸的成本 theta = Ubar*0.01; % Wasserstein球半径 %% Create a RSOME model model = rsome('newsvendor'); % 创建一个名为"newsvendor"的rsome模型 %% Random variables and a type-1 Wasserstein ambiguity set u = model.random; % 不确定的需求变量u v = model.random; % 中间变量v P = model.ambiguity(S); % 创建具有S个场景的模糊集 for n = 1:S P(n).suppset(0 <= u, u <= Ubar, ... norm(u-Uhat(n)) <= v );% 定义每个场景的支持集 end P.exptset(expect(v) <= theta); prob = P.prob; % 所有场景的概率分布函数 P.probset(prob == 1/S); % 每个场景的概率 model.with(P); % 将P定义为模型的不确定集 %% 决策变量 w = model.decision; % 决策变量w %% 目标函数 loss = maxfun({p*(w-u), 0}); % 未售出部分造成的损失 model.max((p-c)*w - expect(loss)); % 分布式鲁棒优化的目标函数 %% 约束条件 model.append(w >= 0); % w的取值范围 %% 求解问题 model.solve; % 求解模型 %% 结果 obj=model.get; % 目标函数取值 W=w.get; % 决策变量取值 disp(['目标函数取值:',num2str(obj),',决策变量取值:',num2str(W)])
运行结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。