设为首页 加入收藏

TOP

C++版遗传算法求解TSP(一)
2019-01-06 16:10:09 】 浏览:200
Tags:遗传 算法 求解 TSP

隔半年,再次有时间整理关于组合优化问题——旅行商问题(Traveling Salesman Problem, TSP),这次采用的是经典遗传算法(Genetic Algorithm, GA)进行求解,利用C++语言进行编程实现。


各种启发式算法的整体框架大致都由以下几个操作组成:(1)初始解的产生;(2)解的评价(评价函数);(3)扰动算子;此外,还可以加上程序原始数据的导入等操作。这些操作是多数启发式算法所通用的算子,基为此,此次在采用C++进行实现的时候,采用一个通用的 HeuristicOperator.h 头文件以及对应的 HeuristicOperator.cpp 类文件对这些操作进行集中放置,造好轮子,方便以后取用。


表1 HeuristicOperator中函数功能清单


之前在采用Matlab以及Java实现GA to solve TSP 时,考虑到程序的运行效率,通常会选用 array 来放置各种数据,众所周知,array的特点就是固定分配的连续物理地址进行数据的存储,然而对于不定长度的数据进行存储时,一般的方式是采用“多次少量”,即预先分配一定内存空间,等不够用了再分配一定的内存空间(多说一句,Matlab 中还可以采用以下两种方式:用 array=[]; 以及用cell实现存储不定长度数组,但效率不高)。而在C++ STL 中有一种神奇的数据类型vector容器,它既有着 array 的连续内存分配方式,又能不用指定数据存储长度,对于一组不同规模的数据集进行测试时,再也不用担心使用array时提醒必须预分配确定的存储空间了~~


以下为HeuristicOperator.h头文件:


#pragma once
#include<iostream>
#include<vector>
#include <algorithm>        // std::shuffle
#include <random>            // std::default_random_engine
#include<chrono>
using namespace std;


class HeuristicOperator {
public:
    vector<vector<double>> getCoord(void

);        //函数1:获取坐标函数
    vector<vector<double>> getDM(vector<vector<double>> Coord);        //函数2:获取距离矩阵函数
    vector<int> getInitS(int n);        //函数3:获取初始解函数
    double eva l(vector<int> S, vector<vector<double>> DM, int n);    //函数4:评价函数


    vector<double> bestS(vector<double> eva l, int Length);    //函数5:搜索范围内最优评价值及其相应的位置函数


    vector<int> RandPosition(int n);        //函数6:产生Sharking操作位置函数
    vector<int> Swap(vector<int> S, vector<int> RP);    //函数7:交换算子
    vector<int> Flip(vector<int> S, vector<int> RP);    //函数8:翻转算子
    vector<int> Insert(vector<int> S, vector<int> RP);    //函数9:插入算子
};


对应的HeuristicOperator.cpp类文件比较容易实现,在此不再赘述。本文所用算例为31城市的TSP问题,与Java版遗传算法求解TSP求解算例一致,具体数据如下:


1304    2312
3639    1315
4177    2244
3712    1399
3488    1535
3326    1556
3238    1229
4196    1004
4312    790
4386    570
3007    1970
2562    1756
2788    1491
2381    1676
1332    695
3715    1678
3918    2179
4061    2370
3780    2212
3676    2578
4029    2838
4263    2931
3429    1908
3507    2367
3394    2643
3439    3201
2935    3240
3140    3550
2545    2357
2778    2826
2370    2975


以下为遗传算法的主函数:


/*
    文件名:CppGATSP
    作者:Alex Xu
    地址:Dalian Maritime University
    描述:利用遗传算法求解TSP问题
    创建时间:2018年12月10日11点27分
*/


#include<iostream>
#include<vector>
#include<numeric>        //accumulate
#include<chrono>        //time
#include "HeuristicOperator.h"
using namespace std;
using namespace chrono;


//设置算法参数
# define  &nbs
编程开发网

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言歌星大奖赛代码解析 下一篇Linux下使用cmake生成动态链接库..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }