在 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)
NSGA2 算法解决多目标 VRP 问题:100 个客户点的编码方案

原文地址: https://www.cveoy.top/t/topic/ne6x 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录