Jenetics 中非原始类型的多 objective 问题

Multi-objective problem with non-primitive types in Jenetics

我想在 Jenetics 中用两个背包实现多 objective 背包问题,但我遇到了一些打字问题。我从 Jenetics manual—which is to my knowledge the only MOO example available—and mapped it to the Problem class:

查看了 DTLZ1 问题
public class DTLZ1 implements Problem<double[], DoubleGene, Vec<double[]>> {

    // Constants...

    public static void main(String[] args) {
        // Engine setup and evolution stream execution...
    }

    @Override
    public Function<double[], Vec<double[]>> fitness() {
        // Original fitness function...
    }

    @Override
    public Codec<double[], DoubleGene> codec() {
        // Original codec...
    }

}

我之前使用以下类型签名(转换为 Java)实现了 single-objective knapsack problem in Scala

Problem<ISeq<BitGene>, BitGene, Integer>

其中:

使用两个背包,我想到了类似的东西(基于 DTLZ1 示例):

Problem<ISeq<BitGene>[], BitGene, Vec<int[]>>

其中:

除了 ISeq<BitGene>[] 需要一些时间来适应(我也可以使用 List 或类似的东西吗?),我不知道如何创建合适的编解码器:

@Override
public Codec<ISeq<BitGene>[], BitGene> codec() {
    return Codecs.ofVector(
            () -> {
                // What kind of supplier do I need?
            },
            NUMBER_OF_KNAPSACKS);
}

如果我正确理解您的问题,编解码器将如下所示:

public static <T> Codec<ISeq<ISeq<T>>, BitGene>
codec(final ISeq<? extends T> items, final int knapsackCount) {
    return Codec.of(
        Genotype.of(
            BitChromosome.of(items.length()).instances()
                .limit(knapsackCount)
                .collect(ISeq.toISeq())
        ),
        gt -> gt.stream()
            .map(ch -> ch.as(BitChromosome.class))
            .map(ch -> ch.ones()
                .<T>mapToObj(items)
                .collect(ISeq.toISeq()))
            .collect(ISeq.toISeq())
    );
}

我使用的不是 ISeq<T>[] 数组,而是 ISeq<ISeq<T>>,但第一个序列的大小为 knapsackCount,嵌套序列的大小为 itmes.length()。您的问题的签名将是 Problem<ISeq<ISeq<T>>, BitGene, Vec<double[]>>.