C++:蚁群算法解决TSP(C++多线程版)

TSP问题:旅行商问题,最短回路。

这里采用att48数据,邻接矩阵全部取整数,原数据放在文后。

解决代码如下:

//#define TEST_INPUT
//#define TEST_T
//#define TEST_ANT
//#define TEST_VALUE

#include<cstdio>
#include<cstring>
#include<thread>
#include<vector>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<cmath>

using namespace std;

#define eps 0.000001 //浮点数精度
#define maxn 50 //最大支持50座城市


mutex lock;             //锁


int city = 48;          //城市数量
int num = 1000;       //蚂蚁数量
int iteration = 100;          //迭代次数
double alpha = 1;           //信息素比重
double beta = 2;            //开销比重
double evaporation = 0.997;   //蒸发速率
double Q = 100;             //信息素增加量


int G[maxn+2][maxn+2];      //开销,城市编号从1开始
double D[maxn+2][maxn+2];   //开销倒数
double T[maxn+2][maxn+2];   //信息素


int ans = 0x7fffffff;   //最优解
vector<int> res;        //最优路径


//print the result
void output()
{
    printf("the shortest circle: ");
    for(vector<int>::iterator p=res.begin();p!=res.end();p++)
    {
        printf("%d%s",*p,p==res.end()-1?"\n":" ");
    }
    printf("the shortest circle cost: %d\n",ans);
}

//output to the file
void output_file()
{
    FILE* f = fopen("output.txt","w");
    fprintf(f,"%d\n",ans);
    for(vector<int>::iterator p=res.begin();p!=res.end();p++)
    {
        fprintf(f,"%d%s",*p,p==res.end()-1?"\n":" ");
    }
    fclose(f);
}

//print the and T
void print_T()
{
    printf("\nT:\n");
    for(int i=1;i<city+1;i++)
    {
        for(int j=1;j<city+1;j++)
        {
            printf("%f%s",T[i][j],j==city?"\n":" ");
        }
    }
}

//初始化
void init()
{
    memset(G,0,sizeof(G));
    memset(D,0,sizeof(D));
    memset(T,0,sizeof(T));
    res.clear();
    FILE* f = NULL;
    f = fopen("att48_d.txt","r");


#ifdef TEST_INPUT
    fclose(f);
    f = fopen("input.txt","r");
    city = 9;
    num = 100;
    iteration = 100;
#endif

    for(int i=1;i<city+1;i++)
    {
        for(int j=1;j<city+1;j++)
        {
            fscanf(f,"%d",&G[i][j]);
        }
    }
    fclose(f);

    for(int i=1;i<city+1;i++)
    {
        for(int j=1;j<city+1;j++)
        {
            if(i==j) continue;
            D[i][j] = 1.0/G[i][j];       //初始D为开销的倒数
            T[i][j] = 1.0;              //初始信息素T为1
        }
    }
}


//[x,y]随机整数
int get_random_int(int x,int y)
{
    return (int)rand()%(y-x+1)+x;
}


//[x,y]随机小数
double get_random_float(int x,int y)
{
    return (double)rand()/(RAND_MAX)*(y-x) + x;
}


