鱼C论坛

 找回密码
 立即注册
查看: 23|回复: 3

关于python模拟遗传

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

使用道具 举报

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


  1. import random

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

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

  8. for _ in range(n_repeats):
  9.     # 初始染色体:全部为0(表示来自A的等位基因)
  10.     chrom = [0] * n_genes
  11.     # 计算初始相似度(第0代)
  12.     similarity = (n_genes + sum(chrom)) / (2 * n_genes)
  13.     avg_similarity[0] += similarity
  14.    
  15.     # 进行100代回交
  16.     for gen in range(1, n_generations + 1):
  17.         new_chrom = [0] * n_genes
  18.         for i in range(n_genes):
  19.             # 以1/2的概率从上一代chrom中继承,1/2的概率从B继承(即变为1)
  20.             if random.random() < 0.5:
  21.                 new_chrom[i] = chrom[i]   # 继承上一代的等位基因
  22.             else:
  23.                 new_chrom[i] = 1          # 从B继承,等位基因为1
  24.         chrom = new_chrom
  25.         # 计算当前代的相似度
  26.         similarity = (n_genes + sum(chrom)) / (2 * n_genes)
  27.         avg_similarity[gen] += similarity

  28. # 计算平均值
  29. for gen in range(n_generations + 1):
  30.     avg_similarity[gen] /= n_repeats

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

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

  37. # 理论值计算:1 - (1/2)^(gen+1)
  38. print("\n理论相似度(对比):")
  39. for gen in range(0, n_generations + 1, 10):
  40.     theoretical = 1 - (0.5) ** (gen + 1)
  41.     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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果我要把杂交代数作为自变量,相似度作为因变量,画出自变量在(0,100)的图像,怎样修改代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
stumblemodel 发表于 2026-03-20 20:47
FishC 发表于 2026-3-20 20:38
以下是模拟回交实验的 ...


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


  1. import random
  2. import matplotlib.pyplot as plt

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

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

  9. for _ in range(n_repeats):
  10.     # 初始染色体:全部为0(表示来自A的等位基因)
  11.     chrom = [0] * n_genes
  12.    
  13.     # 进行n_generations代回交
  14.     for gen in range(n_generations + 1):
  15.         # 计算当前代的相似度
  16.         similarity = (n_genes + sum(chrom)) / (2 * n_genes)
  17.         avg_similarities[gen] += similarity
  18.         
  19.         if gen < n_generations:  # 如果不是最后一代,准备下一代
  20.             new_chrom = [0] * n_genes
  21.             for i in range(n_genes):
  22.                 # 以1/2的概率从上一代chrom中继承,1/2的概率从B继承(即变为1)
  23.                 if random.random() < 0.5:
  24.                     new_chrom[i] = chrom[i]   # 继承上一代的等位基因
  25.                 else:
  26.                     new_chrom[i] = 1          # 从B继承,等位基因为1
  27.             chrom = new_chrom

  28. # 计算平均值
  29. for gen in range(n_generations + 1):
  30.     avg_similarities[gen] /= n_repeats

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

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

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

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

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

  50. # 显示图表
  51. plt.show()

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


代码主要修改:

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-20 22:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表