當前位置:首頁 » 自駕旅行 » 旅行商問題演算法

旅行商問題演算法

發布時間: 2020-11-23 12:49:25

❶ 一段關於旅行商問題的代碼,可否解釋下演算法思想,及 swap 函數的作用

=151456456847

❷ 想用動態規劃演算法解決旅行商(TSP)問題,麻煩指點下方法和思路,詳細點,謝謝1

http://hi..com/__%D2%E5__/blog/item/d6326f1fcbdb4eff1ad576d8.html
http://liouwei20051000285.blog.163.com/blog/static/25236742009112242726527/
以上都是動態規劃解決TSP問題的,但是個人覺得不是太好,建議你去了解一下遺傳演算法,很容易懂,網上有很詳細的講解。希望你學到知識

❸ java人工蜂群演算法求解TSP問題

一、人工蜂群演算法的介紹

人工蜂群演算法(Artificial Bee Colony, ABC)是由Karaboga於2005年提出的一種新穎的基於群智能的全局優化演算法,其直觀背景來源於蜂群的采蜜行為,蜜蜂根據各自的分工進行不同的活動,並實現蜂群信息的共享和交流,從而找到問題的最優解。人工蜂群演算法屬於群智能演算法的一種。

二、人工蜂群演算法的原理

1、原理

標準的ABC演算法通過模擬實際蜜蜂的采蜜機制將人工蜂群分為3類: 采蜜蜂、觀察蜂和偵察蜂。整個蜂群的目標是尋找花蜜量最大的蜜源。在標準的ABC演算法中,采蜜蜂利用先前的蜜源信息尋找新的蜜源並與觀察蜂分享蜜源信息;觀察蜂在蜂房中等待並依據采蜜蜂分享的信息尋找新的蜜源;偵查蜂的任務是尋找一個新的有價值的蜜源,它們在蜂房附近隨機地尋找蜜源。

假設問題的解空間是

代碼:

