代码 | 用ALNS框架求解一个TSP问题 - 代码详解
写在前面
前面好多篇文章,我们总算是把整个ALNS的代码框架给大家说明白了。不知道大家对整个框架了解了没有。不过打铁要趁热,心急了要吃热豆腐。今天就来实战一下,教大家怎么用ALNS的代码框架,求解一个老生常谈的TSP问题,so,get ready?
01 文件说明
整个项目由多个文件组成,为了大家更好了解各个文件的内容以及他们之间的关系,小编特地做了一份表格说明。
| 类名或文件名 |说明 |
| :------| :------ |
| main | 主文件 |
| TSPSolution| Solution的定义和各种相关操作 |
| TSP_LS| LocalSearch |
| TSP_Best_Insert| repair方法|
| TSP_Random_Insert| repair方法|
| TSP_History_Removal| destroy方法|
| TSP_Random_Removal| destroy方法|
| TSP_Worst_Removal| 主destroy方法|
02 主逻辑过程分析
这一篇文章主要分析该程序的主逻辑过程,代码中的相关模块看不懂没关系,后面会详细讲解到的。大家先知道这么一个东西就行了。代码和具体解释贴在下面了,该过程主要是生成相应的模块,并且组装进去然后run起来而已,还算蛮简单的了。
int main(int argc, char* argv[])
{
//构造TSP数据,100个点,坐标随机生成,这里你们可以按照自己的方式输入数据
double* x = new double[100];
double* y = new double[100];
for(int i = 0; i < 100; i++)
{
x[i] = 100*(static_cast<double>(rand()) / RAND_MAX);
y[i] = 100*(static_cast<double>(rand()) / RAND_MAX);
}
double** distances = new double*[100];
for(int i = 0; i < 100; i++)
{
distances[i] = new double[100];
for(int j = 0; j < 100; j++)
{
distances[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
}
//生成初始空解。参数是距离矩阵和城市数目
TSPSolution initialSol(distances,100);
//生成repair和destroy方法
TSP_Best_Insert bestI("Best Insertion");
TSP_Random_Insert randomI("Random Insertion");
TSP_Random_Removal randomR("Random Removal");
TSP_Worst_Removal worstR("Worst Removal");
TSP_History_Removal historyR("History Removal",100);
//对初始空解进行填充,形成初始解
randomI.repairSolution(dynamic_cast<ISolution&>(initialSol));
//加载相关参数
ALNS_Parameters alnsParam;
alnsParam.loadXMLParameters(".