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))
问题反馈