对于初学者而言,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]), ];
通过对比,是不是发现一些小技巧或者思考方式能够大幅提高编程效率,多掌握一种方法就会有多一种选择方式,在平时学习过程中要注意积累。
三、结果
能够看到洗衣机实现了此约束,完整程序可实现如下家庭能量管理调度,非常实用。
四、实例代码