蚁群算法旅行商问题人工智能java代码+报告+注释.docx
- 文档编号:26418607
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:48
- 大小:55.39KB
蚁群算法旅行商问题人工智能java代码+报告+注释.docx
《蚁群算法旅行商问题人工智能java代码+报告+注释.docx》由会员分享,可在线阅读,更多相关《蚁群算法旅行商问题人工智能java代码+报告+注释.docx(48页珍藏版)》请在冰豆网上搜索。
蚁群算法旅行商问题人工智能java代码+报告+注释
蚁群算法-旅行商问题-人工智能-java-代码+报告+注释
1.整体结构与功能划分2
(一)总体结构
2
(二)类的划分与功能说明
3
i.NewJFrame类
3
ii.Ant类
3
iii.ACO类
3"parameter类
4v.Data类
4
2.输入输出格式4
(一)输入信息
4
i.城市坐标信息
4
ii.参数
4
(二)输出信息
4
i.图形用户界面输出
4
ii.控制台输出
4
3.完整代码(见附录)4
4.算法优化4
(一)蚁恒模型
4
(二)信息素强度及路径信息素初始值
5
(三)各参数对算法的影响
5
5.运行测试7
(一)传统模型
7
(二)蚁恒模型
8
6.参考文献9
附录9
(一)NewJFrame.java
9
(二)Ant.java
28
(三)ACO.java
32
(四)Parameter.java
39
(五)Data.java
39
(六)NewJFramePath.java
41
1.整体结构与功能划分
(一)总体结构
程序的主类是NewJFrame该类负责绘制图形用户界面并执行蚁群算法。
将蚁群算法中的“蚂蚁”抽象为Ant类,实现遍历所有城市(选择下一个城市)、计算本次遍历的路程等功能。
ACC类聚合了Ant类,完整的实现了蚁群算法,包括迭代遍历、更新信息素等过程。
NewJFramePath类将解路径以图形方式显示出来。
另设两个数据类parameter和Data,parameter类用于保存参数的默认值,主要参数包括:
蚂蚁数量、城市数目、迭代次数、a、B、挥发因子、信息素强度Q、路径信息素初始
值initQ。
Data中存储每个城市的位置信息。
(2)类的划分与功能说明
i.NewJFrame类
定义了各组件对鼠标事件响应方式。
图形用户界面为用户提供输入各项参数的窗口,并添加了“使用默认参数”的功能。
当用户点击确定按钮,程序将执行jButton_actionPeformed(e)函数。
首先读取文本框中
参数,初始化ACO类对象,调用ACO类的solve方法开始求解过程。
最终结果将以图形化的方式输出到屏幕。
输出内容包括:
解路径和解路径总长度。
ii.Ant类
设禁忌表,用于记录已访问过的城市;可访问表,记录未达到的城市。
设置信息素变化矩阵,表示一只蚂蚁,在一次遍历中,为经过的路段增加的信息素。
距离矩阵存储任意两个城市之间的路程。
方法selectNextCity(float[][]pheromone)负责选择下一个城市。
首先根据信息
素矩阵pheromone计算概率,使用轮盘赌的方法选择下一城市,并更新禁忌表、可访问表以及当前城市。
calculateTourLength()方法的功能是计算一次遍历中走过的路程。
Ant类中的其他方法用于返回该类的某些属性或对属性进行设置。
iii.ACO类
ACO类的属性如下图所示:
privateants:
/—雅蚂蚪
privateintaniNum;〃対製数蚩
prlvateintcityfiun:
城rt計星
privateint//迭代;欠数
privatefloat[][]pheromone:
;僖息臺拒隆
privateint〔][]distance:
"距离矩B車
privateintbestLength;打儡駱轻总长度
privateintF?
bestlouj:
:
峯貉;左
privatefloatalpha:
privatefloatbeta;
privatefloatrho:
"信息憲挥驗因子|
图1ACO类的主要属性
其中ants是Ant类对象,antNumMAX_GENalpha(a)、beta(B)、rho将通过图形界面中用户输入的参数设定。
一
pheromone是信息素矩阵,表示城市与城市之间每一段路程上的信息素含量;bestLength、bestTour分别指最优解的总长度和最优解路径的节点顺序。
Init()方法将完成对ACO寸象的初始化。
首先从Data类中读入每个城市的坐标信息,计算距离矩阵;将信息素矩阵的所有元素初始化为0.1,bestLength初始化为正无穷;
并按照指定的数目初始化蚁群。
solve()方法实现核心求解过程。
在每次迭代中,蚂蚁逐个进行城市遍历,所有蚂蚁遍历过一次后,更新信息素矩阵;迭代MAX_GE次后,得到最优解。
updatePheromone()方法用于更新信息素矩阵,用rho计算信息素挥发对信息素总量的影响;累加所有蚂蚁“信息素变化矩阵”的对应值,计算一次迭代后信息素增量。
iv.parameter类
当用户勾选“使用默认”单选框时,将调用parameter中的参数默认值。
v.Data类
该类中的data属性是二维数组,每行元素的三个值依次为:
城市id、城市横坐标、纵坐标。
getdata()方法用于返回某一指定元素的值,即指定城市的横坐标或纵坐标
2.输入输出格式
(一)输入信息
i.城市坐标信息
二维数组data中的一行对应一个城市的信息,每行的三个值依次为:
城市id、
城市横坐标、纵坐标。
如:
{1,6734,1453}。
ii.参数
参数主要通过图形界面传入,其中蚂蚁数量、迭代次数为整型;a、B、挥发因子为浮点型。
也可以采用默认参数。
(二)输出信息
i.图形用户界面输出
以图形方式输出解路径和解路径总长度。
ii.控制台输出
输出程序执行进度(如正在执行的模块)、解路径和解路径总长度。
3.完整代码(见附录)
4.算法优化
(一)蚁恒模型
本程序原使用传统模型,即:
kQ当第k只蚂蚁在本次周游中(ttn时段)经过路径aj时
jS
0否则
kdijQ
添加蚁恒模型:
ijH
可以在图形界面中选择使用传统模型或蚁恒模型。
(二)信息素强度及路径信息素初始值
当蚁群算法求解过程中出现局部最优解,由于正反馈的作用可能导致局部最优解路径上信息素不断累积,降低算法的全局搜索能力[1]。
因此,控制信息素强度Q与信息素初始含量便成为避免陷入局部最优解的关键。
改进算法中这两个变量也可由用户设置。
(三)各参数对算法的影响
本算法设计的主要参数有:
蚂蚁数量、迭代次数、a、B、信息素挥发因子、信息素强度、路径信息素初始值。
简单的测试和统计后发现,解路径长度与迭代次数之间有如下关系:
解路径长度与迭代次数的关系
797
1234
迭代次数(X100)
ooooO
98765
77777
74
00
8
值均度长径路解
图2解路径长度与迭代次数的关系
其他参数的改变也会对算法的解造成影响。
例如,在其他参数不变的条件下,信息素初始值与信息素强度Q的比值在0.1左右时效果较好。
若该比值过小,易陷入局部最优解。
有学者曾给出各参数的合理取值范围[2],现将本算法的默认参数取值设定在该范围内:
frnalstaticLilt:
诚十勲四
finalstatici.ntAitWr..?
=100:
//码蚁埶里丿0・血,0»9n/—n芮城市埶目finalstaticLntL?
fin_i;'ui^450:
I二I匕文故
finalstaticfloatof:
f茅竹「可咗'].2.*
finalstaticfloatf:
参数P4.0,6,i1
finalstarticfRho=0・65f;"信息寿挥发因子/0.5T0.3/
finalstaticint050:
"信息童强度|
finalstati.cfloatuiitO=10;•,.洛空i言岂吉门姑1jg
图3默认参数的设置
5.运行测试
(一)传统模型
图4用户设置参数
MWft•0.»41.>4rkIQ>117.>?
^.>14-*3)-^11-*?
^»^0-»3>?
».*77->%>7^*24->^3->1V>1(1.*1Q-»1RL>17->A.v15->1H“I3->11.>tOL:
3-
SiWifetflE■T1C4$1MS2»fU3
图5传统模型-结果演示
嚥慣模型
(二)蚁恒模型
在界面中选择蚁恒模型:
结果如下图:
圈寻:
J1r>rv»1-*3-爭》弘•丁.>9-10-toiI->1r”叭学印«.HC.*15->1F”>1事片番»70->?
1丄32--73-*7#>25->2b->B■•脾•■却-巧1-k?
3->14眨・爵4T.町P眄鼻>«0->11“
fflj-tblfll.■:
0MjaTD^U15JT5*
图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彤
*/
ends
publicclassNewJFramee
javax.swing.JFrame{
/**CreatesnewformNewJFrame*/
//privatestaticACOaco;
被选中的标志
public
static
int
flagRadio1=0,flagRadio2=0,flagRadio3=0,flagRadio4=0,flagRadio5=0,flagRadio6=0,flagRadio7=0;
//以下属性对应为:
整形参数蚂蚁数量、迭
代次数,浮点型参数a、®、挥发因子
publicstaticintantNum,genNum,QQ;
publicstaticfloatalf,bta,h;
publicstaticfloatinitQ;
publicstaticStringroute;
-传统
publicstaticintflag;//蚁恒模型
模型的选择
publicstaticintupdateTimes=O;
//……publicNewJFrame(){
initComponents();
//为确定按钮添加事件监听器,当点击
确定按钮时,执行“jButton_actionPerformed(e)”函数
jButton1.addActionListener(new
ActionListener(){
publicvoid
actionPerformed(ActionEvente){
jButton_actionPerformed(e);
});
//以下定义5个单选按钮的事件监听
器,当该按钮被选中时,
//执行相应的Radio-x()函数,即引用
默认的参数值。
jRadioButtonl.addActionListener(new
ActionListener(){
publicvoid
actionPerformed(ActionEvente){
Radio1(e);
}
});
jRadioButton2.addActionListener(new
ActionListener(){
publicvoid
actionPerformed(ActionEvente){
Radio2(e);
}
});
jRadioButton3.addActionListener(new
ActionListener(){
public
actionPerformed(ActionEvente){
Radio3(e);
}
});
jRadioButton4.addActionListener(new
ActionListener(){
public
actionPerformed(ActionEvente){
Radio4(e);
}
});
jRadioButton5.addActionListener(new
ActionListener(){
public
actionPerformed(ActionEvente){
void
void
void
Radio5(e);
}
});
jRadioButton6.addActionListener(new
ActionListener(){
public
actionPerformed(ActionEvente){
Radio6(e);
}
});
jRadioButton7.addActionListener(new
ActionListener(){
public
actionPerformed(ActionEvente){
Radio7(e);
}
});
void
void
一单选框被点击之后
*经过点击后,若单选框处于选中状态,则
将parameter类中相应参数的默认值显示在文本框中,
*若单选框处于未选中状态,则将对应的文
本框置空,等待用户键入参数值
*/
privatevoidRadio1(ActionEvente){flagRadio^~flagRadio1;//每点击一
次,标志flagRadio-x取反
if(flagRadio1==-1)//选中状态,显示
默认值
jTextField1.setText(String.valueOf(
AntNum));
elseif(flagRadio1==0)//
态,文本框置空
jTextField1.setText(null);
}
privatevoidRadio2(ActionEvente){flagRadio2=~flagRadio2;if(flagRadio2==-1)
parameter.
未选中状
parameter.
jTextField2.setText(String.valueOf(
Gen_Num));
elseif(flagRadio2==0)
jTextField2.setText(null);
}
privatevoidRadio3(ActionEvente){flagRadio3=~flagRadio3;
if(flagRadio3==-1)
jTextField3.setText(String.valueOf(
alf));
elseif(flagRadio3==0)jTextField3.setText(null);
}
privatevoidRadio4(ActionEvente){flagRadio4=~flagRadio4;if(flagRadio4==-1)
jTextField4.setText(String.valueOf(bta));
elseif(flagRadio4==0)
parameter.
parameter.
jTextField4.setText(null);
privatevoidRadio5(ActionEvente){flagRadio5=~flagRadio5;if(flagRadio5==-1){
jTextField5.setText(String.valueOf(
Rho));
}
elseif(flagRadio5==0)jTextField5.setText(null);
}
privatevoidRadio6(ActionEvente){
flagRadio6=~flagRadio6;
if(flagRadio6==-1){
jTextField6.setText(String.valueOf(
Q));
}
elseif(flagRadio6==0)jTextField6.setText(null);
parameter.
parameter.
}privatevoidRadio7(ActionEvente){
flagRadio7=~flagRadio7;
if(flagRadio7==-1){
jTextField7.setText(String.valueOf(parameter.
initQ));
}
elseif(flagRadio7==0)jTextField7.setText(null);
}
/**
*本函数发生在:
用户完成对蚂蚁数量、迭代次数、a、B、挥发因子的设置,点击确定按钮提交之后
*首先完成文本框中参数的读取->
*初始化ACO蚁群算法类对象->
*执行蚁群算法->
*将结果以对话框的形式输出到屏幕,包括:
解路径和解路径总长度
*(若用户对某一参数勾选了“使用默认”单选按钮,则该参数使用默认设置)
*@parame
*/
privatevoid
jButton_actionPeformed(ActionEvente)
flag=jComboBox1.getSelectedlndex();
Stringstr="";
//读取用户在界面中输入的参数值,
某一参数勾选了“使用默认"单选按钮,则使用parameter类中的默认值
antNum=Integer.valueOf(
jTextField1.getText(
.intValue();
genNum=lnteger.valueOf(jTextField2.getText(
■intValue();
若
))
))
alf=Float.valueOf(tValue();
bta=Float.valueOf(
jTextField3.getText()).floa
jTextField4.getText()).floa
h=Float.valueOf(jTextField5.getText()).floatV
alue();
QQ=Integer.valueOf(jTextField6.getText()).int
Value();
initQ=Float.valueOf(jTextField7.getText()).fl
oatValue();
//初始化ACO蚁群算法类对象,调用
ACO类的solve方法开始求解过程
System.out.println("蚁群算
求解旅行商冋〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜\n");
ACOaco=newACO(parameter.CityNum,antNum,genNum,alf,bta,h,QQ,initQ);
aco.init();
aco.solve();
各解路径按照“x->y->z”的格式整合
//将
成字符串
for(inti=0;i +1;i++){ str+=String.valueOf( aco.getBestTour()[i]) J if(i%12==0&&i! =0){str+="\n"; } } //以对话框的形式将解路径和解路径 长输出到屏幕 //JOptionPane.showMessageDialog(getParent(),解路径总长度="+aco.getBestLength()+"\n"+"径的节点顺序: \n"+str); route=str; new NewJFramePath().setVisible(true); the } /**Thismethodiscalledfromwithinconstructorto *initializetheform. *WARNING: DoNOTmodifythiscode.The contentofthismethodis alwaysregeneratedbytheFormEditor. */ @SuppressWarnings("unchecked")private jTextField1ActionPerformed(java.awt.event.ActionEventevt){ //TODQddyourhandlingcode } private jTextField3ActionPerformed(java.awt.event.ActionEventevt){ //TODQddyourhandlingcode } private jButton1ActionPerformed(java.awt.event.ActionEventevt){ //TODQddyourhandlingcode } private void here: void here: void here: void jRadioButtonlActionPerformedQava.awt.event.Ac tionEventevt){ //TODQddyourhandlingcodehere: } private jRadioButton2ActionPerformedQava.awt.event.ActionEventevt){ //TODQddyourhandlingcode } private jRadioButton3ActionPerformedQava.awt.event.ActionEventevt){ //TODQddyourhandlingcode } private jRadioButton4ActionPerformedQava.awt.event.Act
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 旅行 问题 人工智能 java 代码 报告 注释