首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有经常更改的数据对象结构的设计模式?

是否有经常更改的数据对象结构的设计模式?
EN

Stack Overflow用户
提问于 2016-09-30 13:31:05
回答 2查看 256关注 0票数 2

是否有经常更改的数据对象结构的设计模式?

我正在重构一个遗传算法,在这个算法中,染色体的结构(基因的数目、基因的类型和基因的边界)从一个问题变化到另一个问题。例如:

一个问题可能会使用

代码语言:javascript
复制
class Chromosome{
    double gene1;  // 0.0 < gene1 < 100.0
    double gene2;  // -7.3 < gene2 < 9.0
}

另一个问题可能会使用

代码语言:javascript
复制
class Chromosome{
    int gene1;      // 200 < gene1 < 1000
    double gene2;  // 50.0 < gene2
    double gene3;  // gene3 < -5.0
}

目前染色体的结构是硬编码的,很难针对新的问题进行修改。我正在考虑修改染色体改变的策略模式,除非有人有更好的想法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-30 16:23:46

如果染色体只是基因对象的集合,它们就会变得更容易处理,特别是当边界也被认为是一个对象的时候。

代码语言:javascript
复制
public class Gene
{
    public string Id { get; set; }
    public double Value { get; set; }
    public Boundary Boundary { get; set; }
}

public class Boundary
{
    public double? Minimum { get; set; }
    public double? Maximum { get; set; }
}

public class Chromosome
{
    public string Name { get; set; }
    public List<Gene> Genes { get; set; }
}

然后,一个新的例子染色体可以简单地提供一个必要的基因列表。

代码语言:javascript
复制
 var chromosome1 = new Chromosome
     {
        Name = "Biggie",
        Genes = new List<Gene>
                {
                  new Gene {Id = "1", Boundary = new Boundary {Minimum = 0, Maximum = 100}},
                  new Gene {Id = "2", Boundary = new Boundary {Minimum = -7.3, Maximum = 9}}
                }
     };

 var chromosome2 = new Chromosome
      {
             Name = "Fusion",
             Genes = new List<Gene>
             {
                new Gene {Id = "1", Boundary = new Boundary {Minimum = 200, Maximum = 1000}},
                new Gene {Id = "2", Boundary = new Boundary {Minimum = 50}},
                new Gene {Id = "3", Boundary = new Boundary {Maximum = -5}}
              }
      };

由于现在所有的染色体都有相同的结构,因此使染色体的生成数据驱动变得相对琐碎。染色体定义可以存储在配置文件或数据库中,并根据需要添加新的定义。每个染色体对象都可以通过一个简单的循环来填充,这个循环可以读取它包含的基因列表。

票数 0
EN

Stack Overflow用户

发布于 2016-10-24 18:05:52

多亏了dbugger的帮助,我相信我有办法了。为了简单起见,我取消了ID和边界。IGene和基因类是解决方案。TestGene是一个测试实现。

代码语言:javascript
复制
public interface IGene<T>{
    //Accessors
    public T            getValue();

    public void         setValue(T value);
}

public class Gene<T> implements IGene<T> {
    //Attributes
    T           _value;

    //Accessors
    public T            getValue(){ return this._value;}

    public void         setValue(T value){  this._value = value; }
}

import java.util.ArrayList;
import java.util.List;

public class TestGene {
    public enum EnumType {VALUE1, VALUE2}

    public TestGene() {
        IGene gene;

        List<IGene> chromosome = new ArrayList();

        gene= new Gene<Double>();
        gene.setValue(1.08);
        chromosome.add(gene);

        gene = new Gene<Integer>();
        gene.setValue(3);
        chromosome.add(gene); 

        gene = new Gene<EnumType>();
        gene.setValue(EnumType.VALUE1 );
        chromosome.add(gene);   

        for (int i = 0; i < chromosome.size(); i++ ){
            System.out.println( chromosome.get(i).getValue() );
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39792760

复制
相关文章

相似问题

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