用NSGA2算法解决有一百个客户点的多目标Vrp问题使用eamoea_NSGA2_templetEncoding如何设置
在ea.moea_NSGA2_templet中,Encoding可以设置为PermutationEncoding或RealEncoding。
如果使用PermutationEncoding,则每个染色体表示一个配送路线,染色体中的基因表示客户点的访问顺序。因此,每个染色体的长度应该等于客户点的数量。可以使用以下代码设置PermutationEncoding:
from pymoo.model.encoding import PermutationEncoding
encoding = PermutationEncoding(n_vars=100) # 假设有100个客户点
如果使用RealEncoding,则每个染色体表示一个配送路线,染色体中的每个基因都表示配送车辆在该客户点停留的时间。因此,每个染色体的长度应该等于客户点的数量乘以2。可以使用以下代码设置RealEncoding:
from pymoo.model.encoding import RealEncoding
encoding = RealEncoding(lower_bound=0, upper_bound=10, n_var=200) # 假设每个客户点的停留时间在0到10分钟之间
在使用ea.moea_NSGA2_templet时,可以将Encoding作为参数传递给templet。例如:
from pymoo.model.problem import Problem
from pymoo.model.encoding import PermutationEncoding
from pymoo.model.algorithm import NSGA2
from pymoo.factory import get_crossover, get_mutation, get_sampling
from pymoo.optimize import minimize
class MyProblem(Problem):
def __init__(self):
super().__init__(n_var=100,
n_obj=2,
n_constr=0,
xl=0,
xu=1,
elementwise_evaluation=True)
def _evaluate(self, x, out, *args, **kwargs):
# 求解目标函数
problem = MyProblem()
algorithm = NSGA2(pop_size=100,
sampling=get_sampling("perm_random"),
crossover=get_crossover("perm_erx"),
mutation=get_mutation("perm_inv"),
eliminate_duplicates=True)
algorithm.setup(problem, encoding=PermutationEncoding())
res = minimize(problem,
algorithm,
('n_gen', 100),
verbose=True)
原文地址: https://www.cveoy.top/t/topic/bOFV 著作权归作者所有。请勿转载和采集!