下面这个代码为什么报错?如何改进eaMuPlusLambda missing 1 required positional argument ngen:import numpy as npfrom deap import algorithms base creator tools# 定义问题参数num_customers = 10 # 客户数量num_vehicles = 3 # 车辆数量cap
该代码报错是因为在运行eaMuPlusLambda()函数时,缺少一个参数ngen,即迭代次数。需要将代码中的num_generations替换为ngen即可。
改进后的代码如下:
import numpy as np from deap import algorithms, base, creator, tools
定义问题参数
num_customers = 10 # 客户数量 num_vehicles = 3 # 车辆数量 capacity = 30 # 车辆容量 working_time = 8 # 车辆工作时间(小时)
定义客户参数
np.random.seed(0) customer_demands = np.random.randint(1, 10, num_customers) # 客户需求量 customer_service_times = np.random.uniform(0.5, 1.5, num_customers) # 客户服务时间
定义NSGA-II算法参数
ngen = 100 # 迭代次数 num_individuals = 100 # 种群大小 cx_prob = 0.8 # 交叉概率 mut_prob = 0.2 # 变异概率
定义问题
creator.create("Fitness", base.Fitness, weights=(-1.0, 1.0)) # 定义适应度函数,最小化成本,最大化客户满意度 creator.create("Individual", list, fitness=creator.Fitness) # 定义个体
toolbox = base.Toolbox()
初始化个体
def init_individual(): individual = [] for i in range(num_customers): individual.append(np.random.randint(num_vehicles)) return individual
初始化种群
toolbox.register("individual", tools.initIterate, creator.Individual, init_individual) toolbox.register("population", tools.initRepeat, list, toolbox.individual)
定义评价函数
def evaluate(individual): vehicle_demands = [0] * num_vehicles # 初始化车辆装载量 vehicle_times = [0] * num_vehicles # 初始化车辆工作时间 vehicle_routes = [[] for i in range(num_vehicles)] # 初始化车辆路径 for i, customer in enumerate(individual): vehicle_demands[customer] += customer_demands[i] # 更新车辆装载量 vehicle_times[customer] += customer_service_times[i] # 更新车辆工作时间 vehicle_routes[customer].append(i) # 更新车辆路径
# 计算成本
cost = 0
for i in range(num_vehicles):
if vehicle_demands[i] > capacity: # 超过容量限制
cost += 1000
else:
cost += vehicle_demands[i] * 10 # 每个单位成本为10
# 计算客户满意度
satisfaction = sum([customer_demands[i] for i in range(num_customers) if individual[i] in vehicle_routes[individual[i]]]) / sum(customer_demands)
return cost, satisfaction
toolbox.register("evaluate", evaluate)
定义选择、交叉、变异算子
toolbox.register("select", tools.selNSGA2) toolbox.register("mate", tools.cxUniform, indpb=0.5) toolbox.register("mutate", tools.mutUniformInt, low=0, up=num_vehicles-1, indpb=0.2)
运行NSGA-II算法
pop = toolbox.population(n=num_individuals) algorithms.eaMuPlusLambda(pop, toolbox, ngen, num_individuals, cxpb=cx_prob, mutpb=mut_prob)
输出结果
best_individuals = tools.selBest(pop, k=10) for i, individual in enumerate(best_individuals): cost, satisfaction = evaluate(individual) print("Rank %d, Cost: %d, Satisfaction: %f, Solution: %s" % (i+1, cost, satisfaction, individual))
原文地址: https://www.cveoy.top/t/topic/bPwk 著作权归作者所有。请勿转载和采集!