首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenetics:柱基因型编解码器的正确使用

Jenetics:柱基因型编解码器的正确使用
EN

Stack Overflow用户
提问于 2018-03-20 18:29:09
回答 2查看 300关注 0票数 1

目前,我正在研究一个Jenetics (链接到jenetics)实现,以优化粒子加速器束流线。我的健身功能调用加速器检测器设备,定义如下:

代码语言:javascript
复制
private double fitness(final DoubleChromosome chromosomes) {
    // private double fitness(final Genotype<DoubleGene> chromosomes) {
    // Convert genes to a format the device scanner can understand
    // we will inject a 1:n Set<List<Double>>
    final Set<List<Double>> trimValues = new HashSet<>();

    final List<Double> valueList = new ArrayList<>();
    for (final DoubleGene chromosome : chromosomes) {
        valueList.add(Double.valueOf(chromosome.doubleValue()));
    }
    trimValues.add(valueList);

    ....
    more code specific to application
    }

Jenetics的流引擎是在一个特定的方法中初始化的:

代码语言:javascript
复制
public void initAlgorithm(final Object scanParameters) throws Exception {
    if (scanParameters != null) {
        /// See constructor of EvolvingImagesWorker
        _geneticScanParameters = (GeneticScanParameters) scanParameters;
    }

    if (_geneticScanParameters.getTrimParameterSets() != null) {

        final int chromosomeCount = _geneticScanParameters.getTrimParameterSets().size();
        if (chromosomeCount > 0) {
            ISeq<DoubleChromosome> chromosomeSet = ISeq.empty();

            // create an ISeq of genes
            for (final TrimParameterValueSet valueSet : _geneticScanParameters.getTrimParameterSets()) {
                final double minValue = valueSet.getMinValue();
                final double maxValue = valueSet.getMaxValue();
                final double initialValue = (maxValue + minValue) / 2;

                final DoubleGene doubleGene = DoubleGene.of(initialValue, minValue, maxValue);
                final DoubleChromosome doubleChromosome = DoubleChromosome.of(doubleGene.newInstance());
                chromosomeSet = chromosomeSet.append(doubleChromosome.newInstance());
            }
            Codec<DoubleChromosome, DoubleGene> codec = null;
            try {
                final Genotype<DoubleGene> genotype = Genotype.of(chromosomeSet);
                codec = Codec.of(genotype.newInstance(), //
                        gt -> (DoubleChromosome) gt.getChromosome());
            } catch (final IllegalArgumentException ex) {
                MessageLogger.logError(getClass(), Thread.currentThread(), ex);
                throw ex;
            }

            _scannerEngine = Engine.builder(this::fitness, codec) //
                    .executor(Executors.newSingleThreadExecutor()) // without this command, engine will be executed
                                                                   // in
                                                                   // parallel threads
                    .populationSize(_geneticScanParameters.getPopulationSize()) //
                    .optimize(_geneticScanParameters.getOptimizationStrategy()) //
                    .offspringFraction(_geneticScanParameters.getOffspringSize()) //
                    .survivorsSelector(new RouletteWheelSelector<>()) //
                    .offspringSelector(new TournamentSelector<>(_geneticScanParameters.getTournamentSizeLimit())) //
                    .alterers( //
                            new Mutator<>(_geneticScanParameters.getMutator()), //
                            new MeanAlterer<>(_geneticScanParameters.getMeanAlterer()) //
                    ) //
                    .build();
        } else {
            throw new IllegalStateException(ERROR_INITSCANNER_NO_SETTING_DEVICE);
        }
    }
    }

其中:

代码语言:javascript
复制
private Engine<DoubleGene, Double> _scannerEngine = null;

我想要做的是把健身功能称为健身功能,这样我就可以在健身功能中获得基因的值(我发送给加速器的设置)。我已经尝试将健身()定义为:

代码语言:javascript
复制
private double fitness(final Genotype<DoubleChromosome> genotype) {
...
}

但是这个调用会导致遵从性错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-21 14:32:23

我看了一下你的代码,我想你想做这样的事情:

代码语言:javascript
复制
class Foo {

    // Your parameter class.
    class TrimParameterSet {
        double min, max;
    }

    static double fitness(final double[] values) {
        // Your fitness function.
        return 0;
    }

    public static void main(final String[] args) {
        final List<TrimParameterSet> valueSets = ...;

        final DoubleRange[] ranges = valueSets.stream()
            .map(p -> DoubleRange.of(p.min, p.max))
            .toArray(DoubleRange[]::new);

        final Codec<double[], DoubleGene> codec = Codecs.ofVector(ranges);
        final Engine<DoubleGene, Double> engine = Engine.builder(Foo::fitness, codec)
            .build();

        // ...
    }
}

适应度函数的double[]数组有一个不同的范围,这与您的TrimParameterSet类中定义的范围不同。如果你想要定义一个直接的适应度函数,你必须定义一个基因型,一个基因作为参数类型。

代码语言:javascript
复制
double fitness(Genotype<DoubleGene> gt) {...}
票数 2
EN

Stack Overflow用户

发布于 2018-03-22 08:38:05

由于注释函数不允许我完成记录我的最后实现,下面是实际代码:

代码语言:javascript
复制
ISeq<DoubleChromosome> chromosomeSet = ISeq.empty();

// create an ISeq of genes
for (loop criteria) {
    final DoubleGene doubleGene = DoubleGene.of(initialValue, minValue, maxValue);
    final DoubleChromosome doubleChromosome = DoubleChromosome.of(doubleGene.newInstance());
    chromosomeSet = chromosomeSet.append(doubleChromosome.newInstance());
}
_genotype = Genotype.of(chromosomeSet);

_scannerEngine = Engine.builder(this::fitness, _genotype)
                     ... // engine settings
                     .build();

double fitness(Genotype<DoubleGene> gt) {...}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49391705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档