import random
from dataclasses import dataclass, field
from typing import List, Dict, Tuple
@dataclass
class Seed:
id: str
species: str
generation: int = 0
traits: Dict[str, float] = field(default_factory=dict) # 性状字典,如{"yield": 8.2, "drought_resistance": 7.5}
parents: Tuple[str, str] = ("", "") # 父代种子ID
def __str__(self):
return f"{self.species} Seed-{self.id} (Gen {self.generation})"
class BreedingSystem:
def __init__(self):
self.seed_library: Dict[str, Seed] = {}
self.trait_ranges = {
"yield": (5.0, 10.0),
"drought_resistance": (3.0, 9.0),
"pest_resistance": (4.0, 8.5),
"growth_speed": (6.0, 9.5)
}
def add_base_seed(self, species: str, traits: Dict[str, float]):
"""添加基础种子(第0代)"""
seed_id = f"{species}-BASE-{len(self.seed_library) + 1}"
new_seed = Seed(
id=seed_id,
species=species,
traits=traits,
generation=0
)
self.seed_library[seed_id] = new_seed
return new_seed
def cross_breed(self, parent1_id: str, parent2_id: str) -> Seed:
"""杂交两个种子产生新品种"""
parent1 = self.seed_library[parent1_id]
parent2 = self.seed_library[parent2_id]
if parent1.species != parent2.species:
raise ValueError("不同物种不能杂交")
# 生成新种子ID
new_id = f"{parent1.species}-HYB-{len(self.seed_library) + 1}"
# 杂交遗传逻辑:性状取平均值并加入随机变异
new_traits = {}
for trait, (min_val, max_val) in self.trait_ranges.items():
base_value = (parent1.traits.get(trait, min_val) + (parent2.traits.get(trait, min_val)) / 2
mutation = random.uniform(-0.5, 0.5) # 小范围变异
new_value = max(min_val, min(max_val, base_value + mutation))
new_traits[trait] = round(new_value, 1)
# 创建新种子
new_seed = Seed(
id=new_id,
species=parent1.species,
generation=max(parent1.generation, parent2.generation) + 1,
traits=new_traits,
parents=(parent1.id, parent2.id)
)
self.seed_library[new_id] = new_seed
return new_seed
def selective_breed(self, target_trait: str, num_parents: int = 2) -> Seed:
"""选择育种:选择具有目标性状最优表现的种子进行杂交"""
# 按目标性状排序种子
sorted_seeds = sorted(
[s for s in self.seed_library.values() if target_trait in s.traits],
key=lambda x: x.traits[target_trait],
reverse=True
)
if len(sorted_seeds) < num_parents:
raise ValueError("可用种子数量不足")
# 选择最优的num_parents个种子作为父母
parents = sorted_seeds[:num_parents]
print(f"Selected parents for {target_trait} breeding:")
for i, parent in enumerate(parents):
print(f" Parent {i+1}: {parent} ({target_trait}={parent.traits[target_trait]})")
# 进行多代杂交(简化为单次杂交)
return self.cross_breed(parents[0].id, parents[1].id)
def get_seed_info(self, seed_id: str) -> str:
"""获取种子详细信息"""
seed = self.seed_library[seed_id]
info = [
f"ID: {seed.id}",
f"Species: {seed.species}",
f"Generation: {seed.generation}",
"Traits:"
]
for trait, value in seed.traits.items():
info.append(f" - {trait}: {value}")
if seed.parents[0]:
info.append(f"Parents: {seed.parents[0]} x {seed.parents[1]}")
return "\n".join(info)
# 示例用法
if __name__ == "__main__":
system = BreedingSystem()
# 添加基础种子
wheat1 = system.add_base_seed("Wheat", {"yield": 6.5, "drought_resistance": 7.0, "pest_resistance": 5.5})
wheat2 = system.add_base_seed("Wheat", {"yield": 7.2, "drought_resistance": 5.5, "pest_resistance": 6.8})
rice1 = system.add_base_seed("Rice", {"yield": 8.1, "drought_resistance": 4.2, "growth_speed": 7.8})
print("=== Base Seeds ===")
print(system.get_seed_info(wheat1.id))
print("\n" + system.get_seed_info(wheat2.id))
# 杂交育种
hybrid_wheat = system.cross_breed(wheat1.id, wheat2.id)
print("\n=== Hybrid Wheat ===")
print(system.get_seed_info(hybrid_wheat.id))
# 选择育种(追求高产)
print("\n=== Selective Breeding for Yield ===")
high_yield_wheat = system.selective_breed("yield")
print("\n=== Resulting High-Yield Wheat ===")
print(system.get_seed_info(high_yield_wheat.id))