收藏 分销(赏)

哈密顿图源代码.doc

上传人:s4****5z 文档编号:8096101 上传时间:2025-02-04 格式:DOC 页数:6 大小:35.50KB 下载积分:10 金币
下载 相关 举报
哈密顿图源代码.doc_第1页
第1页 / 共6页
哈密顿图源代码.doc_第2页
第2页 / 共6页


点击查看更多>>
资源描述
#include<iostream.h> #include<stdlib.h> #include<time.h> #include<math.h> #define citynumber 11 #define Q 100 #define p 0.5 #define NM2 1000 #define A 1 #define B 5 int ccdi=-1;//全局变量,用在myrand()中 float myrand()//产生0-1随机数,100个,每调用一次,结果不同 {srand(time(0)); float my[100]; ccdi++; if (ccdi==100) ccdi=0; for(int mi=0;mi<100;mi++) { float fav=rand()%10000; my[mi]=fav/10000;} return my[ccdi]; } double fpkij(double T[citynumber][citynumber],double n[citynumber][citynumber],int tabu[citynumber][citynumber],int k,int s,int i,int j ) //定义函数用于计算Pij { //double A=0.5,B=0.5; double sumup,pkij,sumdown; sumdown=0; double aT[citynumber][citynumber],bn[citynumber][citynumber]; for(int aTi=0;aTi<citynumber;aTi++) { for(int aTj=0;aTj<citynumber;aTj++) aT[aTi][aTj]=pow(T[aTi][aTj],A); } for(int bni=0;bni<citynumber;bni++) { for(int bnj=0;bnj<citynumber;bnj++) bn[bni][bnj]=pow(n[bni][bnj],B); } for (int can=0;can<citynumber;can++)//判断,除掉已经走过的城市 { for (int ci=0;ci<=s;ci++) if(can==tabu[k][ci]) { aT[i][can]=0;bn[i][can]=0; } } sumup=aT[i][j]*bn[i][j]; for(int tj=0;tj<citynumber;tj++) sumdown=aT[i][tj]*bn[i][tj]+sumdown; pkij=sumup/sumdown; return pkij; } void main() { double city[citynumber][2]={{0,1},{0,2},{2,2},{2,4},{1,3},{3,4},{4,7},{2,8},{3,9},{1,10}, {1,0}/*,{2,1},{3,0},{4,9},{5,2},{6,2},{7,1},{8,6},{9,0},{10,3}*/}; /*城市坐标*/ double d[citynumber][citynumber]; //L[j][k]是城市j to k距离 for(int j=0;j<citynumber;j++) { for (int k=0;k<citynumber;k++) { d[j][k]=sqrt((city[j][0]-city[k][0])*(city[j][0]-city[k][0])+(city[j][1]-city[k][1])*(city[j][1]-city[k][1])); // cout<<d[j][k]<<" "; }//cout<<"\n"; } /*计算距离,从j城市到k城市*/ /* for (int cj=0;cj<10;cj++) {float c=myrand(); cout<<c<<" "<<"\n";}*///输出随机数 double n[citynumber][citynumber]; for(int ni=0;ni<citynumber;ni++) { for(int j=0;j<citynumber;j++) { n[ni][j]=1/d[ni][j];//cout<<n[ni][j]<<" "; }//cout<<"\n"; } /*初始化visibility nij*/ double L[citynumber]; int shortest[citynumber]; double T[citynumber][citynumber]; for(int ti=0;ti<citynumber;ti++) { for (int j=0;j<citynumber;j++) { T[ti][j]=1; //cout<<T[ti][j]<<" "; }//cout<<"\n"; }/*初始化t*/ double changT[citynumber][citynumber]; //step2: for(int NC=0;NC<NM2;NC++) { for(int cti=0;cti<citynumber;cti++) { for (int j=0;j<citynumber;j++) { changT[cti][j]=0;//cout<<changT[cti][j]<<" "; }//cout<<"\n"; } /*初始化changT*/ int tabu[citynumber][citynumber];//tabu[k][s]表示第k只蚂蚁,第s次循环所在的城市 for (int tai=0;tai<citynumber;tai++) { for (int i=0;i<citynumber;i++) tabu[tai][i]=0; } for (int tabui1=0;tabui1<citynumber;tabui1++) tabu[tabui1][0]=tabui1; /*for (tai=0;tai<citynumber;tai++) { for (int i=0;i<citynumber;i++) cout<<tabu[tai][i]<<" ";cout<<"\n"; }*/ //初始化tabu for(int kk=0;kk<citynumber;kk++) L[kk]=0; //第三步开始 for(int s=0;s<citynumber-1;s++) { for(int k=0;k<citynumber;) { int ci,can; float sumpk=0; float pkij; float randnumber=myrand(); can=-1; hq2: can++; if (can==citynumber) can=0; for (ci=0;ci<=s;ci++) { if(can==tabu[k][ci]) goto hq2; } pkij=fpkij(T,n,tabu,k,s,tabu[k][s],can); sumpk=sumpk+pkij; if (randnumber<sumpk) ; else goto hq2; tabu[k][s+1]=can; k++; } } //第三步完成 /*for (tai=0;tai<citynumber;tai++) { for (int i=0;i<citynumber;i++) cout<<tabu[tai][i]<<" ";cout<<"\n"; }*///输出一个循环后的tabu[][] //第四步开始 for(int k4=0;k4<citynumber;k4++) { for(int s4=0,s44=0;s4<citynumber;s4++) { s44=s4+1; if (s44==citynumber) s44=0; L[k4]+=d[tabu[k4][s4]][tabu[k4][s44]]; }//cout<<L[k4]<<" "; }//计算L[k] float shortest1=0; int short2=0;//最短距离 for(int shorti=1;shorti<citynumber;shorti++ ) { shortest1=L[0]; if(L[shorti]<=shortest1) {shortest1=L[shorti];short2=shorti;} } //cout<<L[short2]<<"\n";cout<<short2<<"\n"; for(int shoi=0;shoi<citynumber;shoi++) { shortest[shoi]=tabu[short2][shoi]; //cout<<shortest[shoi]<<" "; } //cout<<"\n"; for(int k41=0;k41<citynumber;k41++) { for(int s41=0,ss=0;s41<citynumber;s41++) { ss=s41+1; if (ss==citynumber) ss=0; changT[tabu[k41][s41]][tabu[k41][ss]]+=Q/L[k41]; changT[tabu[k41][ss]][tabu[k41][s41]]=changT[tabu[k41][s41]][tabu[k41][ss]]; } } /* for(int cti4=0;cti4<citynumber;cti4++) { for (int j=0;j<citynumber;j++) {cout<<changT[cti4][j]<<" ";}cout<<"\n"; }*/ //第四步完 // 第五步开始 for(int i5=0;i5<citynumber;i5++) { for(int j5=0;j5<citynumber;j5++) { T[i5][j5]=p*T[i5][j5]+changT[i5][j5]; // cout<<T[i5][j5]<<" "; } //cout<<"\n"; } } for(int shoi1=0;shoi1<citynumber;shoi1++) { cout<<city[shortest[shoi1]][0]<<" "<<city[shortest[shoi1]][1]<<" "; } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服