//蚂蚁
void ant(int id)
{
    vector<int> A;                                      //已经访问过
    vector<int> B;                                      //需要访问
    int s = get_random_int(1,city);
    A.push_back(s);                                     //随机选择起始城市
    for(int i=1;i<city+1;i++) if(i!=s) B.push_back(i);  //待访问城市列表

    while(!B.empty())
    {
        double sum = 0;
        double best_v = 0;
        vector<int>::iterator best_city;

        lock.lock();

        //获取所有去向的评估值之和
        for(vector<int>::iterator p=B.begin();p!=B.end();p++) sum+=(pow(T[s][*p],alpha)*pow(D[s][*p],beta));

        //评估每一个需要被访问的城市
        for(vector<int>::iterator p=B.begin();p!=B.end();p++) {
            //当前城市
            int c = *p;

            //当前城市评估值
            double v = pow(T[s][c], alpha) * pow(D[s][c], beta) / sum;

            if (v > best_v) {
                best_city = p;
                best_v = v;

            }

            //评估值越大的城市越有几率成为下一个访问城市
            double r = get_random_float(0, 1);

#ifdef TEST_VALUE
            printf("ant:%d last:%d now:%d r:%f v:%f\n", id, *(A.end() - 1), c, r, v);
#endif
            if (r <= v + eps) {                         //这个比较值需要修改
                A.push_back(c);
                B.erase(p);
                break;
            }
        }

        lock.unlock();
    }

    //蚂蚁走完了所有城市
    int sum = 0;

    //获取路径总花费
    for(vector<int>::iterator p=A.begin()+1;p!=A.end();p++)
    {
        sum+=G[*(p-1)][*p];

#ifdef TEST_ANT
        printf("ant:%d sum:%d s:%d t:%d\n",id,sum,now,*p);
#endif

    }
    sum+=G[*(A.end()-1)][*(A.begin())];

#ifdef TEST_ANT
    printf("ant:%d sum:%d s:%d t:%d\n",id,sum,*(A.end()-1),*(A.begin()));
#endif

    //更新信息素
    lock.lock();
    for(vector<int>::iterator p=A.begin()+1;p!=A.end();p++)
    {
        T[*(p-1)][*p]+=(Q/sum);
    }
    T[*(A.end()-1)][*(A.begin())]+=(Q/sum);

    //如果当前最佳路径为空,则用当前路径初始化最佳路径
    if(res.empty())
    {
        res = A;
        ans = sum;
    }
    else if(sum < ans)
    {
        res = A;
        ans = sum;
    }

#ifdef TEST_T
    printf("\nant:%d\n",id);
    print_T();
#endif

    lock.unlock();
}


int main()
{
    srand((unsigned)time(0));
    init();
    for(int k=0;k<iteration;k++)
    {
#ifdef TEST_T
        printf("iteration:%d\n",k);
#endif

        vector<thread> t;
        for(int i=0;i<num;i++) t.push_back(thread(ant,i));
        for(int i=0;i<num;i++) t[i].join();

        for(int i=1;i<city+1;i++)
        {
            for(int j=1;j<city+1;j++)
            {
                T[i][j]*=evaporation;
            }
        }
    }
    output();
    output_file();
    return 0;
}

