草庐IT

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

配电网和matlab 2024-02-19 原文

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} 104的间隙求解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.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;

二、不确定集的相关语法

鲁棒优化最重要的特点就是参数具有不确定性,因此不确定集的建立也是相当重要的。
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)])

运行结果如下:

有关鲁棒优化入门(三)——鲁棒优化工具箱RSOME快速上手与应用实例的更多相关文章

  1. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  2. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  3. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  4. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  5. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

随机推荐