问题的提出:
假设现在有n个变量(n>=2),X1,X2,X3…Xn,一个目标参数Y
Y=f(X1,X2,X3…Xn),X(:)与Y之间的函数关系用神经网络模型来表示
现在我想用遗传算法对上述模型进行优化,使得X1,X2,X3,…Xn这n个变量适当组合使得Y为最大值。x1∈[a,b],x2∈[c,d],x3∈[e,f],…, Xn∈[z,p]
1. 自编程序怎么做,用二进制编码还是实数编码该怎么做
2. 采用遗传算法工具箱又该怎么做????????
现在假设n=3,x1∈[8.5,8.7],x2∈[0.1,0.2], x3∈[3,4],以下是自己试编的部分程序,调试出错,请高手指点!!!先谢谢啦!
P=[8.5 0.1 3.5
8.5 0.2 3.5
8.7 0.1 3.5
8.7 0.2 3.5
8.6 0.1 3
8.6 0.1 4
8.6 0.2 3
8.6 0.2 4
8.5 0.15 3
8.7 0.15 3
8.5 0.15 4
8.7 0.15 4
8.6 0.15 3.5
8.6 0.15 3.5
8.6 0.15 3.5];
T=[36.99
32.86
31.85
27.58
44.17
36.89
42.14
32.15
38.16
42.20
35.42
29.39
47.40
46.87
47.92];
P=P'
T=T'
1. BP神经网络的建立
% mybpnet.m
%BP神经网络的建立 ,命名为mybpnet.m
P %训练数据的输入
T %训练数据的输出
P=P';
T=T';
nntwarn off
[Pn,minP,maxP,Tn,minT,maxT]=premnmx(P,T);%归一化处理
%创建网络
net=newff(minmax(Pn),[12,1],{'tansig','purelin'},'trainlm'); %隐层数为12,网络结构为3-12-1
%设置训练参数
net.trainParam.show=50; %每50次显示一次
net.trainParam.lr=0.05; %学习速率
net.trainParam.epochs=1000; %最大训练次数
net.trainParam.goal=0.001; %精度
%训练网络
net=train(net,Pn,Tn); %网络训练
yn=sim(net,Pn) %仿真输出
y=postmnmx(yn,minT,maxT) %反归一化
save BPnet net %保存网络
2. 以BP神经网络模型为基础的适应度函数
% wxffun.m
%以BP神经网络模型为基础的适应度函数,保存为wxffun.m
function eval= wxffun (x)
P %训练数据的输入
T %训练数据的输出
P=P';
T=T';
nntwarn off
[Pn,minP,maxP,Tn,minT,maxT]=premnmx(P,T);%归一化处理
load BPnet %调用保存的网络
w1=net.iw{1,1} ; %显示输入层到隐层权值
w2=net.LW{2,1}; %隐层到输出层权值
b1=net.b{1,1}; %输出隐层的阈值
b2=net.b{2,1}; %输出层的阈值
x=x(:); %输入变量个数赋值
xn=tramnmx(x, minP,maxP) %输入变量的归一化
nntwarn off %解除警告
a1=tansig(netsum(w1*xn(:),b1)); %输入层到隐层的输出
nntwarn off %解除警告
evaln=purelin(netsum(w2*a1,b2)); %隐层到输出层的输出
eval =postmnmx(evaln,minT,maxT) % 反归一化
eval=-eval; %把最大化转化成最小化3. 遗传算法主程序
%mygabp.m
%遗传算法工具箱 gaotv5
%注意 matlab工具箱函数必须放在工作目录下
% x1∈[8.5,8.7],x2∈[0.1,0.2], x3∈[3,4]
LB=[8.5 0.1 3];
UB=[8.7 0.2 4];
bounds=[LB ;UB]'
initPop=initializega(popu, bounds,' wxffun '); %生成初始种群,大小为20
gen=100; %最大遗传代数
[x,endPop,bPop,trace]=ga(bounds,'wxffun',[],initPop,[1e-6 1 1],'maxGenTerm',100, ...
'normGeomSelect',[0.08],['arithXover'],[2],'nonUnifMutation',[2 gen 3]) %100次遗传迭代
figure(1)
plot(endPop(:, 1), endPop(:, 2),'y*')
figure(2)
plot(trace(:, 1), trace(:, 2), 'r-', trace(:, 1), trace(:, 3), 'b-')
xlabel('Generation');
ylabel('Fittness');
legend(‘解的变化’,’种群平均值的变化’)
运行出错:
??? Error using ==> wxffun
Too many input arguments.
Error in ==> initializega at 41
eval(estr);