蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx

上传人:b****5 文档编号:3032879 上传时间:2022-11-17 格式:DOCX 页数:34 大小:179.56KB
下载 相关 举报
蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx_第1页
第1页 / 共34页
蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx_第2页
第2页 / 共34页
蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx_第3页
第3页 / 共34页
蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx_第4页
第4页 / 共34页
蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx

《蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx》由会员分享,可在线阅读,更多相关《蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx(34页珍藏版)》请在冰豆网上搜索。

蚁群算法 旅行商问题 人工智能 java 代码+报告+注释.docx

蚁群算法旅行商问题人工智能java代码+报告+注释

目录

1.整体结构与功能划分2

(一)总体结构2

(二)类的划分与功能说明2

i.NewJFrame类2

ii.Ant类2

iii.ACO类2

iv.parameter类3

v.Data类3

2.输入输出格式3

(一)输入信息3

i.城市坐标信息3

ii.参数3

(二)输出信息3

i.图形用户界面输出3

ii.控制台输出3

3.完整代码(见附录)4

4.算法优化4

(一)蚁恒模型4

(二)信息素强度及路径信息素初始值4

(三)各参数对算法的影响4

5.运行测试5

(一)传统模型5

(二)蚁恒模型6

6.参考文献7

附录7

(一)NewJFrame.java7

(二)Ant.java13

(三)ACO.java17

(四)Parameter.java23

(五)Data.java23

(六)NewJFramePath.java24

1.整体结构与功能划分

(一)总体结构

程序的主类是NewJFrame,该类负责绘制图形用户界面并执行蚁群算法。

将蚁群算法中的“蚂蚁”抽象为Ant类,实现遍历所有城市(选择下一个城市)、计算本次遍历的路程等功能。

ACO类聚合了Ant类,完整的实现了蚁群算法,包括迭代遍历、更新信息素等过程。

NewJFramePath类将解路径以图形方式显示出来。

另设两个数据类parameter和Data,parameter类用于保存参数的默认值,主要参数包括:

蚂蚁数量、城市数目、迭代次数、α、β、挥发因子、信息素强度Q、路径信息素初始值initQ。

Data中存储每个城市的位置信息。

(二)类的划分与功能说明

i.NewJFrame类

定义了各组件对鼠标事件响应方式。

图形用户界面为用户提供输入各项参数的窗口,并添加了“使用默认参数”的功能。

当用户点击确定按钮,程序将执行jButton_actionPerformed(e)函数。

首先读取文本框中参数,初始化ACO类对象,调用ACO类的solve方法开始求解过程。

最终结果将以图形化的方式输出到屏幕。

输出内容包括:

解路径和解路径总长度。

ii.Ant类

设禁忌表,用于记录已访问过的城市;可访问表,记录未达到的城市。

设置信息素变化矩阵,表示一只蚂蚁,在一次遍历中,为经过的路段增加的信息素。

距离矩阵存储任意两个城市之间的路程。

方法selectNextCity(float[][]pheromone)负责选择下一个城市。

首先根据信息素矩阵pheromone计算概率,使用轮盘赌的方法选择下一城市,并更新禁忌表、可访问表以及当前城市。

calculateTourLength()方法的功能是计算一次遍历中走过的路程。

Ant类中的其他方法用于返回该类的某些属性或对属性进行设置。

iii.ACO类

ACO类的属性如下图所示:

图1ACO类的主要属性

其中ants是Ant类对象,antNum、MAX_GEN、alpha(α)、beta(β)、rho将通过图形界面中用户输入的参数设定。

pheromone是信息素矩阵,表示城市与城市之间每一段路程上的信息素含量;bestLength、bestTour分别指最优解的总长度和最优解路径的节点顺序。

Init()方法将完成对ACO对象的初始化。

首先从Data类中读入每个城市的坐标信息,计算距离矩阵;将信息素矩阵的所有元素初始化为0.1,bestLength初始化为正无穷;并按照指定的数目初始化蚁群。

solve()方法实现核心求解过程。

在每次迭代中,蚂蚁逐个进行城市遍历,所有蚂蚁遍历过一次后,更新信息素矩阵;迭代MAX_GEN次后,得到最优解。

updatePheromone()方法用于更新信息素矩阵,用rho计算信息素挥发对信息素总量的影响;累加所有蚂蚁“信息素变化矩阵”的对应值,计算一次迭代后信息素增量。

iv.parameter类

当用户勾选“使用默认”单选框时,将调用parameter中的参数默认值。

v.Data类

该类中的data属性是二维数组,每行元素的三个值依次为:

