当前位置:文档之家› 遗传算法解决TSP问题,C 版(带注释)

遗传算法解决TSP问题,C 版(带注释)


{ CreateCitiesCircular();
CalculateBestPossibleRoute(); } //改变窗口坐标时 void Resize(const int new_width, const int new_Height);
//给一个有效的周游路径,返回该路径长度 double GetTourLength(const vector<int> &route);
//窗口定义大小
#define WINDOW_WIDTH 500
#define WINDOW_HEIGHT 500
//城市数量及城市在窗口显示的大小
#define NUM_CITIES
20
#define CITY_SIZE
5
//变异概率,交叉概率及种群数量
#define MUTATION_RATE 0.2
};
#endif
//五、一个其实没有用的头文件(StdAfx.h) #if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000_ _INCLUDED_) #define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDE D_
m_pMap = new CmapTSP(map_width, map_height, NumCities); CreateStartingPopulation();
} //析构函数 ~CgaTSP(){delete m_pMap;}
void Run(HWND hwnd);
void
Epoch();
//他的适应度分数 double dFitness;
//构造函数 SGenome ():dFitness(0){}
SGenome(int nc):dFitness(0) {
vecCities = GrabPermutation(nc); } //随机创建一个周游路径 vector<int> GrabPermutation (int &limit);
//限制大小 void Clamp(double &arg, double min, double max); void Clamp(int &arg, int min, int max);
#endif //三、地图头文件(CmapTSP)
#ifndef CMAPTSP_H #define CMAPTSP_H//如果没有定义那么就定义 ////////////////////////////////////////////////// //类名:CmapTSP.h // //描述:封装地图数据、城市坐标以及适应度计算。 ///////////////////////////////////////////////// #include <vector>
#include "mapTSP.h" #include "defines.h"
using namespace std;
//----------基因组结构体(包含旅行路径和其适应度函数)---------struct SGenome {
//周游城市路径,(基因组) vector<int> vecCities;
//把所有城市组成一个环形 void CreateCitiesCircular();
//用勾股定理计算两个城市 A 和 B 之间的距离 double CalculateA_to_B(const CoOrd &city1, const CoOrd &city2);
//该函数计算出排列成环形后的最佳路径,答案是显而易见的(环形多边形 周长)
//在此之前找到的最长周游路径 double m_dLongestRoute;
//种群中基因组的数目 int m_iPopSize;
//染色体长度 int m_iChromoLength;
//新一代中适应度分数最高的成员
int m_iFittestGenome;
//表明已经到了那一代 int m_iGeneration;
//在 GrabPermutation 中使用 bool TestNumber(const vector<int> &vec, const int &number);
};
//--------CgaTSP 类---------------
class CgaTSP { private:
//声明基因组实例 vector<SGenome> m_vecPopulation;
void CalculateBestPossibleRoute();
public: //城市坐标 vector<CoOrd> m_vecCityCoOrds;
//构造函数,当创建一个实例时,城市坐标即被创建,并计算出可能的最佳 路径
CmapTSP(int w, int h, int nc):m_MapWidth(w), m_MapHeight(h),m_NumCities(nc)
inline bool RandBool() {
if (RandInt(0,1)) return true;
else return false;
}
//-----定义一些方便的小功能包括:整形转字符型,浮点型转字符型--string itos(int arg); //converts an float to a std::string string ftos (float arg);
//------CmapTSP 类,封装地图数据,城市坐标,以及适应度计算---class CmapTSP { private:
//城市数目 int m_NumCities;
//地图长度和宽度 int m_MapWidth; int m_MapHeight;
//可能最好路径 double m_dBestPossibleRoute;
#define CROSSOVER_RATE 0.75
#define POP_SIZE
40
//倍数 #define NUM_BEST_TO_ADD 2
//最小容许误差 #define EPSILON
0.000001
#endif //二、一些用得到的小函数(utils.h) // utils.h: interface for the Cutils class. //头文件名 ////////////////////////////////////////////////////////////////////// #ifndef UTILS_H #define UTILS_H
//帮助了解长须当前是否进入绘图阶段 bool m_bStarted;
//交换变异(Exchange Mutation) void MutateEM(vector<int> &chromo);
//部分匹配杂交 void CrossoverPMX(const vector<int> &mum,
const vector<int> &dad, vector<int> &baby1, vector<int> &baby2);
//地图类的实例 CmapTSP* m_pMap;
//交叉及变异概率 double m_dMutationRate; double m_dCrossoverRate;
//整个种群的总适应度分数 double m_dTotalFitness;
//在此之前找到的最短路径 double m_dShortestRoute;
#endif
//////////////////////////////----------------源文件---------------///////////////////////////////-
//一、utils.cpp // utils.cpp: implementation of the Cutils class. // //////////////////////////////////////////////////////////////////////
SGenome& RouletteWheelSelection();
//适应度函数中用到的函数 void CalculatePopulationsFitness(); void CalculateBestWorstAvtot(); void Reset(); void CreateStartingPopulation();
#include <stdlib.h> #include <math.h> #include <sstream> #include <string> #include <iostream>
using namespace std; //--------定义一些随机函数--------
//----定义随机整数,随机[x,y]之间的整数--inline int RandInt(int x, int y) {
double BestPossibleRoute()const{return m_dBestPossibleRoute;} };
#endif
//四、遗传算法头文件(CgaTSP)
#ifndef CGATSP_H #define CGATSP_H
#include <vector> #include <windows.h> #include <fstream> #include <algorithm> #include <iostream>
相关主题