使用NSGA2算法解决多目标车辆路径问题 (VRP) - geatpy库实现与编码说明
Encoding是指将问题的解空间转化为计算机可处理的编码形式。在多目标VRP问题中,Encoding的目的是将每个客户点的访问顺序表示为一个个体的编码形式,以便于NSGA2算法进行优化搜索。
假设有一百个客户点,其中一个个体的编码形式可以采用整数序列来表示,例如:
[4, 7, 9, 2, 1, 5, 10, 8, 6, ..., 100]
其中,每个整数表示客户点的编号,这个序列的顺序表示了访问这些客户点的顺序。例如,上面的编码表示先访问编号为4的客户点,再访问编号为7的客户点,以此类推,最后访问编号为100的客户点。
在使用geatpy库里的ea.moea_NSGA2_templet解决多目标VRP问题时,可以将Encoding设置为INT型,即整数型。具体实现过程可以参考以下代码:
import numpy as np
import geatpy as ea
class MyProblem(ea.Problem): # 继承Problem父类
def __init__(self):
name = 'MyProblem' # 初始化name(函数名称,可以随意设置)
M = 2 # 初始化M(目标维数)
maxormins = [1, 1] # 初始化maxormins(目标最小最大化标记列表,1表示最小化该目标函数,-1表示最大化该目标函数)
Dim = 100 # 初始化Dim(决策变量维数)
varTypes = np.array([0] * Dim) # 初始化varTypes(决策变量的类型,0表示整数)
lb = [1] * Dim # 决策变量下界
ub = [100] * Dim # 决策变量上界
lbin = [1] * Dim # 决策变量下边界
ubin = [1] * Dim # 决策变量上边界
self.Dim = Dim
self.varTypes = varTypes
self.lb = lb
self.ub = ub
self.lbin = lbin
self.ubin = ubin
self.M = M
self.maxormins = maxormins
ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin) # 调用父类构造函数
def aimFunc(self, pop): # 目标函数
x = pop.Phen # 得到决策变量矩阵
f1 = np.sum(x, axis = 1) # 目标函数1
f2 = np.sum(np.abs(x - 50), axis = 1) # 目标函数2
pop.ObjV = np.array([f1, f2]).T # 把求得的目标函数值赋值给种群pop的ObjV
在上面的代码中,将Encoding设置为INT型,并且使用了整数序列来表示每个个体的编码形式。具体来说,将varTypes的每个元素都设置为0,表示该变量为整数型。同时,设置lb和ub的值为1和100,表示每个决策变量的取值范围为1到100之间。最后,利用np.sum函数求出每个个体的两个目标函数值,并将其赋值给种群pop的ObjV属性,以便NSGA2算法进行优化搜索。
原文地址: https://www.cveoy.top/t/topic/ne6F 著作权归作者所有。请勿转载和采集!