遗传算法one

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

—遗传算法

前言

`

代码如下(示例):

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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值