用DEAP解决TSP - 如何冻结第一个和最后一个城镇?

时间:2017-03-12 18:11:10

标签: python genetic-algorithm genetic-programming genetic deap

我有大量数据集,包含航班价格

CITY_ORIGIN, CITY_DESTINATION, PRICE

我想解决从CITY_START开始CITY_END开始,从N数组开始,通过最大CITIES_THROUGH个城市找到最便宜旅行的TSP问题。

我尝试使用TSP example代码使用DEAP python lib解决此任务。

如何在DEAP TSP示例中冻结第一个和最后一个城镇?

f.e。

CITY_START = "London"
CITY_END = "Paris"
CITY_THROUGH = ["Amsterdam", "Berlin", "Rome", "Barcelona"]
CITY_MAX = 2

所以我想限制算法在这样的可能解决方案子集中找到最便宜的航班:

London -> [CITY_MAX random cities from CITY_THROUGH] -> Paris

2 个答案:

答案 0 :(得分:0)

我建议将您的航班价格数据映射到嵌套词典:

flight_price = {"london": {"paris": 100}}

现在你只需要调整评估功能:

def evalTSP(individual):
    cities = ["london"] + individual + ["paris"]
    price = sum(flight_price[start][end] for start, end in zip(cities, cities[1:]))
    return price,


evalTSP([])
>>> 100

答案 1 :(得分:0)

我一直在基于以下条件为TSP解决方案的实现:

https://github.com/lmarti/evolutionary-computation-course/blob/master/AEC.03%20-%20Solving%20the%20TSP%20with%20GAs.ipynb

因此,对于我的实现,我有一个初始的城市列表,称为“城市”,我将每个人表示为与初始列表中每个城市位置相对应的索引列表。这意味着对于生成新个体,机制是根据numpy的random.permutation函数。但是有两种情况,一种是起点和终点不固定的情况,因此我们在工具箱中声明如下机制:

toolbox.register("indices", numpy.random.permutation, len(cities))
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.indices)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)  

但是,以防万一,初始“城市”列表的第一个和最后一个位置是固定的,那么您需要对其余所有位置进行排列,除了第一个和最后一个。因此,您需要声明以下机制:

permutableList = []
for row in range(1, len(cities)-1):
    permutableList.append(row-1)

toolbox.register("indices", numpy.random.permutation, permutableList)
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.indices)
toolbox.register("population", tools.initRepeat, list, toolbox.individual) 

然后,您只需要更改评估功能,以包括“城市”初始列表的开头和结尾,如下所示:

def create_tour(individual):

    listOfLocations = [list(cities)[e+1] for e in individual]
    # Adding first and last points to the tour
    listOfLocations.insert(0, cities[0])
    listOfLocations.append(cities[len(cities)-1])

    return listOfLocations

然后您基于listOfLocations列表计算距离。