当前位置:   article > 正文

鲁棒优化入门(3)—鲁棒优化工具箱RSOME快速上手与应用实例

rsome

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)
  • 1
  • 2
  • 3
  • 4
  • 5

例如,下面的代码就是新建一个名为"test"的RSOME模型:

model = rsome('test')
  • 1

看一下model的属性,还是挺多的。
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

例如,下面的代码就是新建一个名为"电压",2行24列的连续型决策矩阵V:

V = model.decision(2, 24, 'C', '电压')
  • 1

看看决策变量的属性:
决策变量的属性

3.min/max函数

cplex等求解器默认求min,求max只能加个负号,rsome中可以直接表示目标函数是max还是min,这一点确实方便一些。
基本用法如下:

% 求目标函数function的最小值
model.min(function)

% 求目标函数function的最大值
model.max(function) 
  • 1
  • 2
  • 3
  • 4
  • 5

例如,下面的代码就是将目标函数设为求f(V)=V的最大值。

model.max(V) 
  • 1

4.set函数

set函数用于定义决策变量的可行域,基本用法如下:

% 用约束条件1,约束条件2···规定决策变量的可行域
model.set(constraint1, constraint2, ...)
  • 1
  • 2

例如,下面的代码就是将m定义为V≤1表示的可行域:

m=model.set(V<=1)
  • 1

5. append函数

append函数用于给模型添加约束条件:

% 将约束条件constraint添加到模型中
model.append(constraint) 

% 将决策变量的可行域添加到模型中
model.append(set)
  • 1
  • 2
  • 3
  • 4
  • 5

例如,下面的代码就是将给模型新增一个约束条件V≥1:

model.append(V>=1) 
  • 1

6.solve函数

solve函数用于求解RSOME模型,基本用法如下:

% 采用默认设置求解模型
model.solve

% 采用指定的间隙mipGap求解模型
model.solve(mipGap)
  • 1
  • 2
  • 3
  • 4
  • 5

例如,下面的代码就是以 1 0 − 4 10^{-4} 104的间隙求解RSOME模型:

model.solve(1e-4)
  • 1

7.get函数

求解模型之后,可以用get函数获取目标函数的取值或决策变量的取值,基本用法如下:

% 获取模型目标函数的取值
model.get
% 获取决策变量x的取值
x.get
  • 1
  • 2
  • 3
  • 4

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

9.模型的参数设置

model.Param用于设置模型的参数,基本用法如下:

设置方法默认值功能描述
model.Param.solver‘cplex’‘cplex’–求解器采用cplex
‘gurobi’–求解器采用gurobi
model.Param.display00–不显示求解过程
1–显示求解过程
model.Param.mipgap1e-4设置求解间隙
% 设置求解器为gurobi
model.Param.solver = 'gurobi'; 

% 设置求解器为cplex
model.Param.solver = 'cplex';

%显示求解过程
model.Param.display = 1;

%不显示求解过程
model.Param.display = 0;

%设置求解间隙
model.Param.mipgap = 1e-5;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

二、不确定集的相关语法

鲁棒优化最重要的特点就是参数具有不确定性,因此不确定集的建立也是相当重要的。
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.ambiguity函数

ambiguity函数用于创建一个模糊集,基本用法如下:

% 创建只有一个场景的模糊集P
P = model.ambiguity

% 创建有S个场景的模糊集P
P = model.ambiguity(S)
  • 1
  • 2
  • 3
  • 4
  • 5

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, ...)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4.expect函数

expect函数用于求随机变量的期望,基本用法如下:

% 求随机变量z的期望ez
ez = expect(z)
  • 1
  • 2

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, ...)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6.prob函数

prob函数用于求模糊集场景的概率,基本用法如下:

% 求模糊集P中所有场景的概率,用列向量的形式存储
probability=P.prob
  • 1
  • 2

7.probset函数

probset函数用于定义场景概率的不确定集,基本用法如下:

% 令模糊集P中所有场景概率满足set描述的可行域
P.suppset(set)

% 令模糊集P中所有场景概率满足约束条件1,约束条件2,···
P(s).suppset(constraint1, constraint2, ...)
  • 1
  • 2
  • 3
  • 4
  • 5

8.with函数

with函数用于给模型选择模糊集,基本用法如下:

% 选择模糊集P作为模型的不确定集
model.with(P)
  • 1
  • 2

三.一个实例


考虑一个单产品的报童问题,报童问题是一个典型的存贮问题,也可以用分布式鲁棒优化模型来表示。假设p为一份报纸的售价,c为一份报纸的成本,w为决策变量,表示报童订购的报纸数,为用户的不确定性需求,。是一个随机变量,服从于概率分布,即,概率分布包含于模糊集,也就是。用Wasserstein模糊集表示为:
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)])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

运行结果如下:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/400424
推荐阅读
相关标签
  

闽ICP备14008679号