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>
其中:
<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);
}
如果我正确理解您的问题,编解码器将如下所示:
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[]>>
.
我想在 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>
其中:
<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);
}
如果我正确理解您的问题,编解码器将如下所示:
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[]>>
.