在上一次的笔记中,我们编写了一个目标函数,大家可以看到这个目标函数的定义域(你不会不知道定义域吧,就是自变量的取值范围)没有任何的限制,在实际问题中,对自变量往往有很多的限制,比如,大于多少,小于多少等等,套用正规的江湖术语,称这些限制为“约束”。这一部分,就重点说一下“约束”的问题。约束被分成下面的4种类型:
1.边界约束。对自变量最大值与最小值的限制:X>=l 并且X<=u
2.线性不等式约束。Ax<=b,其中A为mXn的矩阵,x为nX1的矩阵,b为3X1的矩阵。描述了n个变量受到的m种不等式的限制。
3.线性等式约束。基本同2.
4.非线性约束。
还是具体看下面的例子吧,例子比较生动而且容易理解,呵呵。
一、边界约束
边界约束主要就是包含对一个变量上界与下界的限制,在优化函数中,你如果知道它的边界,将这些边界的约束包含在问题的描述中,那么你将会又快又精确的得到你需要的结果。
针对于一个矢量x,边界约束必须与矢量x的维数相同。比如,x=[x1,x2,x3,x4],其中X1等为标量,那么边界约束的长度也必须是4,比如下界的约束为L=[1,2,3,4],上界为U=[5,6,7,8],那么等同于下面的式子:
1<=x1<=5
2<=x2<=6
3<=x3<=7
4<=x4<=8
如果约束是
-
x3 ≥ 8
-
x2 ≤ 3
那么该如何表示呢?在Matlab中使用Inf代表正无穷,相应的-Inf表示负无穷。上下界的表示可以写为:L=[-Inf,-Inf,8,-Inf],上界U=[Inf,3,Inf,Inf].
二、线性不等式的约束
有下面的不等式
x1 + x3 ≤ 4,
2x2 – x3 ≥ –2,
x1 – x2 + x3 – x4 ≥ 9.
这里有4个标量组成的一个矢量x,写成Ax<=b形式的话,A就是一个3X4的矩阵,b为3X1的矩阵
A=[1 0 1 0; b=[4;
0 -2 1 0; 2;
-1 1 -1 1 ] -9]
x=[x1,x2,x3,x4]
Ax<=b
注意红色字体的数字与原来式子中的数字符号相反。
三、线性等式约束
基本同上面的线性不等式约束,唯一不同的是把A变成了Aeq,b变成了beq。在这里就不赘述了。
四、非线性约束
非线性不等式约束的形式如c(x)<=0,非线性等式约束的形式如ceq(x)=0;对于非线性约束的表示一般使用函数的方式,就像c(x)<=0与ceq(x)=0那样。
下面的一点比较重要,非线性约束的函数必须返回两个组成部分,一个是不等式约束,另一个是等式约束,尽管它们可能不是同时能够存在,如果其中的一个不存在,那么就返回[ ]。
假设有下列的不等式约束
把这个约束写成函数的M文件形式如下:
function [c,ceq]=ellipseparabola(x)
% Inside the ellipse bounded by (-3<x<3),(-2<y<2)
% Above the line y=x^2-1
c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1;%不等式约束1
c(2) = x(1)^2 - x(2) - 1;%不等式约束2
ceq = [];%等式约束,为空
end
ellipseparabola 返回了一个[ ]作为非线性等式约束的结果。同时两个不等式约束都是 ≤ 0的形式。
如果你提供了c与ceq的梯度信息,也许算法会运行的更快,给你更多可信的结果。下面就是包含了梯度信息的约束函数的写法例子。
function [c,ceq,gradc,gradceq]=ellipseparabola(x)
% Inside the ellipse bounded by (-3<x<3),(-2<y<2)
% Above the line y=x^2-1
c(1) = x(1)^2/9 + x(2)^2/4 - 1;
c(2) = x(1)^2 - x(2) - 1;
ceq = [];
if nargout > 2
gradc = [2*x(1)/9, 2*x(1);…
x(2)/2, -1];
gradceq = [];
end
附注:本文为转载文章
原文出处:http://blog.csdn.net/niuyongjie/article/details/4863979
原作者:niuyongjie