我需要一些关于 java 项目的指导。我要开发人类遗传(家谱)树。
这是主题:
每个人体细胞包含 23 对染色体,编号从 1 到 22,以及一对性染色体:女性为 XX,男性为 XY。在受精过程中,男性的 22+(X 或 Y)染色体与女性的 22+X 染色体融合。这会在细胞中产生 22 对染色体 +(X 或 Y),从而形成未来的婴儿。父亲遗传的第 23 条染色体(X 或 Y)将决定孩子的性别(XX 代表女孩,XY 代表男孩)。
每条染色体都携带许多基因(编码几乎所有的基因,一种形态学、生理学、行为学的特征)。由于成对的染色体,遗传信息被复制(部分性染色体除外)。基因的每个拷贝称为等位基因。这意味着例如,如果 a 基因负责眼睛的颜色,那么等位基因是蓝色的。
由于存在等位基因的组合表达而表达的遗传信息。显性等位基因总是在其承载者的基因组中表达。然而,如果当同一基因的显性等位基因存在时,一个等位基因的信息不表达,则它是隐性等位基因。基因的隐性等位基因的特点是它可以存在于基因组中并在几代人中传播,而不会在其承载者的表型中表达。如果没有显性等位基因,则基因的两个拷贝具有相同的隐性等位基因(纯合隐性),则表示隐性特征。通过使用家谱,可以确定一个基因在一个家庭中的表达。
该程序应该能够执行以下操作:
- 生成依赖于 23 条染色体的简化版本,并允许用户将基因放置在染色体上,然后模拟染色体的复制、有丝分裂、减数分裂和融合,并显示基因在生成的细胞上的位置。
- 允许绘制家谱树并推断一个人家谱上基因表达的概率(或确定性)。
到目前为止,我已经创建了一个 Gene 类和一个 Chromosome 类。接下来,我考虑创建一个类“Parent”,并在其中创建 23 条染色体。但在此之前,我想让男性/女性的第 23 条染色体有所不同。然后模拟复制、交叉、有丝分裂等。我不知道我是否走在正确的轨道上。我也不知道如何指定特定的等位基因/基因是隐性的还是显性的。目前我的班级只是随机行事。
基因.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 +"]";
}
}
染色体.java
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 + "]";
}
}
谢谢