NSGA2 算法解决多目标 VRP 问题:100 个客户点的编码方案
在 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/ne6x 著作权归作者所有。请勿转载和采集!