EG/plugins/user/vegetation_ecosystem/vegetation/growth_simulator.py
2025-10-30 11:46:41 +08:00

776 lines
25 KiB
Python

"""
生长模拟器
负责模拟植被的生长、繁殖和死亡过程
"""
import time
from typing import Dict, Any, List, Optional
import math
import random
class GrowthSimulator:
"""
生长模拟器
负责模拟植被的生长、繁殖、死亡和生命周期过程
"""
def __init__(self, plugin):
"""
初始化生长模拟器
Args:
plugin: 植被和生态系统插件实例
"""
self.plugin = plugin
self.enabled = False
self.initialized = False
# 生长模型参数
self.growth_models = {
'exponential': {
'name': '指数生长',
'description': '快速增长后趋于稳定',
'formula': 'size = max_size * (1 - exp(-rate * time))'
},
'logistic': {
'name': '逻辑生长',
'description': 'S型生长曲线',
'formula': 'size = max_size / (1 + exp(-rate * (time - midpoint)))'
},
'linear': {
'name': '线性生长',
'description': '恒定速率生长',
'formula': 'size = rate * time'
},
'seasonal': {
'name': '季节性生长',
'description': '受季节影响的生长',
'formula': 'size = base_rate * (1 + amplitude * sin(frequency * time + phase))'
}
}
# 默认生长参数
self.default_growth_params = {
'model': 'logistic', # 默认生长模型
'base_rate': 0.1, # 基础生长速率
'max_size': 1.0, # 最大尺寸
'optimal_conditions': { # 最佳生长条件
'temperature': (15, 30),
'humidity': (50, 80),
'light': (0.6, 1.0),
'nutrients': (0.5, 1.0)
},
'stress_factors': { # 压力因子
'drought_tolerance': 0.3,
'cold_tolerance': 0.2,
'heat_tolerance': 0.2,
'shade_tolerance': 0.4
}
}
# 繁殖参数
self.reproduction_params = {
'rate': 0.05, # 繁殖速率
'method': 'seeds', # 繁殖方式: 'seeds', 'sprouting', 'spores'
'dispersal_distance': 10.0, # 传播距离
'seasonal_factor': 1.0, # 季节性因子
'competition_radius': 2.0 # 竞争半径
}
# 死亡参数
self.mortality_params = {
'natural_lifespan': 365, # 自然寿命(天)
'stress_mortality': 0.01, # 压力导致的死亡率
'disease_factor': 0.05, # 疾病因子
'competition_factor': 0.1 # 竞争因子
}
# 环境影响因子
self.environment_impacts = {
'temperature_impact': 1.0,
'humidity_impact': 1.0,
'light_impact': 1.0,
'nutrient_impact': 1.0,
'pollution_impact': 0.0
}
# 生长阶段定义
self.growth_stages = {
'seedling': {
'name': '幼苗期',
'size_range': (0.0, 0.2),
'duration': 30, # 天
'vulnerability': 0.8
},
'juvenile': {
'name': '幼年期',
'size_range': (0.2, 0.5),
'duration': 90,
'vulnerability': 0.5
},
'mature': {
'name': '成熟期',
'size_range': (0.5, 0.9),
'duration': 180,
'vulnerability': 0.2
},
'old_age': {
'name': '老年期',
'size_range': (0.9, 1.0),
'duration': 90,
'vulnerability': 0.4
}
}
# 时间配置
self.time_config = {
'simulation_speed': 1.0, # 模拟速度
'update_interval': 60.0, # 更新间隔(秒)
'last_update': 0.0
}
# 统计信息
self.growth_stats = {
'total_growth_cycles': 0,
'successful_reproductions': 0,
'natural_deaths': 0,
'stress_deaths': 0,
'average_growth_rate': 0.0
}
print("✓ 生长模拟器已创建")
def initialize(self) -> bool:
"""
初始化生长模拟器
Returns:
是否初始化成功
"""
try:
self.initialized = True
print("✓ 生长模拟器初始化完成")
return True
except Exception as e:
print(f"✗ 生长模拟器初始化失败: {e}")
import traceback
traceback.print_exc()
return False
def enable(self) -> bool:
"""
启用生长模拟器
Returns:
是否启用成功
"""
try:
if not self.initialized:
print("✗ 生长模拟器未初始化")
return False
self.enabled = True
print("✓ 生长模拟器已启用")
return True
except Exception as e:
print(f"✗ 生长模拟器启用失败: {e}")
import traceback
traceback.print_exc()
return False
def disable(self):
"""禁用生长模拟器"""
try:
self.enabled = False
print("✓ 生长模拟器已禁用")
except Exception as e:
print(f"✗ 生长模拟器禁用失败: {e}")
import traceback
traceback.print_exc()
def finalize(self):
"""清理生长模拟器资源"""
try:
self.disable()
self.initialized = False
print("✓ 生长模拟器资源已清理")
except Exception as e:
print(f"✗ 生长模拟器资源清理失败: {e}")
import traceback
traceback.print_exc()
def update(self, dt: float):
"""
更新生长模拟器状态
Args:
dt: 时间增量
"""
try:
if not self.enabled:
return
# 更新时间
self.time_config['last_update'] += dt
# 检查是否需要更新
if self.time_config['last_update'] >= self.time_config['update_interval']:
# 执行生长更新
self._update_growth(dt)
# 重置更新计时器
self.time_config['last_update'] = 0.0
except Exception as e:
print(f"✗ 生长模拟器更新失败: {e}")
import traceback
traceback.print_exc()
def _update_growth(self, dt: float):
"""
更新植被生长
Args:
dt: 时间增量
"""
try:
if not self.plugin.vegetation_manager:
return
# 获取所有植被实例
instances = self.plugin.vegetation_manager.get_all_vegetation_instances()
for instance_id, instance in instances.items():
if not instance['alive']:
continue
# 获取植被类型信息
veg_type = instance['type']
veg_info = self.plugin.vegetation_manager.get_vegetation_info(veg_type)
if not veg_info:
continue
# 计算环境影响
environment_factors = self.plugin.vegetation_manager.get_environment_factors()
environmental_modifier = self._calculate_environmental_modifier(veg_type, environment_factors)
# 更新年龄
age_increase = dt / 86400 * self.time_config['simulation_speed'] # 转换为天
instance['age'] += age_increase
# 计算生长速率
growth_rate = veg_info['growth_rate'] * environmental_modifier
# 更新大小
size_increase = growth_rate * dt / 86400
instance['size'] = min(1.0, instance['size'] + size_increase)
# 更新健康度
health_change = self._calculate_health_change(instance, veg_info, environment_factors)
self.plugin.vegetation_manager.update_vegetation_health(instance_id, health_change)
# 检查是否应该繁殖
if random.random() < veg_info['reproduction_rate'] * dt / 3600: # 每小时检查
self._attempt_reproduction(instance_id, instance)
# 检查是否应该死亡
if self._should_die(instance, veg_info):
self.plugin.vegetation_manager.remove_vegetation_instance(instance_id)
self.growth_stats['natural_deaths'] += 1
# 更新统计信息
self.growth_stats['total_growth_cycles'] += 1
except Exception as e:
print(f"✗ 生长更新失败: {e}")
def _calculate_environmental_modifier(self, veg_type: str, environment_factors: Dict[str, float]) -> float:
"""
计算环境影响因子
Args:
veg_type: 植被类型
environment_factors: 环境因子
Returns:
环境影响因子 (0.0-2.0)
"""
try:
if veg_type not in self.plugin.vegetation_manager.vegetation_types:
return 1.0
veg_info = self.plugin.vegetation_manager.vegetation_types[veg_type]
preferred_conditions = veg_info['preferred_conditions']
# 计算各因子的适宜性
temperature_suitability = self._calculate_suitability(
environment_factors['temperature'],
preferred_conditions['temperature']
)
humidity_suitability = self._calculate_suitability(
environment_factors['humidity'],
preferred_conditions['humidity']
)
# 综合环境影响因子
modifier = (temperature_suitability + humidity_suitability) / 2.0
# 应用环境影响
for factor, impact in self.environment_impacts.items():
modifier *= (1.0 + impact * 0.1) # 轻微影响
return max(0.0, min(2.0, modifier))
except Exception as e:
print(f"✗ 环境影响因子计算失败: {e}")
return 1.0
def _calculate_suitability(self, current_value: float, preferred_range: tuple) -> float:
"""
计算环境因子适宜性
Args:
current_value: 当前值
preferred_range: 偏好范围
Returns:
适宜性评分 (0.0-1.0)
"""
try:
min_val, max_val = preferred_range
if min_val <= current_value <= max_val:
return 1.0
elif current_value < min_val:
if min_val > 0:
return max(0.0, 1.0 - (min_val - current_value) / min_val)
return 0.0
else: # current_value > max_val
if max_val > 0:
return max(0.0, 1.0 - (current_value - max_val) / max_val)
return 0.0
except Exception as e:
print(f"✗ 适宜性计算失败: {e}")
return 0.5
def _calculate_health_change(self, instance: Dict[str, Any], veg_info: Dict[str, Any],
environment_factors: Dict[str, float]) -> float:
"""
计算健康度变化
Args:
instance: 植被实例
veg_info: 植被信息
environment_factors: 环境因子
Returns:
健康度变化值
"""
try:
health_change = 0.0
# 基于年龄的影响
age_factor = self._calculate_age_factor(instance['age'], veg_info['lifespan'])
health_change += age_factor
# 基于环境的压力
stress_factor = self._calculate_stress_factor(environment_factors, veg_info)
health_change += stress_factor
# 自然恢复
health_change += 0.001 # 缓慢恢复
return max(-0.1, min(0.1, health_change))
except Exception as e:
print(f"✗ 健康度变化计算失败: {e}")
return 0.0
def _calculate_age_factor(self, age: float, lifespan: float) -> float:
"""
计算年龄因子对健康的影响
Args:
age: 年龄
lifespan: 寿命
Returns:
年龄因子
"""
try:
if lifespan <= 0:
return 0.0
age_ratio = age / lifespan
# 幼年期增长,成年期稳定,老年期下降
if age_ratio < 0.2: # 幼年期
return 0.02 # 快速增长
elif age_ratio < 0.8: # 成年期
return 0.005 # 缓慢增长
else: # 老年期
return -0.03 # 快速下降
except Exception as e:
print(f"✗ 年龄因子计算失败: {e}")
return 0.0
def _calculate_stress_factor(self, environment_factors: Dict[str, float], veg_info: Dict[str, Any]) -> float:
"""
计算环境压力因子
Args:
environment_factors: 环境因子
veg_info: 植被信息
Returns:
压力因子
"""
try:
stress = 0.0
# 温度压力
temp = environment_factors['temperature']
preferred_temp = veg_info['preferred_conditions']['temperature']
if temp < preferred_temp[0] or temp > preferred_temp[1]:
stress -= 0.01
# 湿度压力
humidity = environment_factors['humidity']
preferred_humidity = veg_info['preferred_conditions']['humidity']
if humidity < preferred_humidity[0] or humidity > preferred_humidity[1]:
stress -= 0.01
# 光照压力
light = environment_factors['light_level']
# 假设光照适宜范围是0.5-1.0
if light < 0.5:
stress -= 0.005
return stress
except Exception as e:
print(f"✗ 压力因子计算失败: {e}")
return 0.0
def _should_die(self, instance: Dict[str, Any], veg_info: Dict[str, Any]) -> bool:
"""
判断植被是否应该死亡
Args:
instance: 植被实例
veg_info: 植被信息
Returns:
是否应该死亡
"""
try:
# 年龄导致的死亡
if instance['age'] > veg_info['lifespan']:
return True
# 健康度过低导致的死亡
if instance['health'] <= 0.0:
return True
# 压力导致的死亡
stress_death_probability = 0.001 * (1.0 - instance['health'])
if random.random() < stress_death_probability:
return True
return False
except Exception as e:
print(f"✗ 死亡判断失败: {e}")
return False
def _attempt_reproduction(self, parent_id: int, parent_instance: Dict[str, Any]):
"""
尝试繁殖
Args:
parent_id: 父代ID
parent_instance: 父代实例
"""
try:
if not self.plugin.vegetation_manager:
return
# 检查繁殖条件
if parent_instance['health'] < 0.3: # 健康度过低无法繁殖
return
if parent_instance['size'] < 0.2: # 太小无法繁殖
return
# 计算繁殖位置(在父代附近)
parent_pos = parent_instance['position']
dispersal_distance = self.reproduction_params['dispersal_distance']
angle = random.uniform(0, 2 * math.pi)
distance = random.uniform(0, dispersal_distance)
new_x = parent_pos[0] + distance * math.cos(angle)
new_z = parent_pos[2] + distance * math.sin(angle)
# 检查竞争
if self._check_competition(new_x, new_z):
return
# 创建新实例
new_instance_id = self.plugin.vegetation_manager.create_vegetation_instance(
parent_instance['type'],
(new_x, parent_pos[1], new_z),
initial_age=0.0,
initial_health=0.5
)
if new_instance_id >= 0:
self.growth_stats['successful_reproductions'] += 1
except Exception as e:
print(f"✗ 繁殖尝试失败: {e}")
def _check_competition(self, x: float, z: float) -> bool:
"""
检查新位置的竞争情况
Args:
x: X坐标
z: Z坐标
Returns:
是否存在竞争
"""
try:
if not self.plugin.vegetation_manager:
return False
instances = self.plugin.vegetation_manager.get_all_vegetation_instances()
competition_radius = self.reproduction_params['competition_radius']
for instance in instances.values():
if not instance['alive']:
continue
instance_x, _, instance_z = instance['position']
distance = math.sqrt((x - instance_x)**2 + (z - instance_z)**2)
if distance < competition_radius:
return True # 存在竞争
return False
except Exception as e:
print(f"✗ 竞争检查失败: {e}")
return False
def get_growth_models(self) -> Dict[str, Dict[str, str]]:
"""
获取生长模型
Returns:
生长模型字典
"""
return self.growth_models.copy()
def set_growth_model(self, model: str):
"""
设置生长模型
Args:
model: 模型名称
"""
try:
if model in self.growth_models:
self.default_growth_params['model'] = model
print(f"✓ 生长模型设置为: {self.growth_models[model]['name']}")
else:
print(f"✗ 无效的生长模型: {model}")
except Exception as e:
print(f"✗ 生长模型设置失败: {e}")
def set_growth_parameter(self, parameter: str, value: Any):
"""
设置生长参数
Args:
parameter: 参数名称
value: 参数值
"""
try:
if parameter in self.default_growth_params:
self.default_growth_params[parameter] = value
print(f"✓ 生长参数已设置: {parameter} = {value}")
else:
print(f"✗ 无效的生长参数: {parameter}")
except Exception as e:
print(f"✗ 生长参数设置失败: {e}")
def get_growth_parameters(self) -> Dict[str, Any]:
"""
获取生长参数
Returns:
生长参数字典
"""
return self.default_growth_params.copy()
def set_reproduction_parameter(self, parameter: str, value: Any):
"""
设置繁殖参数
Args:
parameter: 参数名称
value: 参数值
"""
try:
if parameter in self.reproduction_params:
self.reproduction_params[parameter] = value
print(f"✓ 繁殖参数已设置: {parameter} = {value}")
else:
print(f"✗ 无效的繁殖参数: {parameter}")
except Exception as e:
print(f"✗ 繁殖参数设置失败: {e}")
def get_reproduction_parameters(self) -> Dict[str, Any]:
"""
获取繁殖参数
Returns:
繁殖参数字典
"""
return self.reproduction_params.copy()
def set_mortality_parameter(self, parameter: str, value: Any):
"""
设置死亡参数
Args:
parameter: 参数名称
value: 参数值
"""
try:
if parameter in self.mortality_params:
self.mortality_params[parameter] = value
print(f"✓ 死亡参数已设置: {parameter} = {value}")
else:
print(f"✗ 无效的死亡参数: {parameter}")
except Exception as e:
print(f"✗ 死亡参数设置失败: {e}")
def get_mortality_parameters(self) -> Dict[str, Any]:
"""
获取死亡参数
Returns:
死亡参数字典
"""
return self.mortality_params.copy()
def set_environment_impact(self, factor: str, impact: float):
"""
设置环境影响因子
Args:
factor: 影响因子名称
impact: 影响值
"""
try:
if factor in self.environment_impacts:
self.environment_impacts[factor] = impact
print(f"✓ 环境影响因子已设置: {factor} = {impact}")
else:
print(f"✗ 无效的环境影响因子: {factor}")
except Exception as e:
print(f"✗ 环境影响因子设置失败: {e}")
def get_environment_impacts(self) -> Dict[str, float]:
"""
获取环境影响因子
Returns:
环境影响因子字典
"""
return self.environment_impacts.copy()
def set_time_config(self, config: Dict[str, float]):
"""
设置时间配置
Args:
config: 时间配置字典
"""
try:
self.time_config.update(config)
print(f"✓ 时间配置已更新: {self.time_config}")
except Exception as e:
print(f"✗ 时间配置更新失败: {e}")
def get_time_config(self) -> Dict[str, float]:
"""
获取时间配置
Returns:
时间配置字典
"""
return self.time_config.copy()
def get_growth_stats(self) -> Dict[str, Any]:
"""
获取生长统计信息
Returns:
生长统计信息字典
"""
return self.growth_stats.copy()
def reset_growth_stats(self):
"""重置生长统计信息"""
try:
self.growth_stats = {
'total_growth_cycles': 0,
'successful_reproductions': 0,
'natural_deaths': 0,
'stress_deaths': 0,
'average_growth_rate': 0.0
}
print("✓ 生长统计信息已重置")
except Exception as e:
print(f"✗ 生长统计信息重置失败: {e}")
def simulate_seasonal_growth(self, season: str) -> float:
"""
模拟季节性生长
Args:
season: 季节名称
Returns:
季节性生长修正因子
"""
try:
seasonal_factors = {
'spring': 1.5, # 春季生长旺盛
'summer': 1.2, # 夏季生长良好
'autumn': 0.8, # 秋季生长减缓
'winter': 0.3 # 冬季生长缓慢
}
return seasonal_factors.get(season, 1.0)
except Exception as e:
print(f"✗ 季节性生长模拟失败: {e}")
return 1.0