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


相关文章
鲁棒优化入门(二)——基于matlab+yalmip求解鲁棒优化问题
鲁棒优化的含义就是在最恶劣的情况下(不确定变量的取值使目标函数最大),求出满足约束条件,并且能使目标函数最优的决策变量。 yalmip工具箱可以用来求解鲁棒优化问题,但还是有一定局限性的,并不能处理任意形式的不确定集下的鲁棒优化问题,一般来说,当鲁棒优化问题的不确定集合为箱型不确定集、椭球不确定集以及多面体不确定集时,都可以用yalmip工具箱求解(具体细节可参考官方文档)。本文介绍了利用yalmip求鲁棒优化问题的一般方法。......
|
8月前
|
关系型数据库
yalmip实用操作(1)
yalmip实用操作(1)
|
7月前
|
算法 Python
使用Python和Gurobi求解无约束优化问题
使用Python和Gurobi求解无约束优化问题
154 0
非线性优化 | 非线性问题matlab+yalmip求解案例
非线性优化 | 非线性问题matlab+yalmip求解案例
|
调度
动态规划及马尔可夫特性最佳调度策略(Matlab完整代码实现)
动态规划及马尔可夫特性最佳调度策略(Matlab完整代码实现)
126 0
lingo软件求解线性规划举例
lingo软件求解线性规划举例
162 0
【隐式动态求解】使用非线性纽马克方法的隐式动态求解研究(Matlab代码实现)
【隐式动态求解】使用非线性纽马克方法的隐式动态求解研究(Matlab代码实现)
|
存储 算法
PDE优化|逆问题中偏微分方程约束优化的惩罚方法(Matlab代码实现)
PDE优化|逆问题中偏微分方程约束优化的惩罚方法(Matlab代码实现)
229 0
|
存储 人工智能 索引
Yalmip入门教程(3)-约束条件的定义
Yalmip入门教程系列博客第三篇,约束条件的定义。
双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)
​上一篇博客介绍了双层优化的基本原理和使用KKT条件求解双层优化的方法,这篇博客将介绍使用yalmip的双层优化问题的求解方法。 1.KKT函数 通过调用yalmip工具箱中的KKT函数,可以直接求出优化问题的KKT条件,省去自己手动写的步骤。 2.solvebilevel函数 solvebilevel是yalmip工具箱内置的求解双层优化问题的函数。也就是通过这个函数,不需要咱手动写KKT条件,也不需要使用KKT函数,直接把上、下层优化的目标函数、约束条件往里面一放,就能求出结果。 ​