网站大量收购独家精品文档,联系QQ:2885784924

模拟退火演算法-Read.pptVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
模拟退火演算法-Read.ppt

TSPSA 資工三 葉書豪 題目: 由使用者設定的城市,推銷員必須由某個城市出發,並經過所有城市而不得重複,最後回到原點,所走路徑需為最小長度. 演算法: 模擬退火演算法 Traveling Salesman Problem (TSP) 模擬退火演算法: procedure SIMULATED-ANNEALING begin INITIALIZE ( i start, c0, L0); k := 0; i := i start; repeat for l := 1 to Lk do begin GENERATE (j form Si); if f (j) = f (i) then I := j else if exp { [f (i) – f (j)] / ck} random [0, 1) then I := j end; k := k +1; CALCULATE_ LENGTH (Lk); CALCULATE_ CONTROL (Lk); until stop criterion end; #include iostream.h #include fstream.h #include stdio.h #include stdlib.h #include time.h #include math.h #define C_NUM 5//城市數 #define kt 0.789//衰減率參數 #define cmp_n 100000//計算的次數 #define kd 76//參數 const int d=C_NUM*(C_NUM-3)/2;//對角線路徑 void ANNEALING(int gg,int *f,int *d1); void CACULATE(int *kb,int gg,int *ks,double ki); bool ACCEPT(double r,double ft); void GENERATE(int *d1,int *t); void ANNEALING(int gg,int *f,int *d1)//退火動作,gg為原來路徑總 { //和,d1為原來的路徑 int kk[C_NUM]; double kti=kd; for(int i=0;iC_NUM;i++) {kk[i]=f[i]; }; for(int c1=0;c1cmp_n;c1++)//讓他跑cmp次,cmp為設定值 { GENERATE(d1,f);//產生另一個路徑 CACULATE(f,gg,kk,kti);//計算此路徑根原來路徑是否接受 kti=kti*kt;//把參數值變小 } for(int u=0;uC_NUM-1;u++)//印出找到的最短路徑 { coutf[u]-; } coutf[C_NUM-1]; cout找到的最短路徑為:gg; coutendl; } void CACULATE(int *kb,int gg,int *ks,double ki //kb為後來的路 {徑, int ss=0; for(int w=0;wC_NUM;w++) { ss=ss+kb[w];//ss為後來的路徑總和 } double t=ss-gg; if(t0) { for(int i=0;iC_NUM;i++) ks[i]=kb[i]; gg=ss; } else { if(ACCEPT(t,ki)!=0)//判斷當後來路徑大於原來時是否接受 { for(int i=0;iC_NUM;i++) ks[i]=kb[i]; gg=ss; }; ki=ki*kt;};//把參數值變小 }; bool ACCEPT(double r,double ft)//判斷是否接受此函數 { if(exp(-r/ft)(double)rand()/32768) return true; else return false; }; void GENERATE(int *d1,int *t)//產生另個一路徑,d1為所有路徑, {srand(time(0));//t為原來路徑 int p1; int p2; for(int i=C_NUM;iC_NUM+d;i++)//從原來路徑以後的數字隨 {//機挑一個來和前面的路徑隨機挑一個調換 for(int j=i+1;jC_NUM+d;j++) { if(d1[j]d1[i]) p2=d1[j]; else p2=d1[i]; } }; p1

文档评论(0)

18273502 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档