蚁群算法的内容

蚁群算法的内容,第1张

蚁群算法又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质.针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。

神经网络

思维学普遍认为,人类大脑的思维分为抽象(逻辑)思维、形象(直观)思维和灵感(顿悟)思维三种基本方式。

逻辑性的思维是指根据逻辑规则进行推理的过程;它先将信息化成概念,并用符号表示,然后,根据符号运算按串行模式进行逻辑推理;这一过程可以写成串行的指令,让计算机执行。然而,直观性的思维是将分布式存储的信息综合起来,结果是忽然间产生想法或解决问题的办法。这种思维方式的根本之点在于以下两点:1.信息是通过神经元上的兴奋模式分布储在网络上2.信息处理是通过神经元之间同时相互作用的动态过程来完成的。

人工神经网络就是模拟人思维的第二种方式。这是一个非线性动力学系统,其特色在于信息的分布式存储和并行协同处理。虽然单个神经元的结构极其简单,功能有限,但大量神经元构成的网络系统所能实现的行为却是极其丰富多彩的。

神经网络的研究内容相当广泛,反映了多学科交叉技术领域的特点。目前,主要的研究工作集中在以下几个方面:

(1)生物原型研究。从生理学、心理学、解剖学、脑科学、病理学等生物科学方面研究神经细胞、神经网络、神经系统的生物原型结构及其功能机理。

(2)建立理论模型。根据生物原型的研究,建立神经元、神经网络的理论模型。其中包括概念模型、知识模型、物理化学模型、数学模型等。

(3)网络模型与算法研究。在理论模型研究的基础上构作具体的神经网络模型,以实现计算机馍拟或准备制作硬件,包括网络学习算法的研究。这方面的工作也称为技术模型研究。

(4)人工神经网络应用系统。在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能、构作专家系统、制成机器人等等。

纵观当代新兴科学技术的发展历史,人类在征服宇宙空间、基本粒子,生命起源等科学技术领域的进程中历经了崎岖不平的道路。我们也会看到,探索人脑功能和神经网络的研究将伴随着重重困难的克服而日新月异。

遗传算法,是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,它最初由美国Michigan大学J.Holland教授于1975年首先提出来的,并出版了颇有影响的专著《Adaptation in Natural and Artificial Systems》,GA这个名称才逐渐为人所知,J.Holland教授所提出的GA通常为简单遗传算法(SGA)。

该程序试图对具有31个城市的VRP进行求解,已知的最优解为784.1,我用该程序只能优化到810左右,应该是陷入局部最优,但我不知问题出在什么地方。请用过蚁群算法的高手指教。

蚁群算法的matlab源码,同时请指出为何不能优化到已知的最好解

%

%

%the procedure of ant colony algorithm for VRP

%

%%%%%%%%%%%

%initialize the parameters of ant colony algorithms

load data.txt

d=data(:,2:3)

g=data(:,4)

m=31% 蚂蚁数

alpha=1

belta=4% 决定tao和miu重要性的参数

lmda=0

rou=0.9%衰减系数

q0=0.95

% 概率

tao0=1/(31*841.04)%初始信息素

Q=1% 蚂蚁循环一周所释放的信息素

defined_phrm=15.0 % initial pheromone level value

QV=100 % 车辆容量

vehicle_best=round(sum(g)/QV)+1%所完成任务所需的最少车数

V=40

% 计算两点的距离

for i=1:32

for j=1:32

dist(i,j)=sqrt((d(i,1)-d(j,1))^2+(d(i,2)-d(j,2))^2)

end

end

%给tao miu赋初值

for i=1:32

for j=1:32

if i~=j

%s(i,j)=dist(i,1)+dist(1,j)-dist(i,j)

tao(i,j)=defined_phrm

miu(i,j)=1/dist(i,j)

end

end

end

for k=1:32

for k=1:32

deltao(i,j)=0

end

end

best_cost=10000

for n_gen=1:50

print_head(n_gen)

for i=1:m

%best_solution=[]

print_head2(i)

sumload=0

cur_pos(i)=1

rn=randperm(32)

n=1

nn=1

part_sol(nn)=1

%cost(n_gen,i)=0.0

n_sol=0 % 由蚂蚁产生的路径数量

M_vehicle=500

t=0 %最佳路径数组的元素数为0

while sumload<=QV

for k=1:length(rn)

if sumload+g(rn(k))<=QV

gama(cur_pos(i),rn(k))=(sumload+g(rn(k)))/QV

A(n)=rn(k)

n=n+1

end

end

fid=fopen('out_customer.txt','a+')

fprintf(fid,'%s %i\t','the current position is:',cur_pos(i))

