yalmip实用操作(2)

简介: yalmip实用操作(2)

对于初学者而言,yalmip语言上手比较容易,深入比较难,有一些简单的约束条件处理对于我们处理实际模型问题有很大助益,跟大家分享一个如何生成n个元素连续的约束以及绝对值约束表达,在实际模型中,比如家庭能量管理里面洗衣机最小工作时间为1.5个小时,如果模型以0.5小时作为时间间隔,那么就需要连续3个时间段均处于工作状态。


一、简单示例

按照上面的例子,如果一天时间按照0.5小时作为时间间隔,那么24小时存在变量数量就是48个,如果约束洗衣机在0:00-8:00之间电价谷期自动运行1.5小时,实现自动能量管理和家庭用电成本最小。具体代码如下:

    %洗衣机约束条件
    C = [C,sum(x_wm) == 3,sum(x_wm(1,1:16)) == 3];
    C = [C,sum(y_wm) == 1,sum(y_wm(1,1:15)) == 1];
    for i = 1:n
        if i ==1
            x_wm(1,i) = y_wm(1,i);
        elseif i == 2
            x_wm(1,i) = y_wm(1,i-1) + y_wm(1,i);
        else
            x_wm(1,i) = y_wm(1,i-2) + y_wm(1,i-1) + y_wm(1,i);
        end
    end

对于绝对值的约束表达,可以直接采用abs命令。

如在家庭能量管理中空调调节温度和室外温度存在热交换,可以采用下述约束方式:

    %空调约束条件
    for i = 1:n
        C = [C,25<=t_ac(1,i)<=27];
        if i == 1
            C = [C,abs(((t_ac(1,i)-27*exp(-0.5/(0.57*6)))/(1-exp(-0.5/(0.57*6)))-Tem_Out(1,i))/(2.9*6))<=2];
        else
            C = [C,abs(((t_ac(1,i)-t_ac(1,i-1)*exp(-0.5/(0.57*6)))/(1-exp(-0.5/(0.57*6)))-Tem_Out(1,i))/(2.9*6))<=2];
        end
    end

二、具体分析

上面的洗衣机约束代码中x_wm/y_wm是0-1变量,实现方式就是增加了另一个变量y_wm限定值为1,而x_wm则是三个相邻y_wm之和,然后限定x_wm之和为3,那么就保证了运转时间是连续的。

其实该约束也可以通过implies来实现,大家可以思考一下,可以通过下面的程序代码进行实现。

dd = binvar(14,1);
C=[C,sum(dd)==1,
    implies(dd(1),[x_wm(1)==1,x_wm(2)==1,x_wm(3)==1]),
    implies(dd(2),[x_wm(2)==1,x_wm(3)==1,x_wm(4)==1]),
    implies(dd(3),[x_wm(3)==1,x_wm(4)==1,x_wm(5)==1]),
    implies(dd(4),[x_wm(4)==1,x_wm(5)==1,x_wm(6)==1]),
    implies(dd(5),[x_wm(5)==1,x_wm(6)==1,x_wm(7)==1]),
    implies(dd(6),[x_wm(6)==1,x_wm(7)==1,x_wm(8)==1]),
    implies(dd(7),[x_wm(7)==1,x_wm(8)==1,x_wm(9)==1]),
    implies(dd(8),[x_wm(8)==1,x_wm(9)==1,x_wm(10)==1]),
    implies(dd(9),[x_wm(9)==1,x_wm(10)==1,x_wm(11)==1]),
    implies(dd(10),[x_wm(10)==1,x_wm(11)==1,x_wm(12)==1]),
    implies(dd(11),[x_wm(11)==1,x_wm(12)==1,x_wm(13)==1]),
    implies(dd(12),[x_wm(12)==1,x_wm(13)==1,x_wm(14)==1]),
    implies(dd(13),[x_wm(13)==1,x_wm(14)==1,x_wm(15)==1]),
    implies(dd(14),[x_wm(14)==1,x_wm(15)==1,x_wm(16)==1]), 
    ];

通过对比,是不是发现一些小技巧或者思考方式能够大幅提高编程效率,多掌握一种方法就会有多一种选择方式,在平时学习过程中要注意积累。

三、结果

能够看到洗衣机实现了此约束,完整程序可实现如下家庭能量管理调度,非常实用。

四、实例代码

image.png


相关文章
|
4天前
|
关系型数据库
yalmip实用操作(1)
yalmip实用操作(1)
非线性优化 | 非线性问题matlab+yalmip求解案例
非线性优化 | 非线性问题matlab+yalmip求解案例
|
10月前
|
调度
动态规划及马尔可夫特性最佳调度策略(Matlab完整代码实现)
动态规划及马尔可夫特性最佳调度策略(Matlab完整代码实现)
|
5月前
lingo软件求解线性规划举例
lingo软件求解线性规划举例
|
9月前
|
存储 算法 调度
Matlab+Yalmip两阶段鲁棒优化通用编程指南
主要包含8大内容: ①.拿到一个复杂的两阶段鲁棒优化问题的分析步骤和方法。 ②.采用Yalmip工具箱中的uncertain函数和鲁棒优化模块求解两阶段鲁棒优化的子问题。 ③.Yalmip工具箱中的鲁棒优化模块和常规的求解思路有什么异同。 ④.使用KKT条件求解两阶段鲁棒优化的子问题。 ⑤.使用对偶变换求解两阶段鲁棒优化的子问题。 ⑥.采用Yalmip工具箱的内置函数,将线性约束写成紧凑矩阵形式的方法。 ⑦.矩阵形式的两阶段鲁棒优化问题,如何快速写出子问题内层优化的KKT条件。 ⑧.矩阵形式的两阶段鲁棒优化问题,如何快速写出子问题内层优化的对偶问题。
|
9月前
|
机器学习/深度学习 资源调度 数据建模
Matlab+Yalmip求解鲁棒优化编程实战
去年发布了使用Yalmip工具箱求解鲁棒优化问题的博客之后,陆陆续续有朋友问我相关的问题,有人形容从学习这篇博客到求解论文中的鲁棒优化问题,就好像刚学会求导公式,就要去做高考压轴题,根本无从下手。为了解决这个问题,这篇博客将手把手地教会大家如何使用Matlab+ yalmip+cplex(当然其他的求解器比如gurobi也是可以的)求解论文中的鲁棒优化问题。
|
10月前
|
存储
双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)
​上一篇博客介绍了双层优化的基本原理和使用KKT条件求解双层优化的方法,这篇博客将介绍使用yalmip的双层优化问题的求解方法。 1.KKT函数 通过调用yalmip工具箱中的KKT函数,可以直接求出优化问题的KKT条件,省去自己手动写的步骤。 2.solvebilevel函数 solvebilevel是yalmip工具箱内置的求解双层优化问题的函数。也就是通过这个函数,不需要咱手动写KKT条件,也不需要使用KKT函数,直接把上、下层优化的目标函数、约束条件往里面一放,就能求出结果。 ​
基于MATLAB的麻雀搜索算法SSA代码解释(对照论文公式)
基于MATLAB的麻雀搜索算法SSA代码解释(对照论文公式)
|
11月前
|
算法 Java
数学建模常用算法:粒子群算法(PSO)求解二元函数最小值+限定x,y范围测试【java实现--详细注释+Matlab绘制粒子群飞行过程】
数学建模常用算法:粒子群算法(PSO)求解二元函数最小值+限定x,y范围测试【java实现--详细注释+Matlab绘制粒子群飞行过程】
152 0
|
11月前
|
算法 Java
数学建模常用算法:人工鱼群算法(AFAS)求解二元函数最小值+限定x,y范围测试【java实现--详细注释+Matlab绘制小鱼游动过程】
数学建模常用算法:人工鱼群算法(AFAS)求解二元函数最小值+限定x,y范围测试【java实现--详细注释+Matlab绘制小鱼游动过程】
116 0