天赐范式第183天:让选择开始生效——育种者方程与选择生效条件

天赐范式第183天第一篇:让选择开始生效------育种者方程与选择生效条件

版本 V3.3.21.0 | PID: TC-183-V3.3.21.0 | 2026-10-02

摘要

从更新规则推出平衡位移公式Δ*=β·h²·S/(1-β),用种群代际循环demo验证选择生效条件为h²>0.5(σ_v>σ_e),从182-1的变异存续升级到选择生效。

一、接续182-1------从存续到生效

182-1回答了:变异会不会被β强收缩抹平?结论:不会。D*=σ_v²/(1-β²),只要σ_v>0就有稳态多样性。

但182-1的变异是每轮独立gauss噪声------无遗传。没有遗传,选择对下一代毫无作用,"选择有效"无从谈起。

183-1跨出下一步:把变异升级成可遗传的,问选择能不能把变异导向适应性。这是从"存续"跨到"演化"的一跳。

二、问题提出------收缩和选择谁赢

更新规则(写死):

  1. 表型 x = g + e, e ~ N(0, σ_e²)
  2. 选择按 fitness(x) 选,fitness峰在x*=0.8(不是TARGET=0.5!)
  3. 子代基因 g' = TARGET + β·(g_sel - TARGET) + v, v ~ N(0, σ_v²)

关键张力:收缩把基因拉回0.5,选择把表型拉向0.8。182-1问"收缩和变异谁赢",183-1问"收缩和选择谁赢"。平衡时表型均值停在两者之间------停在哪?这就是要定量回答的问题。

三、从更新规则推导------平衡位移公式

亲代均值μ_g,位移Δ_g = μ_g - TARGET。

选中个体基因均值μ_{g_sel} = μ_g + h²·S(S = 表型选择差, h² = Var(g)/(Var(g)+σ_e²),本文模型设定下)。

子代基因均值:

μ_g' = TARGET + β·(μ_{g_sel} - TARGET) = TARGET + β·(Δ_g + h²·S)

子代位移:

Δ_g' = μ_g' - TARGET = β·(Δ_g + h²·S)

稳态 Δ_g' = Δ_g = Δ*:

Δ* = β·(Δ* + h²·S)

Δ*·(1 - β) = β·h²·S

Δ* = β·h²·S / (1 - β)

遗传力 h² = Var(g) / (Var(g) + σ_e²)(本文模型设定下):

  • 小σ_v → Var(g)小 → h²≈0 → Δ*≈0(没有可遗传方差)
  • σ_v≈σ_e → h²≈0.5(选择生效阈值,半效界)
  • 大σ_v → h²→1 → Δ* = β·S/(1-β)

182-1:变异存续条件 σ_v > 0。183-1:选择生效条件 σ_v ≥ σ_e(h² ≥ 0.5,σ_v=σ_e为半效界)。

四、种群代际循环------σ_v扫描

200个个体,500代,β=0.3,σ_e=0.02,选择比例0.3。

σ_v h²(力) S(差) Δ Var(g) 生效?
0.001 0.0027 +0.023244 +0.000032 0.000001 ❌
0.005 0.0634 +0.023970 +0.000682 0.000027 ❌
0.010 0.2105 +0.026049 +0.002400 0.000107 ❌
0.020 0.5104 +0.033088 +0.007455 0.000419 ✅
0.050 0.8636 +0.062817 +0.023748 0.002555 ✅
0.100 0.9617 +0.118697 +0.049816 0.010144 ✅
0.200 0.9900 +0.188016 +0.081546 0.040081 ✅
0.400 0.9975 +0.198286 +0.088300 0.159353 ✅
0.800 0.9994 +0.197687 +0.091621 0.636995 ✅
1.500 0.9998 +0.193669 +0.096365 2.237153 ✅

五、遗传力曲线------h²(σ_v)的S形转折

h² = Var(g) / (Var(g) + σ_e²),σ_e=0.02。

σ_v h² 生效?
0.001 0.0027 ❌
0.005 0.0634 ❌
0.010 0.2105 ❌
0.020 0.5104 ✅ 阈值
0.050 0.8636 ✅
0.100 0.9617 ✅
0.200 0.9900 ✅
0.400 0.9975 ✅
0.800 0.9994 ✅
1.500 0.9998 ✅

→ h²从0到1的S形转折(模拟观测),转折点在σ_v≈σ_e=0.02。

  • σ_v < σ_e:h² < 0.5,选择无效(变异信号被环境噪声淹没)
  • σ_v ≥ σ_e:h² ≥ 0.5,选择生效(变异信号超过环境噪声)