城市id、城市横坐标、纵坐标。

getdata()方法用于返回某一指定元素的值,即指定城市的横坐标或纵坐标

 

2.输入输出格式

(一)输入信息

i.城市坐标信息

二维数组data中的一行对应一个城市的信息,每行的三个值依次为:

城市id、城市横坐标、纵坐标。

如:

{1,6734,1453}。

ii.参数

参数主要通过图形界面传入,其中蚂蚁数量、迭代次数为整型;α、β、挥发因子为浮点型。

也可以采用默认参数。

(二)输出信息

i.图形用户界面输出

以图形方式输出解路径和解路径总长度。

ii.控制台输出

输出程序执行进度(如正在执行的模块)、解路径和解路径总长度。

 

3.完整代码(见附录)

4.算法优化

(一)蚁恒模型

本程序原使用传统模型,即:

添加蚁恒模型:

可以在图形界面中选择使用传统模型或蚁恒模型。

(二)信息素强度及路径信息素初始值

当蚁群算法求解过程中出现局部最优解,由于正反馈的作用可能导致局部最优解路径上信息素不断累积,降低算法的全局搜索能力[1]。

因此,控制信息素强度Q与信息素初始含量便成为避免陷入局部最优解的关键。

改进算法中这两个变量也可由用户设置。

(三)各参数对算法的影响

本算法设计的主要参数有:

蚂蚁数量、迭代次数、α、β、信息素挥发因子、信息素强度、路径信息素初始值。

简单的测试和统计后发现,解路径长度与迭代次数之间有如下关系:

图2解路径长度与迭代次数的关系

其他参数的改变也会对算法的解造成影响。

例如,在其他参数不变的条件下,信息素初始值与信息素强度Q的比值在0.1左右时效果较好。

若该比值过小,易陷入局部最优解。

 

有学者曾给出各参数的合理取值范围[2],现将本算法的默认参数取值设定在该范围内:

图3默认参数的设置

 

5.运行测试

(一)传统模型

图4用户设置参数

 

图5传统模型-结果演示

 

(二)蚁恒模型

在界面中选择蚁恒模型:

结果如下图:

图6蚁恒模型-结果演示

6.参考文献

[1]邓雷,朱永利,张雷.基于改进蚁群算法求解最优路径算法的研究[A].电力科学与工程,2013,3.

[2]徐红梅,陈义保,刘加光,王燕涛.蚁群算法中参数设置的研究[A].山东理工大学学报,2008.

 

附录

(一)NewJFrame.java

/*

*NewJFrame.java

*

*Createdon2013-11-23,21:

25:

57

*/

packagetravaller;

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

/**

*

*@author彤

*/

publicclassNewJFrameextendsjavax.swing.JFrame{

/**CreatesnewformNewJFrame*/

//privatestaticACOaco;

//flagRadio-x:

是某参数对应的单选框是否被选中的标志

publicstaticintflagRadio1=0,flagRadio2=0,flagRadio3=0,flagRadio4=0,flagRadio5=0,flagRadio6=0,flagRadio7=0;

//以下属性对应为:

整形参数蚂蚁数量、迭代次数,浮点型参数α、β、挥发因子

publicstaticintantNum,genNum,QQ;

publicstaticfloatalf,bta,h;

publicstaticfloatinitQ;

publicstaticStringroute;

publicstaticintflag;//蚁恒模型-传统模型的选择

publicstaticintupdateTimes=0;

//......

publicNewJFrame(){

initComponents();

//为确定按钮添加事件监听器,当点击确定按钮时,执行“jButton_actionPerformed(e)”函数

jButton1.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

jButton_actionPerformed(e);

}

});

//以下定义5个单选按钮的事件监听器,当该按钮被选中时,

//执行相应的Radio-x()函数,即引用默认的参数值。

jRadioButton1.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

Radio1(e);

}

});

jRadioButton2.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

Radio2(e);

}

});

jRadioButton3.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

Radio3(e);

}

});

jRadioButton4.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

Radio4(e);

}

});

jRadioButton5.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

Radio5(e);

}

});

jRadioButton6.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

Radio6(e);

}

});

jRadioButton7.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

Radio7(e);

}

});

}

/*以下定义5个方法Radio-x(e),函数发生在某一单选框被点击之后。

*经过点击后,若单选框处于选中状态,则将parameter类中相应参数的默认值显示在文本框中,

*若单选框处于未选中状态,则将对应的文本框置空,等待用户键入参数值

*/

privatevoidRadio1(ActionEvente){

flagRadio1=~flagRadio1;//每点击一次,标志flagRadio-x

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1