中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

如何使用Python輕松解決TSP問題(遺傳算法)

小云
125
2023-09-19 05:47:02
欄目: 編程語言

要使用Python解決旅行商問題(TSP)問題,可以使用遺傳算法。下面是一個簡單的步驟指南:

  1. 導入必要的庫:
import random
import numpy as np
  1. 創建一個包含城市坐標的數組。每個城市可以表示為一個二維坐標(x,y)。例如:
cities = np.array([[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]])
  1. 定義遺傳算法的相關參數,如種群大小、交叉率、變異率等:
population_size = 100
crossover_rate = 0.8
mutation_rate = 0.01
  1. 創建一個初始種群,其中每個個體表示一個可能的路徑。可以通過隨機排列城市來生成個體:
population = [np.random.permutation(len(cities)) for _ in range(population_size)]
  1. 定義一個適應度函數來計算每個個體的適應度。在TSP問題中,適應度可以定義為路徑的總長度。可以使用歐氏距離來計算兩個城市之間的距離:
def fitness(individual):
total_distance = 0
for i in range(len(individual)-1):
city1 = cities[individual[i]]
city2 = cities[individual[i+1]]
total_distance += np.linalg.norm(city1 - city2)
return total_distance
  1. 創建一個選擇函數來選擇父代用于交叉。可以使用輪盤賭選擇方法,其中較適應的個體具有更高的選擇概率:
def selection(population, fitness):
total_fitness = sum(fitness)
probabilities = [f/total_fitness for f in fitness]
parents = np.random.choice(population, size=2, p=probabilities)
return parents
  1. 創建一個交叉函數來生成子代。可以使用順序交叉,其中子代繼承一部分父代的基因:
def crossover(parents):
parent1, parent2 = parents
point = random.randint(0, len(parent1))
child = np.zeros(len(parent1))
child[:point] = parent1[:point]
for gene in parent2:
if gene not in child:
child[point] = gene
point += 1
return child
  1. 創建一個變異函數來對子代進行變異。可以通過交換兩個基因來進行變異:
def mutation(child):
if random.random() < mutation_rate:
point1, point2 = random.sample(range(len(child)), 2)
child[point1], child[point2] = child[point2], child[point1]
return child
  1. 運行主要的遺傳算法循環,直到達到停止條件(例如達到最大迭代次數或找到最優解)。在每一代中,選擇兩個父代,生成一個子代,然后對子代進行變異:
for generation in range(max_generations):
fitness_values = [fitness(individual) for individual in population]
best_individual = population[np.argmin(fitness_values)]
new_population = [best_individual]
while len(new_population) < population_size:
parents = selection(population, fitness_values)
child = crossover(parents)
child = mutation(child)
new_population.append(child)
population = new_population
  1. 打印最優解:
best_individual = population[np.argmin(fitness_values)]
best_path = [cities[i] for i in best_individual]
print("Best path:", best_path)

這只是一個簡單的示例,可以根據具體的需求進行修改和擴展。

0
和平县| 柘荣县| 嘉义县| 东阿县| 云浮市| 全州县| 谷城县| 扶沟县| 额敏县| 南乐县| 二手房| 汉寿县| 河间市| 石狮市| 平泉县| 连城县| 仙桃市| 资中县| 博客| 星座| 青州市| 盐源县| 临沧市| 乌鲁木齐县| 安溪县| 漠河县| 涟源市| 方正县| 隆化县| 扎鲁特旗| 新巴尔虎左旗| 耿马| 奇台县| 铜川市| 卫辉市| 同江市| 子洲县| 绥棱县| 罗平县| 大宁县| 信宜市|