att48_d.txt数据:

         0      4727      1205      6363      3657      3130      2414       563       463      5654      1713      1604      2368      2201      1290      1004      3833      2258      3419      2267      2957       720      1700      5279      2578      6076      3465      2654      3625      3115      1574      3951      1748      2142      6755      2383      3306      1029      3530       825      2188      4820      3489      1947      6835      1542      2379      3744
      4727         0      3588      2012      1842      6977      6501      5187      5028      2327      4148      4723      3635      3125      4907      3930      7463      6338      7243      5105      4043      4022      3677      2863      3106      1850      7173      6630      1204      6814      6001      3447      5253      2656      3123      6274      7183      5622      3085      4564      2756      1591      7027      6186      3472      5461      4390      2088
      1205      3588         0      5163      2458      3678      3071      1742      1444      4462      1184      1520      1498      1103      1501       951      4298      2903      3967      2169      2209       652       828      4136      1518      4873      3954      3254      2446      3581      2441      2960      1966       950      5564      2916      3878      2035      2482      1027      1395      3617      3891      2686      5661      2023      1867      2560
      6363      2012      5163         0      2799      8064      7727      6878      6581      1402      5366      5946      4679      4378      6225      5709      8417      7578      8296      6135      4802      5707      4982      2322      4178       320      8186      7800      2778      7859      7408      3763      6461      4223      1427      7451      8263      7131      3669      6011      4638      1681      7987      7502      1877      6758      5360      2844
      3657      1842      2458      2799         0      5330      4946      4200      3824      2012      2573      3157      1924      1580      3427      3179      5749      4793      5577      3409      2223      3066      2185      1860      1401      2491      5486      5035       894      5141      4611      1669      3677      1590      3113      4682      5533      4352      1252      3227      2426      1169      5313      4706      3241      3962      2651       304
      3130      6977      3678      8064      5330         0       743      3209      2670      6929      2831      2266      3407      3854      2178      4076       727       881       293      1930      3310      3672      3315      6199      3932      7745       365       482      5774       261      1659      4513      1746      4431      7910       769       207      2225      4435      2681      5053      6384       550      1224      7805      1670      2704      5230
      2414      6501      3071      7727      4946       743         0      2468      1952      6673      2380      1795      3051      3405      1604      3382      1469       168      1020      1681      3110      2993      2827      6009      3552      7412      1104       267      5300       821       916      4348      1270      3890      7698       332       900      1484      4185      2049      4415      6051      1219       482      7635      1054      2432      4884
       563      5187      1742      6878      4200      3209      2468         0       718      6203      2241      2051      2920      2762      1687      1304      3932      2331      3487      2669      3487      1175      2260      5840      3141      6596      3563      2728      4120      3240      1559      4507      2082      2658      7304      2512      3364       985      4091      1319      2544      5358      3632      1987      7391      1785      2879      4296
       463      5028      1444      6581      3824      2670      1952       718         0      5789      1602      1343      2330      2291       970      1451      3376      1796      2959      1951      2835      1112      1725      5346      2628      6285      3007      2193      3889      2661      1122      3920      1372      2391      6883      1927      2845       611      3543       676      2590      4993      3039      1486      6934      1112      2196      3876
      5654      2327      4462      1402      2012      6929      6673      6203      5789         0      4392      4947      3648      3501      5274      5183      7216      6535      7140      5022      3621      5077      4090       922      3207      1131      7014      6714      2437      6707      6477      2476      5432      3599      1102      6376      7121      6284      2497      5160      4318       937      6795      6507      1268      5773      4249      1914
      1713      4148      1184      5366      2573      2831      2380      2241      1602      4392         0       586       766      1029       883      2040      3353      2224      3100      1049      1246      1625       503      3841      1196      5054      3042      2488      2945      2676      2087      2331      1114      1650      5459      2132      3037      1958      1997       931      2513      3701      2923      2137      5459      1394       711      2534
      1604      4723      1520      5946      3157      2266      1795      2051      1343      4947       586         0      1299      1612       406      2208      2824      1639      2542       694      1586      1767      1050      4357      1770      5633      2498      1907      3520      2128      1558      2778       531      2171      6003      1552      2472      1538      2506       791      2912      4277      2403      1564      5983       827       892      3109
      2368      3635      1498      4679      1924      3407      3051      2920      2330      3648       766      1299         0       646      1642      2446      3840      2905      3655      1488       730      2096       697      3076       533      4363      3567      3122      2453      3219      2842      1592      1791      1480      4706      2772      3610      2721      1232      1656      2550      3001      3403      2860      4697      2126       756      1836
      2201      3125      1103      4378      1580      3854      3405      2762      2291      3501      1029      1612       646         0      1853      2026      4349      3247      4119      1997      1341      1753       606      3078       419      4070      4052      3517      1923      3690      3032      1866      2142       838      4593      3161      4060      2788      1380      1663      1932      2736      3915      3138      4647      2395      1351      1592
      1290      4907      1501      6225      3427      2178      1604      1687       970      5274       883       406      1642      1853         0      2029      2803      1438      2466       986      1987      1593      1253      4716      2072      5915      2454      1764      3710      2082      1204      3164       497      2287      6342      1419      2379      1134      2867       554      2885      4569      2405      1289      6338       555      1297      3406
      1004      3930       951      5709      3179      4076      3382      1304      1451      5183      2040      2208      2446      2026      2029         0      4759      3220      4368      2900      3151       442      1765      4960      2444      5443      4396      3610      2932      4034      2572      3891      2525      1590      6278      3313      4261      2033      3398      1476      1241      4287      4390      2928      6419      2428      2749      3337
      3833      7463      4298      8417      5749       727      1469      3932      3376      7216      3353      2824      3840      4349      2803      4759         0      1601       477      2359      3617      4345      3851      6433      4372      8098       370      1206      6267       726      2384      4754      2335      4991      8148      1452       609      2949      4752      3331      5687      6746       437      1948      8005      2334      3098      5618
      2258      6338      2903      7578      4793       881       168      2331      1796      6535      2224      1639      2905      3247      1438      3220      1601         0      1165      1563      2988      2829      2666      5882      3401      7263      1233       399      5138       923       794      4227      1117      3724      7565       286      1049      1348      4051      1881      4248      5903      1322       355      7508       887      2302      4736
      3419      7243      3967      8296      5577       293      1020      3487      2959      7140      3100      2542      3655      4119      2466      4368       477      1165         0      2170      3520      3965      3588      6393      4183      7977       202       767      6041       438      1932      4706      2027      4711      8107      1061       132      2503      4652      2972      5344      6617       486      1501      7989      1962      2939      5469
      2267      5105      2169      6135      3409      1930      1681      2669      1951      5022      1049       694      1488      1997       986      2900      2359      1563      2170         0      1430      2460      1547      4333      2019      5817      2079      1694      3910      1733      1813      2668       654      2694      6029      1366      2130      1991      2525      1474      3542      4455      1923      1641      5957      1071       777      3302
      2957      4043      2209      4802      2223      3310      3110      3487      2835      3621      1246      1586       730      1341      1987      3151      3617      2988      3520      1430         0      2779      1387      2905      1062      4482      3398      3119      2922      3087      3115      1240      1953      2175      4607      2796      3501      3119      1136      2173      3268      3136      3189      3029      4527      2355       711      2042
       720      4022       652      5707      3066      3672      2993      1175      1112      5077      1625      1767      2096      1753      1593       442      4345      2829      3965      2460      2779         0      1401      4781      2166      5427      3984      3212      2946      3620      2224      3603      2089      1496      6178      2906      3861      1719      3132      1040      1479      4211      3969      2553      6290      2012      2336      3189
      1700      3677       828      4982      2185      3315      2827      2260      1725      4090       503      1050       697       606      1253      1765      3851      2666      3588      1547      1387      1401         0      3621       903      4675      3537      2954      2475      3169      2427      2254      1578      1148      5177      2598      3521      2194      1833      1074      2054      3340      3423      2541      5213      1801      1077      2190
      5279      2863      4136      2322      1860      6199      6009      5840      5346       922      3841      4357      3076      3078      4716      4960      6433      5882      6393      4333      2905      4781      3621         0      2718      2042      6254      6024      2569      5966      5913      1687      4807      3384      1716      5699      6384      5787      1852      4687      4285      1272      6022      5892      1629      5178      3581      1639
      2578      3106      1518      4178      1401      3932      3552      3141      2628      3207      1196      1770       533       419      2072      2444      4372      3401      4183      2019      1062      2166       903      2718         0      3864      4097      3635      1932      3748      3274      1448      2284      1164      4286      3283      4136      3086       967      1973      2285      2507      3935      3331      4312      2589      1284      1340
      6076      1850      4873       320      2491      7745      7412      6596      6285      1131      5054      5633      4363      4070      5915      5443      8098      7263      7977      5817      4482      5427      4675      2042      3864         0      7866      7483      2515      7539      7101      3449      6146      3938      1375      7134      7944      6831      3349      5709      4397      1363      7667      7190      1798      6446      5041      2528
      3465      7173      3954      8186      5486       365      1104      3563      3007      7014      3042      2498      3567      4052      2454      4396       370      1233       202      2079      3398      3984      3537      6254      4097      7866         0       839      5973       374      2019      4569      1996      4669      7970      1085       305      2581      4532      2976      5339      6509       287      1581      7844      1974      2838      5369
      2654      6630      3254      7800      5035       482       267      2728      2193      6714      2488      1907      3122      3517      1764      3610      1206       399       767      1694      3119      3212      2954      6024      3635      7483       839         0      5427       558      1181      4349      1377      4044      7723       356       653      1744      4218      2241      4614      6121       955       743      7644      1231      2465      4957
      3625      1204      2446      2778       894      5774      5300      4120      3889      2437      2945      3520      2453      1923      3710      2932      6267      5138      6041      3910      2922      2946      2475      2569      1932      2515      5973      5427         0      5612      4824      2550      4050      1498      3476      5071      5980      4470      2096      3388      1911      1501      5831      4994      3704      4264      3209      1196
      3115      6814      3581      7859      5141       261       821      3240      2661      6707      2676      2128      3219      3690      2082      4034       726       923       438      1733      3087      3620      3169      5966      3748      7539       374       558      5612         0      1716      4280      1624      4298      7679       735       420      2263      4216      2606      4967      6179       400      1277      7567      1609      2501      5032
      1574      6001      2441      7408      4611      1659       916      1559      1122      6477      2087      1558      2842      3032      1204      2572      2384       794      1932      1813      3115      2224      2427      5913      3274      7101      2019      1181      4824      1716         0      4330      1180      3346      7545      1023      1808       578      4062      1438      3693      5763      2115       440      7537       763      2404      4603
      3951      3447      2960      3763      1669      4513      4348      4507      3920      2476      2331      2778      1592      1866      3164      3891      4754      4227      4706      2668      1240      3603      2254      1687      1448      3449      4569      4349      2550      4280      4330         0      3184      2510      3402      4031      4698      4281       533      3245      3612      2187      4339      4265      3296      3576      1941      1381
      1748      5253      1966      6461      3677      1746      1270      2082      1372      5432      1114       531      1791      2142       497      2525      2335      1117      2027       654      1953      2089      1578      4807      2284      6146      1996      1377      4050      1624      1180      3184         0      2685      6475      1022      1952      1341      2963      1050      3358      4787      1926      1086      6436       422      1244      3619
      2142      2656       950      4223      1590      4431      3890      2658      2391      3599      1650      2171      1480       838      2287      1590      4991      3724      4711      2694      2175      1496      1148      3384      1164      3938      4669      4044      1498      4298      3346      2510      2685         0      4697      3693      4636      2975      1981      1909      1124      2718      4565      3548      4830      2839      2140      1751
      6755      3123      5564      1427      3113      7910      7698      7304      6883      1102      5459      6003      4706      4593      6342      6278      8148      7565      8107      6029      4607      6178      5177      1716      4286      1375      7970      7723      3476      7679      7545      3402      6475      4697         0      7393      8097      7370      3515      6249      5379      2001      7738      7556       461      6829      5267      3013
      2383      6274      2916      7451      4682       769       332      2512      1927      6376      2132      1552      2772      3161      1419      3313      1452       286      1061      1366      2796      2906      2598      5699      3283      7134      1085       356      5071       735      1023      4031      1022      3693      7393         0       965      1542      3883      1913      4286      5772      1121       600      7322       902      2128      4608
      3306      7183      3878      8263      5533       207       900      3364      2845      7121      3037      2472      3610      4060      2379      4261       609      1049       132      2130      3501      3861      3521      6384      4136      7944       305       653      5980       420      1808      4698      1952      4636      8097       965         0      2380      4629      2877      5250      6583       570      1380      7986      1866      2904      5432
      1029      5622      2035      7131      4352      2225      1484       985       611      6284      1958      1538      2721      2788      1134      2033      2949      1348      2503      1991      3119      1719      2194      5787      3086      6831      2581      1744      4470      2263       578      4281      1341      2975      7370      1542      2380         0      3952      1127      3197      5518      2658      1002      7395       951      2429      4380
      3530      3085      2482      3669      1252      4435      4185      4091      3543      2497      1997      2506      1232      1380      2867      3398      4752      4051      4652      2525      1136      3132      1833      1852       967      3349      4532      4218      2096      4216      4062       533      2963      1981      3515      3883      4629      3952         0      2873      3080      2012      4324      4046      3478      3328      1755      1000
       825      4564      1027      6011      3227      2681      2049      1319       676      5160       931       791      1656      1663       554      1476      3331      1881      2972      1474      2173      1040      1074      4687      1973      5709      2976      2241      3388      2606      1438      3245      1050      1909      6249      1913      2877      1127      2873         0      2374      4392      2943      1659      6285      1012      1563      3254
      2188      2756      1395      4638      2426      5053      4415      2544      2590      4318      2513      2912      2550      1932      2885      1241      5687      4248      5344      3542      3268      1479      2054      4285      2285      4397      5339      4614      1911      4967      3693      3612      3358      1124      5379      4286      5250      3197      3080      2374         0      3386      5284      3997      5585      3386      3125      2664
      4820      1591      3617      1681      1169      6384      6051      5358      4993       937      3701      4277      3001      2736      4569      4287      6746      5903      6617      4455      3136      4211      3340      1272      2507      1363      6509      6121      1501      6179      5763      2187      4787      2718      2001      5772      6583      5518      2012      4392      3386         0      6314      5837      2205      5095      3680      1169
      3489      7027      3891      7987      5313       550      1219      3632      3039      6795      2923      2403      3403      3915      2405      4390       437      1322       486      1923      3189      3969      3423      6022      3935      7667       287       955      5831       400      2115      4339      1926      4565      7738      1121       570      2658      4324      2943      5284      6314         0      1676      7603      1964      2662      5184
      1947      6186      2686      7502      4706      1224       482      1987      1486      6507      2137      1564      2860      3138      1289      2928      1948       355      1501      1641      3029      2553      2541      5892      3331      7190      1581       743      4994      1277       440      4265      1086      3548      7556       600      1380      1002      4046      1659      3997      5837      1676         0      7521       744      2325      4670
      6835      3472      5661      1877      3241      7805      7635      7391      6934      1268      5459      5983      4697      4647      6338      6419      8005      7508      7989      5957      4527      6290      5213      1629      4312      1798      7844      7644      3704      7567      7537      3296      6436      4830       461      7322      7986      7395      3478      6285      5585      2205      7603      7521         0      6805      5208      3102
      1542      5461      2023      6758      3962      1670      1054      1785      1112      5773      1394       827      2126      2395       555      2428      2334       887      1962      1071      2355      2012      1801      5178      2589      6446      1974      1231      4264      1609       763      3576       422      2839      6829       902      1866       951      3328      1012      3386      5095      1964       744      6805         0      1644      3928
      2379      4390      1867      5360      2651      2704      2432      2879      2196      4249       711       892       756      1351      1297      2749      3098      2302      2939       777       711      2336      1077      3581      1284      5041      2838      2465      3209      2501      2404      1941      1244      2140      5267      2128      2904      2429      1755      1563      3125      3680      2662      2325      5208      1644         0      2532
      3744      2088      2560      2844       304      5230      4884      4296      3876      1914      2534      3109      1836      1592      3406      3337      5618      4736      5469      3302      2042      3189      2190      1639      1340      2528      5369      4957      1196      5032      4603      1381      3619      1751      3013      4608      5432      4380      1000      3254      2664      1169      5184      4670      3102      3928      2532         0
    原文作者:蚁群算法
    原文地址: https://blog.csdn.net/ShellDawn/article/details/80613132
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