六、平衡位移验证------Δ ≈ β·h²·S/(1-β)

σ_v Δ(实测) β·h²·S/(1-β) 比值
0.001 +0.000032 +0.000027 +1.1889
0.005 +0.000682 +0.000651 +1.0482
0.010 +0.002400 +0.002350 +1.0212
0.020 +0.007455 +0.007238 +1.0300
0.050 +0.023748 +0.023250 +1.0214
0.100 +0.049816 +0.048923 +1.0183
0.200 +0.081546 +0.079774 +1.0222
0.400 +0.088300 +0.084765 +1.0417
0.800 +0.091621 +0.084669 +1.0821
1.500 +0.096365 +0.082986 +1.1612

注:σ_v=0.001时Δ和理论值都接近0,比值无意义(分母太小)。中间段(σ_v=0.0050.200)比值1.021.05,公式验证良好。大σ_v(≥0.400)单seed比值偏高1.04~1.16------是系统偏差还是漂变?见183-2多seed验证。

七、降调声明

  1. 本篇是demo演示。公式从更新规则严格推导,按147-2实测定义demo是模拟不是实证。
  2. fitness函数是设定的(单峰高斯),不是涌现的------实际fitness景观更复杂。
  3. 无重组无交配(单亲继承),实际遗传机制更丰富。
  4. 有限种群有漂变,大种群极限下漂变消失。
  5. fitness峰设在x*=0.8而非TARGET=0.5,是为了让收缩和选择有张力------如果重合则同义反复。
  6. 基因-表型分离用环境方差σ_e=0.02实现遗传力h²<1,实际环境效应更复杂。
  7. 与174选择压力的benefit定义对齐:174的benefit是定性描述,183-1给出定量公式。
  8. Δ*公式中h²·S是线性回归近似,大σ_v单seed比值偏高------183-2将做多seed验证。
  9. 育种者方程Δ*=β·h²·S/(1-β)是Lush(1937)育种者方程的标准形式。本篇贡献是从更新规则推到它并验证,不是发现新公式。
  10. 大σ_v(如1.50)时Var(g)约2.24,std约1.5是fitness峰宽的15倍------物理图像失真,仅用于测试公式在极端参数下的行为。

八、七条前提条件------选择生效验证

  • 条件1 独立性 ✅ 每个体独立变异独立被选
  • 条件2 隐私性 ✅ 纯数学验证,不涉及隐私
  • 条件3 繁衍性 🟡 种群代际循环是繁衍的简化模型,非完整繁衍验证
  • 条件4 安全性 ✅ β有界,种群有界
  • 条件5 不可篡改 --- 本demo不涉及篡改场景
  • 条件6 可继承 🟡 育种者方程可移植,非系列定义的基因跨代传递
  • 条件7 可终止 ✅ 有限代终止(数学语境映射,非体系达标)

结语

183-1接续182-1,从"存续"跨到"生效"。

182-1:变异不会被β强收缩抹平(D*>0)。183-1:选择能把变异导向适应性,但有条件------σ_v ≥ σ_e。

定量结果(从更新规则推导):

  • 平衡位移 Δ* = β·h²·S / (1 - β)
  • 遗传力 h² = Var(g) / (Var(g) + σ_e²)
  • 选择生效条件:σ_v ≥ σ_e(h² ≥ 0.5,半效界)

从存续到生效,条件从"σ_v > 0"升级到"σ_v ≥ σ_e"。收缩和选择的张力:表型均值停在TARGET和fitness峰之间,位置由β和h²共同决定。

这个系列还在逐步建设中,完善也是咱们和伙伴们的努力方向。

代码附录

python 复制代码
# -*- coding: utf-8 -*-
"""
天赐范式第183天:让选择开始生效 V3.3.21.0
接续182-1变异存续条件,问下一步:选择能不能把变异导向适应性?

模型(更新规则):
  表型 x = g + e,  e ~ N(0, sigma_e^2)
  选择按 fitness(x) 选,fitness 峰在 x* = 0.8
  子代基因 g' = TARGET + beta*(g_sel - TARGET) + v,  v ~ N(0, sigma_v^2)

从更新规则推导平衡位移:
  mu_g' = TARGET + beta*(mu_{g_sel} - TARGET)
  由回归 mu_{g_sel} = mu_g + h^2 * S (S = 表型选择差)
  Delta_g' = beta*(Delta_g + h^2 * S)
  稳态 Delta* = beta * h^2 * S / (1 - beta)

遗传力 h^2 = Var(g) / (Var(g) + sigma_e^2)
  小 sigma_v -> Var(g) 小 -> h^2 小 -> 选择无效
  sigma_v > sigma_e -> h^2 > 0.5 -> 选择开始生效
  大 sigma_v -> h^2 -> 1 -> 选择完全主导

核心结论:
  182-1:变异存续条件 sigma_v > 0
  183-1:选择生效条件 sigma_v > sigma_e(h^2 > 0.5)
  平衡位移 Delta* = beta * h^2 * S / (1 - beta)
"""

