我有大量数据集,包含航班价格
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
答案 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列表计算距离。