西安交通大学 人工智能实验报告.docx
- 文档编号:8019339
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:35
- 大小:114.03KB
西安交通大学 人工智能实验报告.docx
《西安交通大学 人工智能实验报告.docx》由会员分享,可在线阅读,更多相关《西安交通大学 人工智能实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
西安交通大学人工智能实验报告
人工智能实验报告
一、请用三种方法解决15、25、35城市对称TSP问题。
解:
TSP问题(TravellingSalesmanProblem)即为旅行商问题,又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP问题是一个组合优化问题。
该问题可以被证明具有NPC计算复杂性。
TSP问题可以分为两类,一类是对称TSP问题(SymmetricTSP),另一类是非对称问题(AsymmetricTSP)。
所有的TSP问题都可以用一个图(Graph)来描述:
V={c1,c2,…,ci,…,cn},i=1,2,…,n,是所有城市的集合.ci表示第i个城市,n为城市的数目;
E={(r,s):
r,s∈V}是所有城市之间连接的集合;
C={crs:
r,s∈V}是所有城市之间连接的成本度量(一般为城市之间的距离);
如果crs=csr,那么该TSP问题为对称的,否则为非对称的。
一个TSP问题可以表达为:
求解遍历图G=(V,E,C),所有的节点一次并且回到起始节点,使得连接这些节点的路径成本最低。
(1)贪心算法(15城市):
贪心策略:
在当前节点下遍历所有能到达的下一节点,选择距离最近的节点作为下一节点。
基本思路是,从一节点出发遍历所有能到达的下一节点,选择距离最近的节点作为下一节点,然后把当前节点标记已走过,下一节点作为当前节点,重复贪心策略,以此类推直至所有节点都标记为已走节点结束。
算法程序如下:
packagetsp;
importjava.io.BufferedReader;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
publicclassTsp1{
privateintcityNum;//城市数量
privateint[][]distance;//距离矩阵
privateint[]colable;//代表列,也表示是否走过,走过置0
privateint[]row;//代表行,选过置0
publicTsp1(intn){
cityNum=n;
}
privatevoidinit(Stringfilename)throwsIOException{
//读取数据
int[]x;
int[]y;
Stringstrbuff;
BufferedReaderdata=newBufferedReader(newInputStreamReader(
newFileInputStream(filename)));
distance=newint[cityNum][cityNum];
x=newint[cityNum];
y=newint[cityNum];
for(inti=0;i //读取一行数据,数据格式167341453 strbuff=data.readLine(); //字符分割 String[]strcol=strbuff.split(""); x[i]=Integer.valueOf(strcol[1]);//x坐标 y[i]=Integer.valueOf(strcol[2]);//y坐标 } data.close(); //计算距离矩阵 //,针对具体问题,距离计算方法也不一样,此处用的是att48作为案例,它有48个城市,距离计算方法为伪欧氏距离,最优值为10628 for(inti=0;i distance[i][i]=0;//对角线为0 for(intj=i+1;j doublerij=Math .sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j]) *(y[i]-y[j])); //四舍五入,取整 inttij=(int)Math.round(rij)-1; if(tij distance[i][j]=tij+1; distance[j][i]=distance[i][j]; }else{ distance[i][j]=tij; distance[j][i]=distance[i][j]; } } } distance[cityNum-1][cityNum-1]=0; colable=newint[cityNum]; colable[0]=0; for(inti=1;i colable[i]=1; } row=newint[cityNum]; for(inti=0;i row[i]=1; } } publicvoidsolve(){ int[]temp=newint[cityNum]; Stringpath="0"; ints=0;//计算距离 inti=0;//当前节点 intj=0;//下一个节点 //默认从0开始 while(row[i]==1){ //复制一行 for(intk=0;k temp[k]=distance[i][k]; //System.out.print(temp[k]+""); } //System.out.println(); //选择下一个节点,要求不是已经走过,并且与i不同 j=selectmin(temp); //找出下一节点 row[i]=0;//行置0,表示已经选过 colable[j]=0;//列0,表示已经走过 path+="-->"+j; //System.out.println(i+"-->"+j); //System.out.println(distance[i][j]); s=s+distance[i][j]; i=j;//当前节点指向下一节点 } System.out.println("path: "+path); System.out.println("Totaldistance: "+s); } publicintselectmin(int[]p){ intj=0,m=p[0],k=0; //寻找第一个可用节点,注意最后一次寻找,没有可用节点 while(colable[j]==0){ j++; //System.out.print(j+""); if(j>=cityNum){ //无可用节点,说明已结束,最后一次为*-->0 m=p[0]; break; //或者直接return0; } else{ m=p[j]; } } //从可用节点J开始往后扫描,找出距离最小节点 for(;j if(colable[j]==1){ if(m>=p[j]){ m=p[j]; k=j; } } } returnk; } publicvoidprintinit(){ System.out.println("printbegin...."); for(inti=0;i for(intj=0;j System.out.print(distance[i][j]+""); } System.out.println(); } System.out.println("printend...."); } publicstaticvoidmain(String[]args)throwsIOException{ System.out.println("Start...."); Tsp1ts=newTsp1(15); ts.init("e: //data//data.txt"); //ts.printinit(); ts.solve(); } } packagetxTSP; importjava.io.BufferedReader; importjava.io.FileInputStream; importjava.io.IOException; importjava.io.InputStreamReader; publicclassTxTsp{ privateintcityNum;//城市数量 privateint[][]distance;//距离矩阵 privateint[]colable;//代表列,也表示是否走过,走过置0 privateint[]row;//代表行,选过置0 publicTxTsp(intn){ cityNum=n; } privatevoidinit(Stringfilename)throwsIOException{ //读取数据 int[]x; int[]y; Stringstrbuff; BufferedReaderdata=newBufferedReader(newInputStreamReader( newFileInputStream(filename))); distance=newint[cityNum][cityNum]; x=newint[cityNum]; y=newint[cityNum]; for(inti=0;i //读取一行数据,数据格式167341453 strbuff=data.readLine(); //字符分割 String[]strcol=strbuff.split(""); x[i]=Integer.valueOf(strcol[1]);//x坐标 y[i]=Integer.valueOf(strcol[2]);//y坐标 } data.close(); //计算距离矩阵 //,针对具体问题,距离计算方法也不一样,此处用的是att48作为案例,它有48个城市,距离计算方法为伪欧氏距离,最优值为10628 for(inti=0;i distance[i][i]=0;//对角线为0 for(intj=i+1;j doublerij=Math .sqrt(((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j]) *(y[i]-y[j]))/10.0); //四舍五入,取整 inttij=(int)Math.round(rij); if(tij distance[i][j]=tij+1; distance[j][i]=distance[i][j]; }else{ distance[i][j]=tij; distance[j][i]=distance[i][j]; } } } distance[cityNum-1][cityNum-1]=0; colable=newint[cityNum]; colable[0]=0; for(inti=1;i colable[i]=1; } row=newint[cityNum]; for(inti=0;i row[i]=1; } } publicvoidsolve(){ int[]temp=newint[cityNum]; Stringpath="0"; ints=0;//计算距离 inti=0;//当前节点 intj=0;//下一个节点 //默认从0开始 while(row[i]==1){ //复制一行 for(intk=0;k temp[k]=distance[i][k]; //System.out.print(temp[k]+""); } //System.out.println(); //选择下一个节点,要求不是已经走过,并且与i不同 j=selectmin(temp); //找出下一节点 row[i]=0;//行置0,表示已经选过 colable[j]=0;//列0,表示已经走过 path+="-->"+j; //System.out.println(i+"-->"+j); //System.out.println(distance[i][j]); s=s+distance[i][j]; i=j;//当前节点指向下一节点 } System.out.println("路径: "+path); System.out.println("总距离为: "+s); } publicintselectmin(int[]p){ intj=0,m=p[0],k=0; //寻找第一个可用节点,注意最后一次寻找,没有可用节点 while(colable[j]==0){ j++; //System.out.print(j+""); if(j>=cityNum){ //没有可用节点,说明已结束,最后一次为*-->0 m=p[0]; break; //或者直接return0; } else{ m=p[j]; } } //从可用节点J开始往后扫描,找出距离最小节点 for(;j if(colable[j]==1){ if(m>=p[j]){ m=p[j]; k=j; } } } returnk; } publicvoidprintinit(){ System.out.println("printbegin...."); for(inti=0;i for(intj=0;j System.out.print(distance[i][j]+""); } System.out.println(); } System.out.println("printend...."); } publicstaticvoidmain(String[]args)throwsIOException{ System.out.println("Start...."); TxTspts=newTxTsp(15); ts.init("c: //data.txt"); //ts.printinit(); ts.solve(); } } (2)模拟退火算法(25城市): 若J(Y(i+1))>=J(Y(i))(即移动后得到更优解),则总是接受该移动。 若J(Y(i+1)) 根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为: P(dE)=exp(dE/(kT))其中k是一个常数,exp表示自然指数,且dE<0。 这条公式说白了就是: 温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的 概率就越小。 又由于dE总是小于0(否则就不叫退火了),因此dE/kT<0,所以P(dE)的函数取值范围是(0,1)。 随着温度T的降低,P(dE)会逐渐降低。 我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。 importjava.io.BufferedReader; importjava.io.FileInputStream; importjava.io.IOException; importjava.io.InputStreamReader; importjava.util.Random; publicclassSA{ privateintcityNum;//城市数量,编码长度 privateintN;//每个温度迭代步长 privateintT;//降温次数 privatefloata;//降温系数 privatefloatt0;//初始温度 privateint[][]distance;//距离矩阵 privateintbestT;//最佳出现代数 privateint[]Ghh;//初始路径编码 privateintGhhEvaluation; privateint[]bestGh;//最好的路径编码 privateintbestEvaluation; privateint[]tempGhh;//存放临时编码 privateinttempEvaluation; privateRandomrandom; publicSA(){ } /** *constructorofGA * *@paramcn *城市数量 *@paramt *降温次数 *@paramn *每个温度迭代步长 *@paramtt *初始温度 *@paramaa *降温系数 * **/ publicSA(intcn,intn,intt,floattt,floataa){ cityNum=cn; N=n; T=t; t0=tt; a=aa; } //给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默 @SuppressWarnings("resource") /** *初始化Tabu算法类 *@paramfilename数据文件名,该文件存储所有城市节点坐标数据 *@throwsIOException */ privatevoidinit(Stringfilename)throwsIOException{ //读取数据 int[]x; int[]y; Stringstrbuff; BufferedReaderdata=newBufferedReader(newInputStreamReader( newFileInputStream(filename))); distance=newint[cityNum][cityNum]; x=newint[cityNum]; y=newint[cityNum]; for(inti=0;i //读取一行数据,数据格式167341453 strbuff=data.readLine(); //字符分割 String[]strcol=strbuff.split(""); x[i]=Integer.valueOf(strcol[1]);//x坐标 y[i]=Integer.valueOf(strcol[2]);//y坐标 } //计算距离矩阵 //,针对具体问题,距离计算方法也不一样,此处用的是att48作为案例,它有48个城市,距离计算方法为伪欧氏距离,最优值为10628 for(inti=0;i distance[i][i]=0;//对角线为0 for(intj=i+1;j doublerij=Math .sqrt(((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j]) *(y[i]-y[j]))/10.0); //四舍五入,取整 inttij=(int)Math.round(rij); if(tij distance[i][j]=tij+1; distance[j][i]=dist
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安交通大学 人工智能实验报告 人工智能 实验 报告