[cpp]view plain

  • #include<iostream>

  • #include<time.h>

  • #include<stdlib.h>

  • #include<cmath>

  • #include<fstream>

  • #include<iomanip>

  • usingnamespacestd;

  • constintNP=40;//種群的規模,采蜜蜂+觀察蜂

  • constintFoodNumber=NP/2;//食物的數量,為采蜜蜂的數量

  • constintlimit=20;//限度,超過這個限度沒有更新采蜜蜂變成偵查蜂

  • constintmaxCycle=10000;//停止條件

  • /*****函數的特定參數*****/

  • constintD=2;//函數的參數個數

  • constdoublelb=-100;//函數的下界

  • constdoubleub=100;//函數的上界

  • doubleresult[maxCycle]={0};

  • /*****種群的定義****/

  • structBeeGroup

  • {

  • doublecode[D];//函數的維數

  • doubletrueFit;//記錄真實的最小值

  • doublefitness;

  • doublerfitness;//相對適應值比例

  • inttrail;//表示實驗的次數,用於與limit作比較

  • }Bee[FoodNumber];

  • BeeGroupNectarSource[FoodNumber];//蜜源,注意:一切的修改都是針對蜜源而言的

  • BeeGroupEmployedBee[FoodNumber];//采蜜蜂

  • BeeGroupOnLooker[FoodNumber];//觀察蜂

  • BeeGroupBestSource;//記錄最好蜜源

  • /*****函數的聲明*****/

  • doublerandom(double,double);//產生區間上的隨機數

  • voidinitilize();//初始化參數

  • doublecalculationTruefit(BeeGroup);//計算真實的函數值

  • doublecalculationFitness(double);//計算適應值

  • voidCalculateProbabilities();//計算輪盤賭的概率

  • voidevalueSource();//評價蜜源

  • voidsendEmployedBees();

  • voidsendOnlookerBees();

  • voidsendScoutBees();

  • voidMemorizeBestSource();

  • /*******主函數*******/

  • intmain()

  • {

  • ofstreamoutput;

  • output.open("dataABC.txt");

  • srand((unsigned)time(NULL));

  • initilize();//初始化

  • MemorizeBestSource();//保存最好的蜜源

  • //主要的循環

  • intgen=0;

  • while(gen<maxCycle)

  • {

  • sendEmployedBees();

  • CalculateProbabilities();

  • sendOnlookerBees();

  • MemorizeBestSource();

  • sendScoutBees();

  • MemorizeBestSource();

  • output<<setprecision(30)<<BestSource.trueFit<<endl;

  • gen++;

  • }

  • output.close();

  • cout<<"運行結束!!"<<endl;

  • return0;

  • }

  • /*****函數的實現****/

  • doublerandom(doublestart,doubleend)//隨機產生區間內的隨機數

  • {

  • returnstart+(end-start)*rand()/(RAND_MAX+1.0);

  • }

  • voidinitilize()//初始化參數

  • {

  • inti,j;

  • for(i=0;i<FoodNumber;i++)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=random(lb,ub);

  • EmployedBee[i].code[j]=NectarSource[i].code[j];

  • OnLooker[i].code[j]=NectarSource[i].code[j];

  • BestSource.code[j]=NectarSource[0].code[j];

  • }

  • /****蜜源的初始化*****/

  • NectarSource[i].trueFit=calculationTruefit(NectarSource[i]);

  • NectarSource[i].fitness=calculationFitness(NectarSource[i].trueFit);

  • NectarSource[i].rfitness=0;

  • NectarSource[i].trail=0;

  • /****采蜜蜂的初始化*****/

  • EmployedBee[i].trueFit=NectarSource[i].trueFit;

  • EmployedBee[i].fitness=NectarSource[i].fitness;

  • EmployedBee[i].rfitness=NectarSource[i].rfitness;

  • EmployedBee[i].trail=NectarSource[i].trail;

  • /****觀察蜂的初始化****/

  • OnLooker[i].trueFit=NectarSource[i].trueFit;

  • OnLooker[i].fitness=NectarSource[i].fitness;

  • OnLooker[i].rfitness=NectarSource[i].rfitness;

  • OnLooker[i].trail=NectarSource[i].trail;

  • }

  • /*****最優蜜源的初始化*****/

  • BestSource.trueFit=NectarSource[0].trueFit;

  • BestSource.fitness=NectarSource[0].fitness;

  • BestSource.rfitness=NectarSource[0].rfitness;

  • BestSource.trail=NectarSource[0].trail;

  • }

  • doublecalculationTruefit(BeeGroupbee)//計算真實的函數值

  • {

  • doubletruefit=0;

  • /******測試函數1******/

  • truefit=0.5+(sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))-0.5)

  • /((1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*(1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1])));

  • returntruefit;

  • }

  • doublecalculationFitness(doubletruefit)//計算適應值

  • {

  • doublefitnessResult=0;

  • if(truefit>=0)

  • {

  • fitnessResult=1/(truefit+1);

  • }else

  • {

  • fitnessResult=1+abs(truefit);

  • }

  • returnfitnessResult;

  • }

  • voidsendEmployedBees()//修改采蜜蜂的函數

  • {

  • inti,j,k;

  • intparam2change;//需要改變的維數

  • doubleRij;//[-1,1]之間的隨機數

  • for(i=0;i<FoodNumber;i++)

  • {

  • param2change=(int)random(0,D);//隨機選取需要改變的維數

  • /******選取不等於i的k********/

  • while(1)

  • {

  • k=(int)random(0,FoodNumber);

  • if(k!=i)

  • {

  • break;

  • }

  • }

  • for(j=0;j<D;j++)

  • {

  • EmployedBee[i].code[j]=NectarSource[i].code[j];

  • }

  • /*******采蜜蜂去更新信息*******/

  • Rij=random(-1,1);

  • EmployedBee[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);

  • /*******判斷是否越界********/

  • if(EmployedBee[i].code[param2change]>ub)

  • {

  • EmployedBee[i].code[param2change]=ub;

  • }

  • if(EmployedBee[i].code[param2change]<lb)

  • {

  • EmployedBee[i].code[param2change]=lb;

  • }

  • EmployedBee[i].trueFit=calculationTruefit(EmployedBee[i]);

  • EmployedBee[i].fitness=calculationFitness(EmployedBee[i].trueFit);

  • /******貪婪選擇策略*******/

  • if(EmployedBee[i].trueFit<NectarSource[i].trueFit)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=EmployedBee[i].code[j];

  • }

  • NectarSource[i].trail=0;

  • NectarSource[i].trueFit=EmployedBee[i].trueFit;

  • NectarSource[i].fitness=EmployedBee[i].fitness;

  • }else

  • {

  • NectarSource[i].trail++;

  • }

  • }

  • }

  • voidCalculateProbabilities()//計算輪盤賭的選擇概率

  • {

  • inti;

  • doublemaxfit;

  • maxfit=NectarSource[0].fitness;

  • for(i=1;i<FoodNumber;i++)

  • {

  • if(NectarSource[i].fitness>maxfit)

  • maxfit=NectarSource[i].fitness;

  • }

  • for(i=0;i<FoodNumber;i++)

  • {

  • NectarSource[i].rfitness=(0.9*(NectarSource[i].fitness/maxfit))+0.1;

  • }

  • }

  • voidsendOnlookerBees()//采蜜蜂與觀察蜂交流信息,觀察蜂更改信息

  • {

  • inti,j,t,k;

  • doubleR_choosed;//被選中的概率

  • intparam2change;//需要被改變的維數

  • doubleRij;//[-1,1]之間的隨機數

  • i=0;

  • t=0;

  • while(t<FoodNumber)

  • {

  • R_choosed=random(0,1);

  • if(R_choosed<NectarSource[i].rfitness)//根據被選擇的概率選擇

  • {

  • t++;

  • param2change=(int)random(0,D);

  • /******選取不等於i的k********/

  • while(1)

  • {

  • k=(int)random(0,FoodNumber);

  • if(k!=i)

  • {

  • break;

  • }

  • }

  • for(j=0;j<D;j++)

  • {

  • OnLooker[i].code[j]=NectarSource[i].code[j];

  • }

  • /****更新******/

  • Rij=random(-1,1);

  • OnLooker[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);

  • /*******判斷是否越界*******/

  • if(OnLooker[i].code[param2change]<lb)

  • {

  • OnLooker[i].code[param2change]=lb;

  • }

  • if(OnLooker[i].code[param2change]>ub)

  • {

  • OnLooker[i].code[param2change]=ub;

  • }

  • OnLooker[i].trueFit=calculationTruefit(OnLooker[i]);

  • OnLooker[i].fitness=calculationFitness(OnLooker[i].trueFit);

  • /****貪婪選擇策略******/

  • if(OnLooker[i].trueFit<NectarSource[i].trueFit)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=OnLooker[i].code[j];

  • }

  • NectarSource[i].trail=0;

  • NectarSource[i].trueFit=OnLooker[i].trueFit;

  • NectarSource[i].fitness=OnLooker[i].fitness;

  • }else

  • {

  • NectarSource[i].trail++;

  • }

  • }

  • i++;

  • if(i==FoodNumber)

  • {

  • i=0;

  • }

  • }

  • }

  • ❹ 旅行商問題在演算法上與什麼問題相似

    額,TSP問題可以用很多智能演算法,我再給你找找相關文獻吧,作為回報 迄今為止,這類問題中沒有一個找到有效演算法。 傾向於接受NP完全問題(NP-Complet或NPC)和NP難題(NP-Hard或NPH)不存在有效演算法這一猜想,認為這類問題的大型實例不能用精確算

    ❺ 對於大規模TSP問題,為什麼遍歷演算法不可行而貪心演算法可行

    TSP屬於NPC問題,一般只能靠近似演算法求出近似解,問題規模小的時候,可以內直接窮舉問題空間,得出容最優解,不過問題規模一大就不行了,問題空間是指數暴漲的,這時候只能退而求其次,求近似最優解,而對應的近似演算法中會大量使用貪心策略,所以其實不是可不可行的問題,貪心犧牲了 解的精度(求得的不一定是最優解),但換來了時間上可觀的節約(直接降到多項式)。

    ❻ C++演算法,動態規劃法實現TSP問題

    c++listmatrixiteratoriostream演算法
    [cpp] view plainprint?

    #include
    #include
    using namespace std ;
    typedef list<</SPAN>int> LISTINT;
    LISTINT listAnother;
    LISTINT list_result;
    int d[4][4]={{-1,3,6,7},{2,-1,8,6},{7,3,-1,5,},{7,3,7,-1}}; //路徑權值
    int matrix_length=4;
    int getPath(int n,LISTINT list_org)
    {
    LISTINT::iterator i;
    int minValue;
    if(n==1)
    {
    i=list_org.begin();
    minValue= d[*i-1][0];
    if(list_org.size()==matrix_length-1)
    {
    list_result=list_org;
    }
    }
    else
    {
    int temp;
    i=list_org.begin();
    temp=*i;
    list_org.erase(i);
    i=list_org.begin();
    minValue=d[temp-1][*(i)-1]+getPath(n-1,list_org);
    if(list_org.size()==matrix_length-1)
    {
    list_result=list_org;
    }
    for(int j=2;j
    {
    i=list_org.begin();
    for(int k=1;k
    {
    i++;
    }
    int tempvalue=*i;
    list_org.erase(i);
    list_org.push_front(tempvalue);
    i=list_org.begin();
    tempvalue=d[temp-1][*(i)-1]+getPath(n-1,list_org);
    if(tempvalue
    {
    if(list_org.size()==matrix_length-1)
    {
    list_result=list_org;
    }
    minValue=tempvalue;
    }
    }
    }
    return minValue;
    }
    int main(int argc, char* argv[])
    {
    LISTINT list_org;
    LISTINT::iterator h;
    list_org.push_front(4);
    list_org.push_front(3);
    list_org.push_front(2);
    list_org.push_front(1);
    cout<<"旅行商問題動態規劃演算法"<<endl;
    cout<<"路線長度的矩陣表示如下 (-1表示無限大)"<<endl;
    for(int j=0;j
    cout<<endl;
    for(int k=0;k
    cout<<" "<<d[j][k];
    }
    }
    cout<<endl;
    cout<<"計算結果:"<<getPath(4,list_org)<<endl;
    list_result.push_front(1);
    list_result.push_back(1);
    cout<<"要走的路徑:---->:";
    for (h = list_result.begin(); h != list_result.end(); ++h)
    cout << *h << " ";
    cout << endl;
    int i;
    cin>>i;
    return 0;
    }

    ❼ 假設哈密頓問題是NPC,證明:TSP(旅行商問題)屬於NP-hard問題(現代優化計算方法 邢文旬主編 P50第11題)

    首先HC是一個npc問題且是一個搜索問題,假設使用貪心策略的演算法A(·)可解HC得到一條哈密頓迴路。
    再利用無向圖G構造tsp的圖G',圖G中存在的邊權值設為1,圖G中不存在的邊權值設為X(X>1的整數)。
    這樣得到的一個TSP問題可使用演算法A(·)來解。
    圖靈規約條件:(1)問題1,問題2都是搜索問題;
    (2)求解問題1的演算法A(·)可求解問題2;

    (3)演算法A(問題1)時間復雜度是多項式時間,則演算法A(問題2)也是多項式時間;
    所以HC可以圖靈規約到這樣一個TSP問題實例。
    又因為HC是NPC類問題,可以圖靈規約到TSP,所以TSP是NP-hard問題

    熱點內容
    微山湖島旅遊攻略 發布:2021-03-16 21:45:18 瀏覽:387
    適合78月份國內旅遊的地方 發布:2021-03-16 21:42:27 瀏覽:6
    文化旅遊部單位 發布:2021-03-16 21:42:22 瀏覽:118
    深圳周邊游推薦免費的 發布:2021-03-16 21:42:18 瀏覽:696
    塑州旅遊景點 發布:2021-03-16 21:40:53 瀏覽:84
    道觀河風景旅遊區發展前景 發布:2021-03-16 21:39:53 瀏覽:658
    旅行社psd 發布:2021-03-16 21:39:03 瀏覽:174
    常州旅遊業發展現狀 發布:2021-03-16 21:35:14 瀏覽:330
    棋牌在線游戲必去797ag 發布:2021-03-16 21:33:30 瀏覽:217
    有四個旅遊團三條路線 發布:2021-03-16 21:33:30 瀏覽:164