提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
—遗传算法
前言
`
代码如下(示例):
import numpy as np
import pandas as pd
tsp_file_path = ‘berlin52.tsp’
df = pd.read_csv(tsp_file_path, delim_whitespace=True, skiprows=6, names=[‘Node’, ‘X’, ‘Y’])
df=df.drop(df.index[-1]) #删除最后一行
打印DataFrame,显示节点坐标信息
#print(df)
node_coordinates = df[[‘X’, ‘Y’]].to_numpy()
计算节点之间的数量
num_nodes = len(node_coordinates)
创建一个二维矩阵来存储节点之间的距离
distance_matrix = np.zeros((num_nodes, num_nodes))
使用嵌套循环计算节点之间的距离并填充矩阵
for i in range(num_nodes):
for j in range(num_nodes):
if i != j:
distance_matrix[i][j] = np.sqrt((node_coordinates[i][0] - node_coordinates[j][0])**2 +
(node_coordinates[i][1] - node_coordinates[j][1])**2)
创建一个 Pandas DataFrame 来显示距离矩阵
pd.set_option(‘display.max_columns’,None)
distance_matrix_df = pd.DataFrame(distance_matrix, columns=range(num_nodes), index=range(num_nodes))
打印距离矩阵
print(distance_matrix_df)
假设 distance_matrix_df 包含距离矩阵
output_file_path = ‘distance_matrix.csv’
使用 Pandas 将 DataFrame 保存为 CSV 文件
distance_matrix_df.to_csv(output_file_path, index=False)
import numpy as np
import random
遗传算法参数
population_size = 50
num_generations = 1000
mutation_rate = 0.01
初始化种群
def initialize_population(population_size, num_nodes):
population = [list(range(num_nodes)) for _ in range(population_size)]
for i in range(population_size):
random.shuffle(population[i])
return population
计算适应度(路径长度)
def fitness(individual, distance_matrix):
total_distance = 0
num_nodes = len(individual)
for i in range(num_nodes - 1):
total_distance += distance_matrix[individual[i]][individual[i+1]]
total_distance += distance_matrix[individual[-1]][individual[0]] # 回到起始节点
return total_distance
选择父代
def select_parents(population, distance_matrix):
fitness_values = [fitness(individual, distance_matrix) for individual in population]
selected_indices = np.argsort(fitness_values)[:population_size // 2]
return [population[i] for i in selected_indices]
交叉操作
def crossover(parent1, parent2):
crossover_point = random.randint(0, len(parent1) - 1)
child = parent1[:crossover_point] + [gene for gene in parent2 if gene not in parent1[:crossover_point]]
return child
变异操作
def mutate(individual, mutation_rate):
if random.random() < mutation_rate:
indices_to_swap = random.sample(range(len(individual)), 2)
individual[indices_to_swap[0]], individual[indices_to_swap[1]] = individual[indices_to_swap[1]], individual[indices_to_swap[0]]
主循环
num_nodes = len(distance_matrix_df)
population = initialize_population(population_size, num_nodes)
for generation in range(num_generations):
parents = select_parents(population, distance_matrix_df.values)
new_population = []
while len(new_population) < population_size:
parent1, parent2 = random.sample(parents, 2)
child = crossover(parent1, parent2)
mutate(child, mutation_rate)
new_population.append(child)
population = new_population
best_individual = min(population, key=lambda x: fitness(x, distance_matrix_df.values))
best_distance = fitness(best_individual, distance_matrix_df.values)
print(“最佳路径:”, best_individual)
print(“最佳路径长度:”, best_distance)