import sys
import random
import math
import numpy as np

if hasattr(sys.stdout, 'reconfigure'):
    sys.stdout.reconfigure(encoding='utf-8')

PID = "TC-183-V3.3.21.0"

TARGET = 0.5
FITNESS_PEAK = 0.8
FITNESS_WIDTH = 0.10
BETA = 0.3
SIGMA_E = 0.02
N_POP = 200
N_GENERATIONS = 500
SELECT_FRAC = 0.3

SIGMA_GRID = [0.001, 0.005, 0.01, 0.02, 0.05, 0.10, 0.20, 0.40, 0.80, 1.50]


def bar(title):
    print("=" * 72)
    print("  " + title)
    print("=" * 72)
    print()


def sub(title):
    print("【" + title)
    print("-" * 72)


def fitness(x):
    return math.exp(-(x - FITNESS_PEAK) ** 2 / (2 * FITNESS_WIDTH ** 2))


def run_generation(genes, sigma_v, sigma_e, beta, rng):
    phenos = [g + rng.gauss(0, sigma_e) for g in genes]
    n_select = max(2, int(len(genes) * SELECT_FRAC))
    fits = [fitness(x) for x in phenos]
    ranked = sorted(range(len(genes)), key=lambda i: fits[i], reverse=True)
    selected_idx = ranked[:n_select]

    mean_parents_x = float(np.mean(phenos))
    mean_selected_x = float(np.mean([phenos[i] for i in selected_idx]))
    S = mean_selected_x - mean_parents_x

    offspring = []
    for _ in range(len(genes)):
        parent_g = genes[rng.choice(selected_idx)]
        child_g = TARGET + beta * (parent_g - TARGET) + rng.gauss(0, sigma_v)
        offspring.append(child_g)

    mean_offspring_x = float(np.mean(offspring))

    var_g = float(np.var(genes))
    h2 = var_g / (var_g + sigma_e ** 2) if (var_g + sigma_e ** 2) > 1e-15 else 0.0

    return offspring, S, h2, mean_offspring_x, var_g


def run_evolution(sigma_v, n_pop, n_gen, beta, sigma_e, warmup=100):
    rng = random.Random(42)
    genes = [TARGET + rng.gauss(0, 0.1) for _ in range(n_pop)]

    Ss, h2s, means_x, var_gs = [], [], [], []

    for gen in range(n_gen):
        genes, S, h2, mean_x, var_g = run_generation(genes, sigma_v, sigma_e, beta, rng)
        if gen >= warmup:
            Ss.append(S)
            h2s.append(h2)
            means_x.append(mean_x)
            var_gs.append(var_g)

    return {
        'S_mean': float(np.mean(Ss)),
        'h2_mean': float(np.mean(h2s)),
        'mean_stable': float(np.mean(means_x)),
        'var_g': float(np.mean(var_gs)),
    }


