如何使用DEAP实现多目标最短路径问题

问题描述

我对使用DEAP框架非常陌生,并且正在尝试解决多目标优化最短路径问题。在学习过程中,我在https://github.com/DEAP/deap/blob/master/examples/ga/tsp.py中看到了TSP问题的代码,并且我试图通过源和目的地节点来修改该问题。这是我最初的方法

import matrixData as data
import matplotlib.pyplot as plt

from deap import algorithms
from deap import base
from deap import creator
from deap import tools

import array
import random
import numpy

random.seed(64)

coorX,coorY,f1_cost_matrix,f2_cost_matrix,numNodes = data.importMatricesData

s = random.randrange(numNodes)
d = random.randrange(numNodes)

rangeNumNodes = range(numNodes)

def getRandomPath(numNodes):
    sample = random.sample(range(numNodes),numNodes)
    sample.remove(s)
    sample.remove(d)
    sample[0] = s
    sample[-1] = d
    return sample


creator.create("fitnessMin",base.fitness,weights=(-1.0,-1.0))
creator.create("Individual",array.array,typecode='i',fitness=creator.fitnessMin)

toolBox = base.ToolBox()

# Attribute generator
toolBox.register("path_indices",getRandomPath,numNodes)

# Structure initializers
toolBox.register("individual",tools.initIterate,creator.Individual,toolBox.path_indices)
toolBox.register("population",tools.initRepeat,list,toolBox.individual)

def evalMOSP(individual):
    f1_cost = 0
    f2_cost = 0
    i = 0
    while i < len(individual) - 1:
        f1_cost += f1_cost_matrix[individual[i]][individual[i+1]]
        f2_cost += f2_cost_matrix[individual[i]][individual[i+1]]
        i += 1
    
    return f1_cost,f2_cost

toolBox.register("evaluate",evalMOSP)
toolBox.register("mate",tools.cxTwoPoint)
toolBox.register("mutate",mutPath)
toolBox.register("select",tools.selNSGA2)

def main():
    random.seed(64)
    NGEN = 50
    MU = 50
    LAMBDA = 100
    CXPB = 0.7
    MUTPB = 0.2
    
    pop = toolBox.population(n=MU)
    hof = tools.ParetoFront()
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg",numpy.mean,axis=0)
    stats.register("std",numpy.std,axis=0)
    stats.register("min",numpy.min,axis=0)
    stats.register("max",numpy.max,axis=0)
    
    algorithms.eaMuPlusLambda(pop,toolBox,MU,LAMBDA,CXPB,MUTPB,NGEN,stats,halloffame=hof)
    
    return pop,hof
                 
if __name__ == "__main__":
    pop,hof = main()
    print(hof)
    plt.plot(coorX,coorY)    

如您所见,我的最初尝试很大程度上基于DEAP文档示例。另外,我正在尝试最小化这两个成本函数,对于交叉算子,我只是选择一些随机函数

如果您有使用DEAP解决SP的示例或想法,那将是很大的帮助。

谢谢!

P.D:对不起,如果我拼错了一些单词。英语不是我的母语

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)