自己编写的示例程序:

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算法参数
num_generations = 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, num_generations, 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))

基于geatpy库的示例程序:

import numpy as np
from geatpy import eaWithArchive, SelNSGA2, MutUniformInt, Crossover

# 定义问题参数
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算法参数
num_generations = 100  # 迭代次数
num_individuals = 100  # 种群大小
cx_prob = 0.8  # 交叉概率
mut_prob = 0.2  # 变异概率

# 定义问题
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]

# 定义种群初始化函数
def initPopulation(popSize, chromLength):
    pop = np.zeros((popSize, chromLength), dtype=np.int)
    for i in range(popSize):
        pop[i, :] = np.random.randint(0, num_vehicles, chromLength)
    return pop

# 定义变异算子
def myMutate(population, F):
    return MutUniformInt(population, F, 0, num_vehicles-1, Pm=mut_prob)

# 定义交叉算子
def myCrossover(population, F):
    return Crossover(population, F, 1, 1, 0.5)

# 运行NSGA-II算法
NDSet, NDSetObj = eaWithArchive(initPopulation, evaluate, myMutate, myCrossover, SelNSGA2, num_generations, num_individuals, maxormin=[1, 1], verbose=True)

# 输出结果
best_individuals = NDSet[np.argsort(NDSetObj[:, 0])][: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.tolist()))
用NSGA2算法解决一个两目标优化的VRP问题目标函数是最小成本和最大客户满意度没有时间窗只有车辆容量和工作时间约束每个客户存在服务时间与配送量成正比用自己编写和基于geatpy库分别写出一个完整示例程序

原文地址: https://www.cveoy.top/t/topic/bPvL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录