1. 程式人生 > >TSP問題 遺傳演算法的實現

TSP問題 遺傳演算法的實現

遺傳演算法由群體集合和3個主要操作組成 主要操作: 1. 選擇 2. 交叉 3. 變異 4. 增殖

其中選擇操作將群體中的優良個體選擇出來,而交叉操作和變異操作則根據交叉概率pc和變異概率pm對選擇出的個體進行不同的操作(遺傳演算法的核心),最後使用增殖操作使得種群數量保持穩定。

採用C++面向物件思想進行設計 1.城市的資料結構

class City{ 
public:
    double x, y;
    City(int nx, int ny){
        x = nx;
        y = ny;
    }
};

2.地圖的資料結構

class Map{
    int _cityNum;
    vector<City> _citySet;
public:
    Map(){
        _cityNum = 0;
    }

    //插入城市
    void insertCity(City c){
        _citySet.push_back(c);
        _cityNum++;
    }

    //返回城市數量
    const int getCityNum(){
        return _cityNum;
    }

    //獲得指定下標的城市
    const City getCity(int i){
        return _citySet[i];
    }
};

3.解的資料結構

class Solution{
    int _length;            //解的長度 比城市數量多1(首尾均為0)
    vector<int> _solution;  //解 記錄城市下標
    Map _map;
    //計算兩個城市的距離
    const double _calculateDistance(const City &a, const City &b){
        return ((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
    };
public:
    Solution(Map &map){
        _map = map;
        _length = _map.getCityNum() + 1;
        for(int i = 0; i < _length - 1; i++) {
            _solution.push_back(i);
        }
        _solution.push_back(0);   //回到原點
        randomSolution();
    }
    //初始化 使解隨機
    void randomSolution(){
        for(int i = 1; i < _length - 2; i++){
            int index = rand()%(_length - 2) + 1;
            if(i != index) swap(_solution[i], _solution[index]);
        }
    }

    void printSolution(){
        for(int i = 0; i < _length; i++){
            cout << _solution[i] << " ";
        }
        cout << endl;
    }

    //計算解的值
    const double evalute(){
        double sumOfDistance = 0;
        City preCity = _map.getCity(_solution[0]);
        for(int i = 1; i < _length; i++){
            City nowCity = _map.getCity(_solution[i]);
            double dis = _calculateDistance(preCity, nowCity);
            sumOfDistance += dis;
            preCity = nowCity;
        }
        return sumOfDistance;
    }
};

4.遺傳演算法主體

/*
    以輪盤賭方式計算適應度
*/
class GA{
    vector<Solution> _solutionSet;
public:
    double pc = 0.5; //雜交概率
    double pm = 0.5; //變異概率
    GA(vector<Solution> solutionSet, Map m){
        _solutionSet = solutionSet;
    }

    void selection(){
        //wait for implememt
    }

    void crossover(){
        //wait for implememt
    }

    void mutation(){
        //wait for implememt
    }
};