福州大学人工智能作业Word格式.docx
《福州大学人工智能作业Word格式.docx》由会员分享,可在线阅读,更多相关《福州大学人工智能作业Word格式.docx(37页珍藏版)》请在冰点文库上搜索。
pH_1_FE2=((LN2*oH_1)/(1+LN2*oH_1));
ifC1==1%初始证据CP公式
S1=input('
请输入E1的可信度:
ifS1>
pH_1_S1=(pH_1+(pH_1_E1-pH_1)/5*S1);
else
pH_1_S1=(pH_1_FE1+(pH_1-pH_1_FE1)*(S1/5+1));
end
else%中间结论EH公式
pE1=input('
请输入E1的先验概率:
pE1_S1=input('
请输入E1的后验概率:
ifpE1_S1>
=pE1
pH_1_S1=(pH_1+(pH_1_E1-pH_1)/(1-pE1)*(pE1_S1-pE1));
pH_1_S1=(pH_1_FE1+(pH_1-pH_1_FE1)/(pE1)*(pE1_S1));
end
ifC2==1
S2=input('
请输入E2的可信度:
ifS2>
pH_1_S2=(pH_1+(pH_1_E2-pH_1)/5*S2);
pH_1_S2=(pH_1_FE2+(pH_1-pH_1_FE2)*(S2/5+1));
else
pE2=input('
请输入E2的先验概率:
pE2_S2=input('
请输入E2的后验概率:
ifpE2_S2>
=pE2
pH_1_S2=(pH_1+(pH_1_E2-pH_1)/(1-pE2)*(pE2_S2-pE2));
pH_1_S2=(pH_1_FE2+(pH_1-pH_1_FE2)/(pE2)*(pE2_S2));
oH_1_S1=((pH_1_S1)/(1-pH_1_S1));
oH_1_S2=((pH_1_S2)/(1-pH_1_S2));
oH_2=((oH_1_S1/oH_1)*(oH_1_S2/oH_1)*oH_1);
pH_2=(oH_2/(1+oH_2));
fprintf('
H的先验几率=%f\n'
oH_1)
H的先验概率=%f\n'
pH_1)
H的后验几率=%f\n'
oH_2)
H的后验概率=%f\n'
pH_2)
elseifU==0%更新算法¨
ifC1==1
pH_1_S1_E2=((LS2*oH_1_S1)/(1+LS2*oH_1_S1));
pH_1_S1_FE2=((LN2*oH_1_S1)/(1+LN2*oH_1_S1));
pH_1_S1S2=(pH_1_S1+(pH_1_S1_E2-pH_1_S1)/5*S2);
pH_1_S1S2=(pH_1_S1_FE2+(pH_1_S1-pH_1_S1_FE2)*(S2/5+1));
pH_1_S1S2=(pH_1_S1+(pH_1_S1_E2-pH_1_S1)/(1-pE2)*(pE2_S2-pE2));
pH_1_S1S2=(pH_1_S1_FE2+(pH_1_S1-pH_1_S1_FE2)/(pE2)*(pE2_S2));
oH_1_S1S2=((pH_1_S1S2)/(1-pH_1_S1S2));
oH_1_S1S2)
pH_1_S1S2)
end
二、分别编写遗传算法和粒子群算法程序完成Camel函数寻优
Camel函数描述为:
该函数有六个局部极小点,其中(-0.0898,0.7126)和(0.0898,0.7126)为全局最小点,最小值为-1.031628。
本题题目有误:
第一项
为
的偶次幂故取正负无影响,第三项
同理。
但是对于第二项
当
取-0.0898和0.0898时算出的
不可能一样。
故这题结论是错误的,全局最小点为(-0.0898,0.7126)。
A.遗传算法
A.2.1编程思路
对种群进行初始化,解码并且计算目标值和适应度。
比例运算,交叉运算,变异运算
生成新的种群并且输出目标值。
A.2.2计算结果
上图为一次计算结果,可以看出基本接近于题目中的结论。
算法测试结果:
由于时间有限,一共做了100次测试得出结果是:
最大与最小的差值仅仅只有0.003的差值,可见算法的精度还是比较高的。
A.2.3问题与思考
由于自己编写的GA算法一直在目标函数与适应度函数的转化上出现错误导致无法得出正常结果,故在参照同学的程序上进行了进一步的修改得到下面的算法程序。
但是同时也有一些问题无法得到理解与解决。
1、程序中并没有对适应度进行非负的转化
2、由于负数的适应度存在导致在比例选择中总的适应度降低,从而进一步导致正数的适应度间接增大,而负数的适应度丢失。
3、即使存在上述两点的问题,算法的结果依然是接近于正确,导致本人对此感到匪夷所思,然而时间和能力的有限使得本人并没有进一步研究与探讨。
A.2.4算法程序
function[]=GA
clearall
closeall
%参数
Size=150;
G=300;
L=10;
xmax=3;
xmin=-3;
ymax=2;
ymin=-2;
pc=0.60;
pm=0.01;
%初始化
E=round(rand(Size,2*L));
%主程序
fork=1:
1:
G
time(k)=k;
fors=1:
Size
m=E(s,:
t1=0;
t2=0;
%解码
m1=m(1:
L);
fori=1:
L
t1=t1+m1(i)*2^(i-1);
x(s)=(xmax-xmin)*t1/(2^L-1)+xmin;
m2=m(L+1:
2*L);
t2=t2+m2(i)*2^(i-1);
y(s)=(ymax-ymin)*t2/(2^L-1)+ymin;
F(s)=(4-2.1*x(s)^2+x(s)^4/3)*x(s)^2+x(s)*y(s)+(-4+4*y(s)^2)*y(s)^2;
%从大到小排序
fi=F;
[Oderfi,Indexfi]=sort(fi,'
descend'
Bestfi=Oderfi(Size);
BestS=E(Indexfi(Size),:
BestX=x(Indexfi(Size));
BestY=y(Indexfi(Size));
bfi(k)=Bestfi;
%比例选择法
fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size;
fi_S=floor(fi_Size);
kk=1;
forj=1:
fi_S(i)
TempE(kk,:
)=E(Indexfi(i),:
kk=kk+1;
%交叉运算
n=ceil(20*rand);
2:
(Size-1)
temp=rand;
ifpc>
=temp
forj=n:
20
TempE(i,j)=E(i+1,j);
TempE(i+1,j)=E(i,j);
TempE(Size,:
)=BestS;
%保留优秀个体
E=TempE;
%变异运算
2*L
ifpm>
ifTempE(i,j)==0
TempE(i,j)=1;
TempE(i,j)=0;
%新种群
Min_Value=Bestfi;
最小值=%f\n'
Min_Value)
X=%f\n'
BestX)
Y=%f\n'
BestY)
figure
(1);
plot(time,bfi);
xlabel('
times'
ylabel('
BestF'
B.粒子群算法
B.2.1编程思路
参数、种群初始化
计算各个粒子的适应度,初始化全局最优跟个体最优。
学习因子更新、速度更新、种群更新、适应度更新、最优更新
输出结果
B.2.2计算结果
函数最小值=-1.030325
x=-0.085016;
y=0.700078
B.2.3算法测试
上图为200次粒子群算法测试,可以看出最大最小之间误差大约为0.03,并且出现最大误差的次数大约为3%,可见算法可靠性还算可以。
B.2.4算法程序
function[]=Pso
%输入变量
N=2;
%('
解空间的维度='
M=20;
c1max=2.5;
c1min=0.5;
c2max=2.5;
c2min=0.5;
%初始化种群
fori=1:
M
pop(i,1)=3*rands(1,1);
%1行一列[-33]的随机数
pop(i,2)=2*rands(1,1);
V(i,:
)=rand(1,2);
%计算各个粒子的适应度,并初始化pbest跟gbest
fitness(i)=((4-2.1*(pop(i,1)^2)+(pop(i,1)^4)/3)*((pop(i,1)^2)))+((pop(i,1)*pop(i,2)))+((-4+4*(pop(i,2)^2))*(pop(i,2)^2));
[bestfitnessbestindex]=min(fitness);
%min返回两个值第一个为最小值,第二个为最小值位置
zbest=pop(bestindex,:
%全局最佳
gbest=pop;
%个体最佳
fitnessgbest=fitness;
%个体最佳适应度值
fitnesszbest=bestfitness;
%全局最佳适应度值
%迭代寻优
%学习因子更新
c1=c1max-(c1max-c1min)*i/G;
c2=c2min+(c2max-c2min)*i/G;
V(j,:
)=V(j,:
)+c1*rand*(gbest(j,:
)-pop(j,:
))+c2*rand*(zbest-pop(j,:
));
%速度更新
pop(j,:
)=pop(j,:
)+V(j,:
%种群更新
fitness(j)=((4-2.1*(pop(j,1)^2)+(pop(j,1)^4)/3)*((pop(j,1)^2)))+((pop(j,1)*pop(j,2)))+((-4+4*(pop(j,2)^2))*(pop(j,2)^2));
%适应度更新
iffitness(j)<
fitnessgbest(j)%个体最优更新
gbest(j,:
)=pop(j,:
fitnessgbest(j)=fitness(j);
fitnesszbest%群体最优更新
zbest=pop(j,:
fitnesszbest=fitness(j);
G_best(i)=fitnesszbest;
fprintf('
函数最小值=%f\n'
fitnesszbest)
x=%f\n'
zbest
(1))
y=%f\n'
zbest
(2))
三、编写蚁群算法程序完成31个城市的TSP问题寻优
31个城市
坐标为:
[13042312;
36391315;
41772244;
37121399;
34881535;
33261556;
32381229;
41961004;
4312790;
4386570;
30071970;
25621756;
27881491;
23811676;
1332695;
37151678;
39182179;
40612370;
37802212;
36762578;
40292838;
42632931;
34291908;
35072367;
33942643;
34393201;
29353240;
31403550;
25452357;
27782826;
23702975]
3.1编程思路
初始化:
计算距离矩阵,蚂蚁位置初始化
选择城市:
计算选择概率,转盘选择,更新禁忌表
计算路径长度,记录本次迭代最佳路线
更新信息素,禁忌表清空
输出结果,绘制路线图
3.2计算结果
最短距离=16038.794579
最佳路径为:
15-14-12-13-11-23-16-5-6-7-2-4-8-9-10-17-3-18-21-22-19
-24-20-25-26-28-27-30-31-29-1-15
3.3算法程序
function[]=Aco
C=[1304,2312;
3639,1315;
4177,2244;
3712,1399;
3488,1535;
3326,1556;
3238,1229;
4196,1004;
4312,790;
4386,570;
3007,1970;
2562,1756;
2788,1491;
2381,1676;
1332,695;
3715,1678;
3918,2179;
4061,2370;
3780,2212;
3676,2578;
4029,2838;
4263,2931;
3429,1908;
3507,2367;
3394,2643;
3439,3201;
2935,3240;
3140,3550;
2545,2357;
2778,2826;
2370,2975];
%C为坐标,n乘2矩阵
m=20;
%蚂蚁个数约等于(城市个数/1.5)
NC_max=200;
%最大迭代次数
A=1;
%信息素重要程度
B=5;
%启发因子重要程度
Q=10;
%信息素增强强度系数
R=0.7;
%信息素蒸发系数
%初始化变量
n=size(C,1);
%n为城市的数量1表示行数
D=zeros(n,n);
%D为邻接矩阵
n
ifi~=j
D(i,j)=(((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5);
%两两城市间的距离
D(i,j)=eps;
%防止启发因子分母为0
D(j,i)=D(i,j);
E=1./D;
%E为启发因子,距离的倒数
T=ones(n,n);
%T为信息素矩阵
Tabu=zeros(m,n);
%Tabu为禁忌表
NC=1;
%迭代计数器
road_best=zeros(NC_max,n);
length_best=inf.*ones(NC_max,1);
length_avg=zeros(NC_max,1);
whileNC<
=NC_max
%把m只蚂蚁放在n个城市上
Randpos=[];
i_c=ceil(m/n);
ifi_c==1
Randpos=[Randpos,randsample(randperm(n),m)];
(i_c-1)
Randpos=[Randpos,randperm(n)];
Randpos=[Randpos,randsample(randperm(n),(n-(n*(i_c-1))))];
Tabu(:
1)=(Randpos(1,1:
m))'
;
%将蚂蚁的起始城市加入禁忌表的第一列
%m只蚂蚁选择城市
forj=2:
n%旅游次数
m%蚂蚁数量
visited=Tabu(i,1:
(j-1));
%记录已访问的城市
J=zeros(1,(n-j+1));
%待访问的城市
P=J;
%待访问城市的选择概率
Jc=1;
sum_p=0;
iflength(find(visited==k))==0%开始时置0
J(Jc)=k;
Jc=Jc+1;
length(J)
p(k)=((T(visited(end),J(k))^A)*(E(visited(end),J(k))^B));
sum_p=(sum_p+p(k));
P(k)=p(k)/sum_p;
Pcum=cumsum(P);
%元素累加求和
select=find(Pcum>
=rand);
to_visit=J(select
(1));
Tabu(i,j)=to_visit;
ifNC>
=2
Tabu(1,:
)=road_best(NC-1,:
%记录本次迭代最佳路线
L=zeros(m,1);
m
road=Tabu(i,:
(n-1)
L(i)=L(i)+D(road(j),road(j+1));
L(i)=L(i)+D(road
(1),road(n));
length_best(NC)=min(L);
pos=find(L==length_best(NC));
road_best(NC,:
)=Tabu(pos
(1),:
length_avg(NC)=mean(L);
%mean为求数组平均值
NC=NC+1;
%更新信息素
Delta_T=zeros(n,n);
%信息素变化量
Delta_T(Tabu(i,j),Tabu(i,j+1))=Delta_T(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
Delta_T(Tabu(i,n),Tabu(i,1))=Delta_T(Tabu(i,n),Tabu(i,1))+Q/L(i);
T=(1-R).*T+R.*Delta_T;
%禁忌表清空
%输出结果
Pos=find(length_best==min(length_best));
R_best=road_best(Pos
(1),:
L_best=length_best(Pos
(1));
最短距离=%f\n'
L_best)
最佳路径为'
)
%d-'
R_best(i))
%d\n'
R_best
(1))
subplot(1,2,1)
%路线图绘制
N=length(R_best);
scatter(C(:
1),C(:
2));
holdon
plot([C(R_best
(1),1),C(R_best(N),1)],[C(R_best
(1),2)