﻿功能:非线性规划求解(采用罚函数算法+粒子群算法求解)

格式:
[Minf,xv,er]=nlinProgPSO(f,c,x,x0,N,L,Max,Min,p)
[Minf,xv,er]=nlinProgPSO(f,c,x,x0,N,L,Max,Min)
[Minf,xv,er]=nlinProgPSO(f,c,x,x0,N,L,Max)
[Minf,xv,er]=nlinProgPSO(f,c,x,x0,N,L)
[Minf,xv,er]=nlinProgPSO(f,c,x,x0,N)
[Minf,xv,er]=nlinProgPSO(f,c,x,x0)
[Minf,xv,er]=nlinProgPSO(f,c,x)

f:符号变量存储的目标函数表达式(注意求最小值)
c:符号变量存储的条件表达式,其中每个条件以逗号分隔,条件里运行出现">、<、="三种符号,注意仅支持单一条件,如 "sin(x)>0.1"但不支持"0.5>sin(x)>0.1"这种形式,如果没有任何一种比较符号,则表示等式大于等于0
x:符号变量存储的变量名称,每个名称以逗号分隔
x0:矩阵变量或者数值变量,表示对应x的初始值
N:表示初始细胞数,默认200
L:总循环次数,默认3000
Max:数值或者矩阵变量,对应x变量的上限值,默认1000
Min:数值或者矩阵变量,对应x变量的下限值,默认-1000
p:一个控制条件与目标函数权重变量,默认1000,其具体意义参看原理

Minf:本程序返回的目标最小值
xv:返回对应目标最小值时x的值
er:一个反应条件c误差的变量,此值越接近0表示越满足条件,越大表示离条件越远. er为0表示此解一定是可行解。

原理:

1、令 F1(x)=目标函数值, F2(x)=c变量不满足条件差值的平方和//例如条件为 x1*sin(x2)-4≥0,则 y=x1*sin(x2)-4 ，那么当y<0时此值就把y^2加入到F2中,

2、令 G(x)=F1(x) + p*F2(x)

3、调用粒子群算法对G(x)函数进行最小值寻优。粒子群算法调用{nlinSolve2<矩阵运算\nlinSolve2>}函数进行求解

说明:

1、因为在原理第2点已经说明p参数的重要性,p越大说明越在乎对限制条件的满足,p越小对限制条件放得越宽松

2、本函数求解效果感觉不是很理想,特别是求解维数比较大时更是如此。遇到这类问题,建议根据求解目标函数以及限制条件的特点,自行编写算法。其求解思想可参照{一种分支界定的0-1整数规划算法<http://blog.163.com/shikang999@126/blog/static/1726248962014102913432613/>}

3、如果结果不理想,可尝试混合整数非线性规划函数{nlinProgIntGA<矩阵运算\nlinProgIntGA>}、{nlinProgIntPSO<矩阵运算\nlinProgIntPSO>}

例子:

//已知x1+x2≥1,求(x1+1)^2+x2^2的最小值

f="(x1+1)^2+x2^2";g="x1+x2>=1";x="x1,x2";[a,b,er]=nlinProgPSO(f,g,x)//回车得到如下结果，最理想结果为x1=0,x2=1,Minf=2
a =
[ 1.99856294070169 ]
b =
[-0.01786319047276    1.01684326622806 ]
er =
[ 0.00104024546492 ]