计算机系统应用教程网站

网站首页 > 技术文章 正文

遗传算法实现python,完整算法实现

btikc 2024-11-15 16:33:16 技术文章 2 ℃ 0 评论

算法描述

(1)进行客流分配,当i<m时,t(k,i)=tc(k,i);当i>m时,t(k,i)=[E(k,i)*dij/27.9]+ tc(k,i);其中:i、j是站点,m是站点集合,k是车辆,dij是从i站到j站的距离,E(k,i)={0,1}。约束条件:Δt=min[t(k,i)-t(r,i)];t(r,a)<t(k,i)<t(r,b);其中:r是乘客,r属于R;tr,a是乘客到达站点的最早时间,t(r,b)是乘客到达站点的最晚时间;客流分配取t(k,i)和 Δt的最小值。

(2)惩罚函数:当t(r,a)<t(k,i)<t(r,b)时,φ(r)=0;当tk,i<tr,a或tk,i>tr,b时,φ(r)=μ(极大的正数);t(r,a)是乘客到达站点的最早上车时间,t(r,b)乘客到达站点的最晚上车时间;

(3)我的目标函数是minz1=∑i∑k∑r(w1*C1+w2C2+W3C3);其中w1=1,w2=1,w3=1;当tk,i<tr,i时C1=qk,i(tk,i-tr,i);当tk,i>tr,i时C1=q(r,i)*[t(r,i)-t(k,i)];其中q(k,i)为车辆k到达站点i时车内人数;t(r,i)为乘客r到达站点i的时间,q(r,)i为乘客r在站点i的人数;C2=θ(k,i)*α,其中θ(k,i) ={0,1},α为车辆运行固定成本;车辆k经过站点i为1,否则为0。

约束条件:Q1小于等于Np,Q1=q(k,i)+q(r,i)-q(x,i)Np为p型车辆k的容量;0<td(p)-tu(p)<hmax;C1为乘客出行时间成本,C2为车辆一经启动的固定成本,C3为车辆运行的可变成本;β




根据你提供的算法描述,以下是一个可能的实现思路:


首先,定义决策变量和参数:

决策变量:i、j是站点,m是站点集合,k是车辆,r是乘客;

参数:t(k, i)表示车辆k到达站点i的时间。tc(k, i)表示车辆k的初始到达时间,dij表示站点i到站点j的距离,E(k, i)表示车辆k是否经过站点i(0或1),tr, a和tr, b表示乘客r到达站点的最早和最晚时间,w1、w2、w3、α、Np等为权重和参数。w1=1,w2=1,w3=1,α1=4.97元/km,α2=5.33元/km,β=0.15元/km ,N1=4人,N2=12人。

定义目标函数:

定义C1部分:根据乘客和车辆到达时间计算成本。当t(k, i) < tr, i时,C1 = q(k, i) * (t(k, i) - tr, i);当t(k, i) > tr, i时,C1 = q(r, i) * (t(r, i) - t(k, i))。

定义C2部分:根据车辆经过站点i的情况计算成本。C2 = θ(k, i) * α,其中θ(k, i)为0或1,表示车辆k是否经过站点i,θ(k, i)=1时,车辆k经过站点i。

定义C3部分:C3 = θ(k, i) * β表示车辆运行的可变成本。

定义约束条件:

客流分配约束:根据车辆和乘客到达时间进行客流分配。当i < m时,t(k, i) = tc(k, i);当i > m时,t(k, i) = (E(k, i) * dij / 27.9) + tc(k, i)。E(k, i) 为0或1,若车辆k经过站点i,则E(k,i)=0。车辆和乘客到达站点的时间差Δt = min(t(k, i) - t(r, i)),其中r属于乘客集合R。

时间窗约束:tr, a为乘客到达站点的最早时间,tr, b为乘客到达站点的最晚时间。

容量约束:Q1 <= Np,Q1 = q(k, i) + q(r, i) - q(x, i),表示车辆k的容量限制。

最大在车时间约束:0<=td(p)-tu(p)<=hmax,td(p)为乘客下车时间,tu(p)为乘客上车时间。

定义惩罚函数:

当tr, a < t(k, i) < tr, b时,φ? = 0。

当t(k, i) < tr, a或t(k, i) > tr, b时,φ? = μ(极大的正数)。

定义目标函数 minz1,求解最小化问题:

minz1 = ∑i ∑k ∑r (w1 * C1 + w2 * C2 + w3 * C3)

以下是使用遗传算法求解目标函数的示例代码:



import random

import numpy as np


# 定义问题参数

Np # 车辆容量

N1 = 4 # N1车型车辆容量

N2 = 12 # N2车型车辆容量

hmax = 120 # 最大在车时间

alpha1 = 4.97 # 车辆运行固定成本

alpha2 = 5.33 # 车辆运行可变成本

beta = 0.15 # 车辆运行可变成本

t = {} # 车辆到达站点的时间

tc = {} # 车辆的初始到达时间

dij = {} # 站点之间的距离

