【问题标题】:Jenetics , how to find subset of set using GAJenetics,如何使用 GA 找到集合的子集
【发布时间】:2017-08-29 14:33:16
【问题描述】:

我正在尝试找到集合的最佳子集。想象一下,我们需要找到对象的子集。我们有这个子集的一些适应度函数。所以一开始我们应该做一个子集的种群,然后使用 GA 我们应该尝试找到最好的子集。

我想使用 Jenetics.io,但我不知道在这种情况下如何使用它。对我来说问题是染色体与子集有很大不同的数据结构。

我想要一个函数(人口、健身函数)来完成所有需要的工作。

我试图了解 Jenetics 的具体工作原理。也许我错了,但我认为没有办法让它按我想要的方式工作。

请给我建议,也许在这种情况下可以选择使用 Jenetics?

【问题讨论】:

    标签: java genetic-algorithm jenetics


    【解决方案1】:

    Jenetics 库中有一个 sub-set 示例。本质上,它具有以下形式:

    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);
        }
    }
    

    【讨论】:

    • 非常感谢。我不知道为什么,但我没有看到这个例子。我会尝试使用它。
    • 是否有一个选项来准备我自己的种群,然后使用 Jenetics 库突变这个种群的子集来找到最好的?我正在尝试使用 GA 解决护士调度问题,调度程序由元组 [员工、开始时间、结束时间] 组成。
    • Jenetics 还允许使用起始人口(Engine.stream(genotypes))进行初始化。对于护士调度问题,您的“人口”是基本集,您要从中选择一个子集,我想。
    • 在分析了这个例子之后,我决定使用非常相似的东西。在文档中,我找到了 codecs.ofSubSet(final ISeq extends T> basicSet)。我这样做是因为我不知道最佳子集的大小应该有多大。所以一切看起来都一样,但我必须使用 BitGene 而不是 EnumGene。适应度函数评估子集如何满足调度程序的要求。有什么办法可以让它更快地工作吗?什么样的选择器是最好的选择?
    • 我会为这类问题添加一个 SwapMutator。由于通常大部分时间都花在了适应度函数上,所以主要是靠你来加快速度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多