遗传编程帮助

时间:2011-03-04 22:29:29

标签: java modeling genetics

我需要一些关于java项目的指导。我要开发一种人类遗传(家族)树。

这是主题:

每个人类细胞包含23对编号为1至22的染色体,以及一对性染色体:女性为XX,人为XY。在受精过程中,该男子的22条染色体+(X或Y)与该女子的22 + X染色体合并。这导致细胞中22对染色体+(X或Y)将形成未来的婴儿。 由父亲传播的第23条染色体(X或Y)将决定孩子的性别(女孩为XX,男孩为XY)。

每条染色体都携带许多基因(几乎编码所有基因,特征形态,生理,行为)。由于成对的染色体,遗传信息是重复的(性染色体的部分除外)。基因的每个拷贝称为等位基因。 所以这意味着,例如,如果一个基因负责眼睛的颜色,则等位基因是蓝色

由于存在等位基因的组合表达而表达的遗传信息。显性等位基因总是在其携带者的基因组中表达。但是,如果没有表达来自一个等位基因的信息 当存在相同基因的显性等位基因时,它是隐性等位基因。基因的隐性等位基因的特性是它可以存在于基因组中并在几代中传播而不在表型中表达 它的承担者。如果没有显性等位基因,则该基因的两个拷贝具有相同的隐性等位基因(纯合隐性),然后表达隐性特征。 通过使用家谱,可以确定家族中基因的表达。

该计划应该能够做到以下几点:

- 生成依赖于23条染色体的简化版本,允许用户将基因置于染色体上,然后模拟染色体的复制,有丝分裂,减数分裂和融合,并在所得细胞上显示基因的位置。

- 允许绘制家谱树并推断出基因在一个人家谱上的表达的可能性(或确定性)。

到目前为止,我已经创建了一个基因类和一个类染色体。接下来,我考虑创建一个类“父”,例如在其中创建23条染色体。但在此之前,我想让第23条染色体与男人/女人不同。然后模拟复制,交叉,有丝分裂等。 我不知道我是否走在正确的轨道上。我也不知道如何指定特定的等位基因/基因是隐性的还是显性的。目前,我的课程只是以随机的方式行事。 我记录了

Gene.java

import java.util.Random;

/**
 * @author mkab
 *
 */
public class Gene implements Cloneable {

    private Object allele;

    public Gene(){
        super();
    }
    public Gene(Object allele){
        super();
        this.allele = allele;
    }

    /**
     * Randomly selects a trait from trait1 or trait2 and returns a new Gene with that trait
     * @param trait1
     * @param trait2
     * 
     * @return a new Gene
     */
    public Gene randomAllele(Object trait1, Object trait2){
        Object allele = null;
        Random rand = new Random();
        int i = rand.nextInt(2);// generate between 0 and 2: only 2 possibilities: 0 or 1
        switch(i){
        case 0:
            allele = trait1;
            break;
        case 1:
            allele = trait2;
            break;
        }
        return new Gene(allele);
    }


    public Gene clone() throws CloneNotSupportedException{
        Gene g;
        g = (Gene) super.clone();
        return g;
    }
    /**
     * @param allele the allele to set
     */
    public void setAllele(Object allele) {
        this.allele = allele;
    }

    /**
     * @return the allele
     */
    public Object getAllele() {
        return allele;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Gene [allele=" + allele +"]";
    }
}

Chromosome.java

/**
 * 
 */
package project_try;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * Class that creates a pair of chromosome by adding random genes
 * @author mkab
 *
 */
public class Chromosome implements Cloneable {

    /**
     * the user can put as many genes as possible on the chromosome
     */
    private ArrayList<Gene> genes = new ArrayList<Gene>();

    public Chromosome(){
        super();
    }

    public Chromosome(ArrayList<Gene> genes){
        this.genes = genes;
    }

    /**
     * Add a gene object to this chromosomes list.
     */
    public void addGene(Gene gene) {
        genes.add(gene);
    }


    /**
     *creates a copy of a chromosome
     */
    @SuppressWarnings("unchecked")
    @Override
    public Chromosome clone()throws CloneNotSupportedException{
        Chromosome c;
        c = (Chromosome) super.clone();
        c.genes = (ArrayList<Gene>)this.genes.clone();
        //Iterator<Gene> it = c.genes.iterator();
        /*Gene tmp;
        while(it.hasNext()){

        }*/
        return c;
    }

    /**
     * @return the genes
     */
    public ArrayList<Gene> getGenes() {
        return genes;
    }

    /**
     * @param genes the genes to set
     */
    public void setGenes(ArrayList<Gene> genes) {
        this.genes = genes;
    }

    /**
     * 
     * @return
     */
    public int getSize(){
        return genes.size();
    }

    /**
     * @return a gene at an index i of the ArrayList
     * @param index - the index at which to return a gene
     */
    public Gene getGenes(int index) {
        return genes.get(index);
    }


    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Chromosome [genes=" + genes + "]";
    }

}

我的问题是能够使基因隐性或显性。例如,当具有蓝眼基因的雄性染色体与具有褐色的雌性染色体交配时,如果雄性基因占优势,则该儿童将具有蓝眼而不是褐色,但该儿童仍将具有隐性基因“棕色眼睛”。在它的某个地方。

我也想知道我所做的课程是否正确处理了这个问题。 我也在考虑制作一个“Pair_of_chromosome”类,例如包含两个染色体变量,并制作一个包含23个“Pair_of_chromosome”表的“Parent”类。我不知道这是否正确。

2 个答案:

答案 0 :(得分:0)

我对遗传学知之甚少,但是建立这种方法的正确方法是拥有一个Person-class,实现一个需要2个人(父母)的构造函数,如果他们属于同一性别则抛出异常,构建染色体(以及个体基因)用于基于父母随机组合(构成隐性基因等)的构建器内的新Person。

答案 1 :(得分:0)

这里有一些Octave Code做类似的遗传模拟研究。 YMMV。