E = {} # 车辆是否经过站点

tr_a = {} # 乘客到达站点的最早时间

tr_b = {} # 乘客到达站点的最晚时间

w1 = 1

w2 = 1

w3 = 1


# 定义遗传算法参数

population_size = 50 # 种群大小

max_generations = 100 # 最大迭代次数

mutation_rate = 0.1 # 变异率


# 定义决策变量的取值范围和编码长度

station_range = (0, 67) # 站点范围

m_range = (0, 67) # 站点集合范围

vehicle_range = (0, 15) # 车辆范围

passenger_range = (0, 127) # 乘客范围

chromosome_length = 4 # 决策变量的编码长度

i = [0,1, 2, …,67] # 站点集合

j = [0,1, 2, …,67] # 站点集合

m = [1, 2, 3] # 站点集合

k = [1, 2, …,15] # 车辆集合

r = [1, 2, …,127] # 乘客集合


# 定义目标函数

def objective_function(chromosome):

# 解码决策变量

i = chromosome[0]

j = chromosome[1]

m = chromosome[2]

k = chromosome[3]

r = random.randint(*passenger_range)


# 计算C1部分

if t[k, i] < t[r, i]:

C1 = q[k, i] * (t[k, i] - t[r, i])

else:

C1 = q[r, i] * (t[r, i] - t[k, i])


# 计算C2部分

if θ[k, i] == 1:

C2 = alpha1

else:

C2 = 0


# 计算C3部分

if theta[k, i] == 1:

C3 = beta

else:

C3 = 0


return w1 * C1 + w2 * C2 + w3 * C3


# 定义惩罚函数

def penalty_function(chromosome):

i = chromosome[0]

j = chromosome[1]

m = chromosome[2]

k = chromosome[3]

r = random.randint(*passenger_range)


if t[r, a] < t[k, i] < t[r, b]:

return 0

else:

return float('inf')


# 初始化遗传算法参数

population_size = 50

elite_size = 10

mutation_rate = 0.01

generations = 100


# 定义遗传算法函数


# 初始化种群

def init_population():

population = []

for _ in range(population_size):

chromosome = []

for _ in range(len(i)):

chromosome.append(random.choice(j))

population.append(chromosome)

return population


# 计算适应度函数

def calculate_fitness(chromosome):

C1 = 0

C2 = 0

C3 = 0

for k_val in k:

for i_val in i:

for r_val in r:

t_k_i = t[k_val, i_val]

tr_i = tr_a[r_val]

if t_k_i < tr_i:

C1 += q(k_val, i_val) * (t_k_i - tr_i)

else:

C1 += q(r_val, i_val) * (tr_i - t_k_i)


E_k_i = E[k_val, i_val]

if E_k_i == 1:

C2 += theta(k_val, i_val) * alpha1

else:

C2 += theta(k_val, i_val) * alpha2

C3 += theta(k_val, i_val) * beta


return w1 * C1 + w2 * C2 + w3 * C3


# 选择精英个体

def select_elite(population, fitness_scores):

elite_population = []

sorted_population = [x for _, x in sorted(zip(fitness_scores, population))]

for i in range(elite_size):

elite_population.append(sorted_population[i])

return elite_population


# 选择父代个体

def select_parents(population, fitness_scores):

parents = []

total_fitness = sum(fitness_scores)

selection_probs = [fitness / total_fitness for fitness in fitness_scores]

for _ in range(population_size - elite_size):

parent1 = random.choices(population, weights=selection_probs)[0]

parent2 = random.choices(population, weights=selection_probs)[0]

parents.append((parent1, parent2))

return parents


# 交叉产生子代

def crossover(parents):

offspring = []

for parent1, parent2 in parents:

child = []

crossover_point = random.randint(1, len(i) - 1)

child.extend(parent1[:crossover_point])

child.extend(parent2[crossover_point:])

offspring.append(child)

return offspring


# 变异操作

def mutate(offspring):

for chromosome in offspring:

if random.random() < mutation_rate:

mutation_point = random.randint(0, len(i) - 1)

chromosome[mutation_point] = random.choice(j)

return offspring


# 更新种群

def update_population(population, elite_population, offspring):

population = elite_population + offspring

return population


# 主函数,运行遗传算法

def genetic_algorithm():

population = init_population()

for _ in range(generations):

fitness_scores = [calculate_fitness(chromosome) for chromosome in population]

elite_population = select_elite(population, fitness_scores)

parents = select_parents(population, fitness_scores)

offspring = crossover(parents)

offspring = mutate(offspring)

population = update_population(population, elite_population, offspring)


best_chromosome = elite_population[0]

best_fitness = calculate_fitness(best_chromosome)

return best_chromosome, best_fitness


# 运行遗传算法

best_solution, best_fitness = genetic_algorithm()

print("最优解:", best_solution)

print("最优解适应度:", best_fitness)


请注意,上述代码仅为示例,具体实现可能需要根据实际情况进行修改和调整。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表