def main():
    bar("天赐范式第183天:让选择开始生效 V3.3.21.0")
    print("  PID: {}".format(PID))
    print()

    sub("步骤0】接续182-1------从存续到生效")
    print("  182-1回答了:变异会不会被beta强收缩抹平?")
    print("  结论:不会。D* = sigma_v^2/(1-beta^2),只要sigma_v>0就有稳态多样性。")
    print()
    print("  但182-1的变异是每轮独立gauss噪声------无遗传。")
    print("  没有遗传,选择对下一代毫无作用,'选择有效'无从谈起。")
    print()
    print("  183-1跨出下一步:把变异升级成可遗传的,问选择能不能把变异导向适应性。")
    print("  这是从'存续'跨到'演化'的一跳。")
    print()

    sub("步骤1】问题提出------收缩和选择谁赢")
    print("  更新规则(写死):")
    print("    (1) 表型 x = g + e,  e ~ N(0, sigma_e^2)")
    print("    (2) 选择按 fitness(x) 选,fitness峰在x*={}(不是TARGET={}!)".format(FITNESS_PEAK, TARGET))
    print("    (3) 子代基因 g' = TARGET + beta*(g_sel - TARGET) + v,  v ~ N(0, sigma_v^2)")
    print()
    print("  关键张力:收缩把基因拉回{},选择把表型拉向{}。".format(TARGET, FITNESS_PEAK))
    print("  182-1问'收缩和变异谁赢',183-1问'收缩和选择谁赢'。")
    print("  平衡时表型均值停在两者之间------停在哪?这就是要定量回答的问题。")
    print()

    sub("步骤2】从更新规则推导------平衡位移公式")
    print("  亲代均值 mu_g,位移 Delta_g = mu_g - TARGET")
    print("  选中个体基因均值 mu_{g_sel} = mu_g + h^2 * S")
    print("    (S = 表型选择差, h^2 = Var(g)/(Var(g)+sigma_e^2),本文模型设定下)")
    print("  子代基因均值 mu_g' = TARGET + beta*(mu_{g_sel} - TARGET)")
    print("                    = TARGET + beta*(Delta_g + h^2 * S)")
    print("  子代位移 Delta_g' = mu_g' - TARGET = beta*(Delta_g + h^2 * S)")
    print()
    print("  稳态 Delta_g' = Delta_g = Delta*:")
    print("    Delta* = beta*(Delta* + h^2 * S)")
    print("    Delta*(1 - beta) = beta * h^2 * S")
    print("    Delta* = beta * h^2 * S / (1 - beta)")
    print()
    print("  遗传力 h^2 = Var(g) / (Var(g) + sigma_e^2)(本文模型设定下)")
    print("    小 sigma_v -> Var(g) 小 -> h^2 ~ 0 -> Delta* ~ 0(没有可遗传方差)")
    print("    sigma_v ~ sigma_e -> h^2 ~ 0.5(选择生效阈值,半效界)")
    print("    大 sigma_v -> h^2 -> 1 -> Delta* = beta * S / (1 - beta)")
    print()
    print("  182-1:变异存续条件 sigma_v > 0")
    print("  183-1:选择生效条件 sigma_v >= sigma_e(h^2 >= 0.5,sigma_v=sigma_e为半效界)")
    print()

    sub("步骤3】种群代际循环------sigma_v扫描")
    print("  {}个个体,{}代,beta={},sigma_e={},选择比例{}".format(
        N_POP, N_GENERATIONS, BETA, SIGMA_E, SELECT_FRAC))
    print()
    print("  | sigma_v | h^2(力) | S(差)   | Delta   | Var(g)  | 生效? |")
    print("  |---------|---------|---------|---------|---------|-------|")
    results = []
    for sigma_v in SIGMA_GRID:
        res = run_evolution(sigma_v, N_POP, N_GENERATIONS, BETA, SIGMA_E)
        results.append((sigma_v, res))
        delta = res['mean_stable'] - TARGET
        effective = "✅" if res['h2_mean'] > 0.5 else "❌"
        print("  | {:.3f}   | {:.4f}  | {:+.6f}| {:+.6f}| {:.6f}| {}    |".format(
            sigma_v, res['h2_mean'], res['S_mean'], delta, res['var_g'], effective))
    print()

    sub("步骤4】遗传力曲线------h^2(sigma_v)的S形转折")
    print("  h^2 = Var(g) / (Var(g) + sigma_e^2),sigma_e={}".format(SIGMA_E))
    print()
    print("  h^2(sigma_v)曲线:")
    for sigma_v, res in results:
        h2 = res['h2_mean']
        bar_len = int(50 * h2)
        marker = " <- 阈值" if abs(h2 - 0.5) < 0.15 else ""
        print("    sigma_v={:.3f}  h^2={:.4f}  {}{}".format(
            sigma_v, h2, "#" * bar_len, marker))
    print()
    print("  -> h^2从0到1的S形转折(模拟观测),转折点在sigma_v ~ sigma_e = {}".format(SIGMA_E))
    print("  -> sigma_v < sigma_e:h^2 < 0.5,选择无效(变异信号被环境噪声淹没)")
    print("  -> sigma_v >= sigma_e:h^2 >= 0.5,选择生效(变异信号超过环境噪声)")
    print()

    sub("步骤5】平衡位移验证------Delta ≈ beta * h^2 * S / (1 - beta)")
    print("  | sigma_v | Delta(实测) | β·h^2·S/(1-β) | 比值   |")
    print("  |---------|-----------|------------|--------|")
    for sigma_v, res in results:
        delta = res['mean_stable'] - TARGET
        delta_theory = BETA * res['h2_mean'] * res['S_mean'] / (1 - BETA)
        ratio = delta / delta_theory if abs(delta_theory) > 1e-8 else 0
        print("  | {:.3f}   | {:+.6f}  | {:+.6f}   | {:+.4f} |".format(
            sigma_v, delta, delta_theory, ratio))
    print()
    print("  注:sigma_v=0.001时Delta和理论值都接近0,比值无意义(分母太小)。")
    print("  中间段(sigma_v=0.005~0.200)比值1.02~1.05,公式验证良好。")
    print("  大sigma_v(>=0.400)单seed比值偏高1.04~1.16------是系统偏差还是漂变?见183-2多seed验证。")
    print()

    sub("步骤6】降调声明")
    print("  1. 本篇是demo演示。公式从更新规则严格推导,按147-2实测定义demo是模拟不是实证。")
    print("  2. fitness函数是设定的(单峰高斯),不是涌现的------实际fitness景观更复杂。")
    print("  3. 无重组无交配(单亲继承),实际遗传机制更丰富。")
    print("  4. 有限种群有漂变,大种群极限下漂变消失。")
    print("  5. fitness峰设在x*=0.8而非TARGET=0.5,是为了让收缩和选择有张力------如果重合则同义反复。")
    print("  6. 基因-表型分离用环境方差sigma_e={}实现遗传力h^2<1,实际环境效应更复杂。".format(SIGMA_E))
    print("  7. 与174选择压力的benefit定义对齐:174的benefit是定性描述,183-1给出定量公式。")
    print("  8. Delta*公式中h^2*S是线性回归近似,大sigma_v单seed比值偏高------183-2将做多seed验证。")
    print("  9. 育种者方程Delta*=beta*h^2*S/(1-beta)是Lush(1937)育种者方程的标准形式。")
    print("     本篇贡献是从更新规则推到它并验证,不是发现新公式。")
    print(" 10. 大sigma_v(如1.50)时Var(g)约2.24,std约1.5是fitness峰宽的15倍------")
    print("     物理图像失真,仅用于测试公式在极端参数下的行为。")
    print()

    sub("步骤7】七条前提条件------选择生效验证")
    print("  条件1 独立性 ✅  每个体独立变异独立被选")
    print("  条件2 隐私性 ✅  纯数学验证,不涉及隐私")
    print("  条件3 繁衍性 🟡  种群代际循环是繁衍的简化模型,非完整繁衍验证")
    print("  条件4 安全性 ✅  beta有界,种群有界")
    print("  条件5 不可篡改 ---  本demo不涉及篡改场景")
    print("  条件6 可继承 🟡  育种者方程可移植,非系列定义的基因跨代传递")
    print("  条件7 可终止 ✅  有限代终止(数学语境映射,非体系达标)")
    print()

    bar("结语")
    print("  183-1接续182-1,从'存续'跨到'生效'。")
    print()
    print("  182-1:变异不会被beta强收缩抹平(D*>0)。")
    print("  183-1:选择能把变异导向适应性,但有条件------sigma_v >= sigma_e。")
    print()
    print("  定量结果(从更新规则推导):")
    print("    平衡位移 Delta* = beta * h^2 * S / (1 - beta)")
    print("    遗传力 h^2 = Var(g) / (Var(g) + sigma_e^2)")
    print("    选择生效条件:sigma_v >= sigma_e(h^2 >= 0.5,半效界)")
    print()
    print("  从存续到生效,条件从'sigma_v > 0'升级到'sigma_v >= sigma_e'。")
    print("  收缩和选择的张力:表型均值停在TARGET和fitness峰之间,位置由beta和h^2共同决定。")
    print()
    print("  这个系列还在逐步建设中,完善也是咱们和伙伴们的努力方向。")
    print("=" * 72)


if __name__ == "__main__":
    main()
相关推荐
benchmark_cc1 小时前
批量行情返回后,怎样把请求失败的股票和正常数据分开?
python·数据分析·pandas·量化交易·股票数据·quantdash
y = xⁿ2 小时前
关于Agent工程落地
前端·人工智能·python
小小张说故事2 小时前
pip 安装慢、超时、报错?一份国内源配置 + 9 个高频报错对照表
python
在世修行2 小时前
干货:长任务反馈
python·长任务
东方芷兰2 小时前
Agent 技术摘要 05 —— BP、SaaS、B2B、C2B、B2C
java·笔记·python·语言模型·自然语言处理
老歌老听老掉牙3 小时前
麻花钻切削过程的力学与效率解析
python·钻头·切削
happylifetree3 小时前
Python27:核心语法-流程控制语句-match模式匹配
python
奋进的LY3 小时前
spacy的安装和使用教程
人工智能·python·深度学习·github
znx9393 小时前
机器学习赋能量化交易:解锁新时代投资的核心竞争优势
人工智能·python·机器学习·期魔方