前天,同学参加数学建模比赛,他们选的题目是垃圾分类处理与清运方案设计,其中他们要我帮他们写出一个能用最少花费遍历所有垃圾站点的一条路线。扎看一下,还以为是求出最段路径,直接用Dijkstra算法就可以处理了。但是仔细一想不对劲,这题目不是那么简单求出顶点之间的最优路径,还要类似一笔画一样,求出一条能一笔连到底的路线,当然若这样则现实要求比较苛刻,各个垃圾站点必须能够相通,即该图是强连通图。这样子,你从任一站点出发,应该会有唯一的最短路线。
我花了半天时间去研究,发现除了遍历所有路线之外别无他法。后来上网一查,原来这有点类似旅行商问题,但又不完全是。旅行商问题更难一点,它不要求图是强连通图,看似这类题目简单,其实但端点数目多了,求解极为复杂。当端点达到一定数目时候,如果要列举所有路径后再确定最佳行程,那么总路径数量之大,几乎难以计算出来。 但我这类问题,好像有人取得了突破,采用了“蚁群算法”,是Marco Dorigo于1992年在他的博士论文中提出。蚁群算法其实挺简单的,就是遍历所有路线,然后找出最优路线,最终就是采用那个方案了,这也是蚂蚁觅食的方式。基于这种思想,我写出了一下的代码,代码不难,难就难在如何遍历所有路线及判断最短路线,如果单单保存所有路线,这就对存储空间要求比较高了,但端点数目每增加一个,原先一条完整路线又会在原来路线上多出n-2条。这对内存挑战极大哦!! 所以我采用了回溯法思想。 以下是我个人代码。。。