stumblemodel 发表于 2026-3-20 20:35:44

关于python模拟遗传


73题,用一个python程序模拟杂交,假设是100对等位基因,连续杂交100代,并将100代的基因型与小麦B的基因型对比相似度,重复实验100次取相似度的平均值
我就是想验证一下,这样是不是真的可以做到几乎完全复制B的核DNA

FishC 发表于 2026-3-20 20:38:33

以下是模拟回交实验的Python代码,用于验证通过多代回交能否使后代基因型几乎完全复制目标亲本(小麦B)。代码模拟了100个独立基因座、连续100代回交,并重复实验100次取平均相似度。


import random

# 参数设置
n_genes = 100          # 基因座数量
n_generations = 100    # 杂交代数
n_repeats = 100      # 重复实验次数

# 初始化存储平均相似度的列表,长度为 n_generations+1(包括第0代)
avg_similarity = * (n_generations + 1)

for _ in range(n_repeats):
    # 初始染色体:全部为0(表示来自A的等位基因)
    chrom = * n_genes
    # 计算初始相似度(第0代)
    similarity = (n_genes + sum(chrom)) / (2 * n_genes)
    avg_similarity += similarity
   
    # 进行100代回交
    for gen in range(1, n_generations + 1):
      new_chrom = * n_genes
      for i in range(n_genes):
            # 以1/2的概率从上一代chrom中继承,1/2的概率从B继承(即变为1)
            if random.random() < 0.5:
                new_chrom = chrom   # 继承上一代的等位基因
            else:
                new_chrom = 1          # 从B继承,等位基因为1
      chrom = new_chrom
      # 计算当前代的相似度
      similarity = (n_genes + sum(chrom)) / (2 * n_genes)
      avg_similarity += similarity

# 计算平均值
for gen in range(n_generations + 1):
    avg_similarity /= n_repeats

# 输出结果(每10代输出一次)
print("代数和平均相似度:")
for gen in range(0, n_generations + 1, 10):
    print(f"第{gen}代:平均相似度 = {avg_similarity:.6f}")

# 输出最后一代的相似度
print(f"\n第{n_generations}代的平均相似度:{avg_similarity:.6f}")

# 理论值计算:1 - (1/2)^(gen+1)
print("\n理论相似度(对比):")
for gen in range(0, n_generations + 1, 10):
    theoretical = 1 - (0.5) ** (gen + 1)
    print(f"第{gen}代:理论相似度 = {theoretical:.6f}")


解释:
- 每个基因座用两个等位基因表示,其中一条染色体始终来自B(全为1),另一条染色体来自非B亲本(初始全为0,代表来自A)。
- 每代回交中,非B染色体上的每个等位基因以50%概率从上一代继承,50%概率被B的等位基因(1)替换。
- 相似度定义为所有等位基因中与B相同的比例(B全为1)。
- 理论相似度公式为 1 - (1/2)^(代數+1),与模拟结果高度吻合。

结论:经过100代回交,后代与小麦B的基因型相似度极高(理论值超过0.9999999999999999999999999999999),说明通过连续回交可以几乎完全复制目标亲本的核DNA。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

stumblemodel 发表于 2026-3-20 20:47:25

FishC 发表于 2026-3-20 20:38
以下是模拟回交实验的Python代码,用于验证通过多代回交能否使后代基因型几乎完全复制目标亲本(小麦B)。 ...

如果我要把杂交代数作为自变量,相似度作为因变量,画出自变量在(0,100)的图像,怎样修改代码

FishC 发表于 2026-3-20 20:48:16

stumblemodel 发表于 2026-03-20 20:47
FishC 发表于 2026-3-20 20:38
以下是模拟回交实验的 ...

以下是修改后的代码,它会绘制杂交代数(0到100)与平均相似度的关系图:


import random
import matplotlib.pyplot as plt

# 参数设置
n_genes = 100          # 基因座数量
n_generations = 100    # 杂交代数
n_repeats = 100      # 重复实验次数

# 初始化存储每代平均相似度的列表
avg_similarities = * (n_generations + 1)

for _ in range(n_repeats):
    # 初始染色体:全部为0(表示来自A的等位基因)
    chrom = * n_genes
   
    # 进行n_generations代回交
    for gen in range(n_generations + 1):
      # 计算当前代的相似度
      similarity = (n_genes + sum(chrom)) / (2 * n_genes)
      avg_similarities += similarity
      
      if gen < n_generations:# 如果不是最后一代,准备下一代
            new_chrom = * n_genes
            for i in range(n_genes):
                # 以1/2的概率从上一代chrom中继承,1/2的概率从B继承(即变为1)
                if random.random() < 0.5:
                  new_chrom = chrom   # 继承上一代的等位基因
                else:
                  new_chrom = 1          # 从B继承,等位基因为1
            chrom = new_chrom

# 计算平均值
for gen in range(n_generations + 1):
    avg_similarities /= n_repeats

# 计算理论值
theoretical_similarities = []
for gen in range(n_generations + 1):
    theoretical = 1 - (0.5) ** (gen + 1)
    theoretical_similarities.append(theoretical)

# 绘制图像
generations = list(range(n_generations + 1))
plt.figure(figsize=(10, 6))

# 绘制模拟结果
plt.plot(generations, avg_similarities, 'b-', linewidth=2, label='模拟结果')

# 绘制理论曲线
plt.plot(generations, theoretical_similarities, 'r--', linewidth=2, label='理论曲线')

# 设置图表属性
plt.xlabel('杂交代数', fontsize=12)
plt.ylabel('平均相似度', fontsize=12)
plt.title('杂交代数与基因型相似度的关系', fontsize=14)
plt.grid(True, alpha=0.3)
plt.legend(fontsize=12)
plt.ylim(0.4, 1.05)

# 显示图表
plt.show()

# 输出最后几代的结果对比
print("最后10代的模拟结果与理论值对比:")
print("代数\t模拟相似度\t理论相似度")
for gen in range(90, n_generations + 1, 1):
    print(f"{gen}\t{avg_similarities:.8f}\t{theoretical_similarities:.8f}")


代码主要修改:

1. 创建 avg_similarities 列表来存储每一代的平均相似度
2. 在模拟过程中直接计算每一代的相似度并累加
3. 计算理论相似度曲线
4. 使用matplotlib绘制两条曲线:
   - 蓝色实线:模拟结果
   - 红色虚线:理论曲线
5. 图表显示了杂交代数(0到100)与平均相似度的关系
6. 输出最后10代的结果对比,验证模拟与理论的匹配程度

运行此代码后,您将看到:
- 图像显示相似度随代数增加而迅速上升,接近1但不完全达到1
- 前几代相似度增长较快,后面逐渐趋缓
- 模拟结果与理论曲线高度吻合
- 100代后相似度接近0.999999...,但理论上永远不会达到1(因为总有极小的概率某个等位基因从未被B的等位基因替换)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 关于python模拟遗传