Jenetics,如何使用 GA 查找集合的子集
Jenetics , how to find subset of set using GA
我正在尝试找到集合的最佳子集。想象一下,我们需要找到对象的子集。我们有这个子集的一些适应度函数。所以一开始我们应该制作一个子集,然后使用 GA 我们应该尝试找到最好的子集。
我想使用 Jenetics.io 但我不知道在这种情况下如何使用它。对我来说,问题是染色体的数据结构与子集有很大不同。
我想要一个函数(人口、适应度函数)来完成所有需要的工作。
我试图了解 Jenetics 的确切工作原理。也许我错了,但我认为没有办法让它按照我想要的方式工作。
请给我建议,也许在这种情况下可以选择使用 Jenetics?
有一个 sub-set example in the Jenetics 图书馆。本质上,它具有以下形式:
class SubsetExample
implements Problem<ISeq<MyObject>, EnumGene<MyObject>, Double>
{
// Define your basic set here.
private final ISeq<MyObject> basicSet = ISeq.empty();
private final int subSetSize = 5;
@Override
public Function<ISeq<MyObject>, Double> fitness() {
return subSet -> {
assert(subset.size() == subSetSize);
double fitness = 0;
for (MyObject obj : subSet) {
// Do some fitness calculation
}
return fitness;
};
}
@Override
public Codec<ISeq<MyObject>, EnumGene<MyObject>> codec() {
return codecs.ofSubSet(basicSet, subSetSize);
}
public static void main(final String[] args) {
final SubsetExample problem = new SubsetExample()
final Engine<EnumGene<MyObject>, Double> engine = Engine.builder(problem)
.minimizing()
.maximalPhenotypeAge(5)
.alterers(
new PartiallyMatchedCrossover<>(0.4),
new Mutator<>(0.3))
.build();
final Phenotype<EnumGene<MyObject>, Double> result = engine.stream()
.limit(limit.bySteadyFitness(55))
.collect(EvolutionResult.toBestPhenotype());
System.out.print(result);
}
}
我正在尝试找到集合的最佳子集。想象一下,我们需要找到对象的子集。我们有这个子集的一些适应度函数。所以一开始我们应该制作一个子集,然后使用 GA 我们应该尝试找到最好的子集。
我想使用 Jenetics.io 但我不知道在这种情况下如何使用它。对我来说,问题是染色体的数据结构与子集有很大不同。
我想要一个函数(人口、适应度函数)来完成所有需要的工作。
我试图了解 Jenetics 的确切工作原理。也许我错了,但我认为没有办法让它按照我想要的方式工作。
请给我建议,也许在这种情况下可以选择使用 Jenetics?
有一个 sub-set example in the Jenetics 图书馆。本质上,它具有以下形式:
class SubsetExample
implements Problem<ISeq<MyObject>, EnumGene<MyObject>, Double>
{
// Define your basic set here.
private final ISeq<MyObject> basicSet = ISeq.empty();
private final int subSetSize = 5;
@Override
public Function<ISeq<MyObject>, Double> fitness() {
return subSet -> {
assert(subset.size() == subSetSize);
double fitness = 0;
for (MyObject obj : subSet) {
// Do some fitness calculation
}
return fitness;
};
}
@Override
public Codec<ISeq<MyObject>, EnumGene<MyObject>> codec() {
return codecs.ofSubSet(basicSet, subSetSize);
}
public static void main(final String[] args) {
final SubsetExample problem = new SubsetExample()
final Engine<EnumGene<MyObject>, Double> engine = Engine.builder(problem)
.minimizing()
.maximalPhenotypeAge(5)
.alterers(
new PartiallyMatchedCrossover<>(0.4),
new Mutator<>(0.3))
.build();
final Phenotype<EnumGene<MyObject>, Double> result = engine.stream()
.limit(limit.bySteadyFitness(55))
.collect(EvolutionResult.toBestPhenotype());
System.out.print(result);
}
}