微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用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 举报,一经查实,本站将立刻删除。