fprintf(fid,'\n%s','the possible customer set is:')

fprintf(fid,'\t%i\n',A)

fprintf(fid,'------------------------------\n')

fclose(fid)

p=compute_prob(A,cur_pos(i),tao,miu,alpha,belta,gama,lmda,i)

maxp=1e-8

na=length(A)

for j=1:na

if p(j)>maxp

maxp=p(j)

index_max=j

end

end

old_pos=cur_pos(i)

if rand(1)<q0

cur_pos(i)=A(index_max)

else

krnd=randperm(na)

cur_pos(i)=A(krnd(1))

bbb=[old_pos cur_pos(i)]

ccc=[1 1]

if bbb==ccc

cur_pos(i)=A(krnd(2))

end

end

tao(old_pos,cur_pos(i))=taolocalupdate(tao(old_pos,cur_pos(i)),rou,tao0)%对所经弧进行局部更新

sumload=sumload+g(cur_pos(i))

nn=nn+1

part_sol(nn)=cur_pos(i)

temp_load=sumload

if cur_pos(i)~=1

rn=setdiff(rn,cur_pos(i))

n=1

A=[]

end

if cur_pos(i)==1 % 如果当前点为车场,将当前路径中的已访问用户去掉后,开始产生新路径

if setdiff(part_sol,1)~=[]

n_sol=n_sol+1 % 表示产生的路径数,n_sol=1,2,3,..5,6...,超过5条对其费用加上车辆的派遣费用

fid=fopen('out_solution.txt','a+')

fprintf(fid,'%s%i%s','NO.',n_sol,'条路径是:')

fprintf(fid,'%i ',part_sol)

fprintf(fid,'\n')

fprintf(fid,'%s','当前的用户需求量是:')

fprintf(fid,'%i\n',temp_load)

fprintf(fid,'------------------------------\n')

fclose(fid)

% 对所得路径进行路径内3-opt优化

final_sol=exchange(part_sol)

for nt=1:length(final_sol)% 将所有产生的路径传给一个数组

temp(t+nt)=final_sol(nt)

end

t=t+length(final_sol)-1

sumload=0

final_sol=setdiff(final_sol,1)

rn=setdiff(rn,final_sol)

part_sol=[]

final_sol=[]

nn=1

part_sol(nn)=cur_pos(i)

A=[]

n=1

end

end

if setdiff(rn,1)==[]% 产生最后一条终点不为1的路径

n_sol=n_sol+1

nl=length(part_sol)

part_sol(nl+1)=1%将路径的最后1位补1

% 对所得路径进行路径内3-opt优化

final_sol=exchange(part_sol)

for nt=1:length(final_sol)% 将所有产生的路径传给一个数组

temp(t+nt)=final_sol(nt)

end

cost(n_gen,i)=cost_sol(temp,dist)+M_vehicle*(n_sol-vehicle_best) %计算由蚂蚁i产生的路径总长度

for ki=1:length(temp)-1

deltao(temp(ki),temp(ki+1))=deltao(temp(ki),temp(ki+1))+Q/cost(n_gen,i)

end

if cost(n_gen,i)<best_cost

best_cost=cost(n_gen,i)

old_cost=best_cost

best_gen=n_gen % 产生最小费用的代数

best_ant=i%产生最小费用的蚂蚁

best_solution=temp

end

if i==m %如果所有蚂蚁均完成一次循环,,则用最佳费用所对应的路径对弧进行整体更新

for ii=1:32

for jj=1:32

tao(ii,jj)=(1-rou)*tao(ii,jj)

end

end

for kk=1:length(best_solution)-1

tao(best_solution(kk),best_solution(kk+1))=tao(best_solution(kk),best_solution(kk+1))+deltao(best_solution(kk),best_solution(kk+1))

end

end

fid=fopen('out_solution.txt','a+')

fprintf(fid,'%s%i%s','NO.',n_sol,'路径是:')

fprintf(fid,'%i ',part_sol)

fprintf(fid,'\n')

fprintf(fid,'%s %i\n','当前的用户需求量是:',temp_load)

fprintf(fid,'%s %f\n','总费用是:',cost(n_gen,i))

fprintf(fid,'------------------------------\n')

fprintf(fid,'%s\n','最终路径是:')

fprintf(fid,'%i-',temp)

fprintf(fid,'\n')

fclose(fid)

temp=[]

break

end

end

end

end

我现在也在研究它,希望能共同进步.建义可以看一下段海滨的关于蚁群算法的书.讲的不错,李士勇的也可以,还有一本我在图书馆见过,记不得名字了.


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11167753.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存