TSP問題 遺傳演算法的實現
阿新 • • 發佈:2018-12-20
遺傳演算法由群體集合和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 } };