RSOME1.2安装包:鲁棒优化工具箱Xprog和RSOME
RSOME安装和基本使用方法:鲁棒优化入门(一)——工具箱Xprog和RSOME的安装与使用
目录
本文主要参考RSOME工具箱的用户手册《Users Guide for RSOME》
RSOME的用户手册并不是很长,但一些地方可能不是特别好理解,在这里我主要是通过写博客分享一下我的使用方法,和大家一起学习,也能加深自己的理解。
一、model相关语法
1.rsome函数
rsome函数用于创建一个RSOME模型,基本用法如下:
% 创建一个默认名称为“untitled”的RSOME模型。
model = rsome
% 创建一个名为“modelName”的RSOME模型。
model = rsome(modelName)
例如,下面的代码就是新建一个名为"test"的RSOME模型:
model = rsome('test')
看一下model的属性,还是挺多的。
2.decision函数
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', '电压')
看看决策变量的属性:
3.min/max函数
cplex等求解器默认求min,求max只能加个负号,rsome中可以直接表示目标函数是max还是min,这一点确实方便一些。
基本用法如下:
% 求目标函数function的最小值
model.min(function)
% 求目标函数function的最大值
model.max(function)
例如,下面的代码就是将目标函数设为求f(V)=V的最大值。
model.max(V)
4.set函数
set函数用于定义决策变量的可行域,基本用法如下:
% 用约束条件1,约束条件2···规定决策变量的可行域
model.set(constraint1, constraint2, ...)
例如,下面的代码就是将m定义为V≤1表示的可行域:
m=model.set(V<=1)
5. append函数
append函数用于给模型添加约束条件:
% 将约束条件constraint添加到模型中
model.append(constraint)
% 将决策变量的可行域添加到模型中
model.append(set)
例如,下面的代码就是将给模型新增一个约束条件V≥1:
model.append(V>=1)
6.solve函数
solve函数用于求解RSOME模型,基本用法如下:
% 采用默认设置求解模型
model.solve
% 采用指定的间隙mipGap求解模型
model.solve(mipGap)
例如,下面的代码就是以 1 0 − 4 10^{-4} 10−4的间隙求解RSOME模型:
model.solve(1e-4)
7.get函数
求解模型之后,可以用get函数获取目标函数的取值或决策变量的取值,基本用法如下:
% 获取模型目标函数的取值
model.get
% 获取决策变量x的取值
x.get
8.决策变量的运算函数
除了一些基本的线性运算,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)
9.模型的参数设置
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代码表示该模糊集的功能,一些基本的用法如下:
1.random函数
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)
2.ambiguity函数
ambiguity函数用于创建一个模糊集,基本用法如下:
% 创建只有一个场景的模糊集P
P = model.ambiguity
% 创建有S个场景的模糊集P
P = model.ambiguity(S)
3.suppset函数
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, ...)
4.expect函数
expect函数用于求随机变量的期望,基本用法如下:
% 求随机变量z的期望ez
ez = expect(z)
5.exptset函数
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, ...)
6.prob函数
prob函数用于求模糊集场景的概率,基本用法如下:
% 求模糊集P中所有场景的概率,用列向量的形式存储
probability=P.prob
7.probset函数
probset函数用于定义场景概率的不确定集,基本用法如下:
% 令模糊集P中所有场景概率满足set描述的可行域
P.suppset(set)
% 令模糊集P中所有场景概率满足约束条件1,约束条件2,···
P(s).suppset(constraint1, constraint2, ...)
8.with函数
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)])
运行结果如下: