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

简介: 本文主要参考RSOME工具箱的用户手册《Users Guide for RSOME》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的属性,还是挺多的。
image.png

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', '电压')

看看决策变量的属性:
image.png

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)

例如,下面的代码就是以$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中模糊集的通用形式如下:
image.png

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模糊集表示为:
image.png

式中,S是样本数量,是Wasserstein球半径,为场景s下需求的估计值,表示两者之间的Wasserstein距离,通过引入一个中间变量,可以把模糊集改写为如下形式:
image.png

则该问题的分布式鲁棒优化模型可以表示为:
image.png

取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)])

运行结果如下:
image.png

相关文章
|
数据可视化 决策智能 Python
三种常用的风险价值(VaR)计算方法总结
风险价值(VaR)是金融领域广泛使用的风险度量,它量化了在特定时间范围内和给定置信度水平下投资或投资组合的潜在损失。它提供了一个单一的数字,代表投资者在正常市场条件下可能经历的最大损失。VaR是风险管理、投资组合优化和法规遵从的重要工具。
1808 0
鲁棒优化入门(二)——基于matlab+yalmip求解鲁棒优化问题
鲁棒优化的含义就是在最恶劣的情况下(不确定变量的取值使目标函数最大),求出满足约束条件,并且能使目标函数最优的决策变量。 yalmip工具箱可以用来求解鲁棒优化问题,但还是有一定局限性的,并不能处理任意形式的不确定集下的鲁棒优化问题,一般来说,当鲁棒优化问题的不确定集合为箱型不确定集、椭球不确定集以及多面体不确定集时,都可以用yalmip工具箱求解(具体细节可参考官方文档)。本文介绍了利用yalmip求鲁棒优化问题的一般方法。......
|
供应链 Python
|
算法 调度
电网两阶段鲁棒优化调度模型(含matlab程序)
电网两阶段鲁棒优化调度模型(含matlab程序)
|
机器学习/深度学习 算法 调度
深度学习|改进两阶段鲁棒优化算法i-ccg
深度学习|改进两阶段鲁棒优化算法i-ccg
【分布鲁棒】多源动态最优潮流的分布鲁棒优化方法
【分布鲁棒】多源动态最优潮流的分布鲁棒优化方法
|
编译器 C++ 数据格式
鲁棒优化入门(一)——工具箱Xprog和RSOME的安装与使用
Xprog是由新加坡国立大学的Peng Xiong于2016年发布的一款matlab工具箱,可以用于求解确定性优化、随机优化、鲁棒优化和分布式鲁棒优化问题。 还有一个针对鲁棒随机优化设计的matlab工具箱——RSOME(Robust Stochastic Optimization Made Easy),也可以用来解决一般的线性规划、随机规划、鲁棒优化和数据驱动的分布式鲁棒优化问题。...............
|
存储 算法 调度
Matlab+Yalmip两阶段鲁棒优化通用编程指南
主要包含8大内容: ①.拿到一个复杂的两阶段鲁棒优化问题的分析步骤和方法。 ②.采用Yalmip工具箱中的uncertain函数和鲁棒优化模块求解两阶段鲁棒优化的子问题。 ③.Yalmip工具箱中的鲁棒优化模块和常规的求解思路有什么异同。 ④.使用KKT条件求解两阶段鲁棒优化的子问题。 ⑤.使用对偶变换求解两阶段鲁棒优化的子问题。 ⑥.采用Yalmip工具箱的内置函数,将线性约束写成紧凑矩阵形式的方法。 ⑦.矩阵形式的两阶段鲁棒优化问题,如何快速写出子问题内层优化的KKT条件。 ⑧.矩阵形式的两阶段鲁棒优化问题,如何快速写出子问题内层优化的对偶问题。
|
机器学习/深度学习 算法 API
性能世界第二的半定规划SDP是什么?怎么用?此文全面解答
半定规划作为作为重要的优化建模工具被广泛应用于机器学习、信号处理、计算机视觉、以及量子计算等领域。MindOpt新版本V0.23.0中新增了半定规划SDP求解器,测评成绩世界第二。
性能世界第二的半定规划SDP是什么?怎么用?此文全面解答