我想在Jenetics中用两个背包实现一个多目标背包问题,但是我遇到一些打字问题。我查看了https://www.rethinkdb.com/api/javascript/between/中的DTLZ1
问题(据我所知,这是唯一可用的MOO示例),并将其映射到Jenetics manual类:
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)实现了Problem
:
Problem<ISeq<BitGene>, BitGene, Integer>
位置:
<ISeq<BitGene>
:背包(不可变),按顺序排列。BitGene
:进化引擎的基因类型。Integer
:背包的适用性,即其利润。使用两个背包,我想到了类似的东西(基于DTLZ1
示例):
Problem<ISeq<BitGene>[], BitGene, Vec<int[]>>
位置:
ISeq<BitGene>[]
:多个背包(作为不可变的位序列)包裹在一个数组中。BitGene
:进化引擎的基因类型(与上面相同)。int[]
:背包的适用性,即利润。除了ISeq<BitGene>[]
之外,它还需要一些时间来适应(我也可以使用List
或类似的东西吗?),所以我不知道如何创建合适的编解码器:
@Override
public Codec<ISeq<BitGene>[], BitGene> codec() {
return Codecs.ofVector(
() -> {
// What kind of supplier do I need?
},
NUMBER_OF_KNAPSACKS);
}
答案 0 :(得分:1)
如果我正确理解了您的问题,编解码器将如下所示:
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
,嵌套序列的大小为{{1} }。您的问题的签名为itmes.length()
。