EG/plugins/user/vegetation_ecosystem/ecosystem/ecosystem_dynamics.py
2025-12-12 16:16:15 +08:00

608 lines
21 KiB
Python

"""
生态系统动力学
负责模拟生态系统中的复杂动力学过程
"""
import time
from typing import Dict, Any, List, Optional
import math
import random
class EcosystemDynamics:
"""
生态系统动力学
负责模拟生态系统中的复杂动力学过程,包括能量流动、物质循环等
"""
def __init__(self, plugin):
"""
初始化生态系统动力学
Args:
plugin: 植被和生态系统插件实例
"""
self.plugin = plugin
self.enabled = False
self.initialized = False
# 能量流动模型
self.energy_flow_model = {
'primary_production': 1000.0, # 初级生产力 (单位: 能量/天)
'trophic_efficiency': 0.1, # 营养级效率 (10%定律)
'respiration_loss': 0.2, # 呼吸损失
'decomposition_rate': 0.05, # 分解速率
'energy_transfer_loss': 0.9 # 能量传递损失
}
# 物质循环模型
self.nutrient_cycle_model = {
'carbon_cycle': {
'photosynthesis_rate': 0.8, # 光合作用速率
'respiration_rate': 0.3, # 呼吸速率
'decomposition_rate': 0.1, # 分解速率
'ocean_absorption': 0.05 # 海洋吸收速率
},
'nitrogen_cycle': {
'nitrogen_fixation': 0.02, # 固氮作用
'nitrification': 0.03, # 硝化作用
'denitrification': 0.01, # 反硝化作用
'plant_uptake': 0.05 # 植物吸收
},
'phosphorus_cycle': {
'weathering_rate': 0.01, # 风化速率
'plant_uptake': 0.02, # 植物吸收
'mineralization': 0.015, # 矿化作用
'leaching': 0.005 # 流失速率
}
}
# 生态系统反馈机制
self.feedback_mechanisms = {
'positive_feedback': {
'description': '增强系统变化的反馈',
'examples': ['植被增加导致更多降水', '温度升高加速分解']
},
'negative_feedback': {
'description': '抑制系统变化的反馈',
'examples': ['捕食者增加导致猎物减少', '营养缺乏抑制植物生长']
}
}
# 生态系统稳定性指标
self.stability_indicators = {
'resilience': 0.7, # 恢复力
'resistance': 0.6, # 抵抗力
'persistence': 0.8, # 持续性
'constancy': 0.5, # 恒定性
'predictability': 0.4 # 可预测性
}
# 系统动态参数
self.dynamic_parameters = {
'time_scale': 1.0, # 时间尺度
'spatial_scale': 1.0, # 空间尺度
'complexity_level': 0.8, # 复杂度水平
'stochastic_factor': 0.1 # 随机因子
}
# 生态系统服务
self.ecosystem_services = {
'provisioning': {
'food': 0.0,
'water': 0.0,
'timber': 0.0,
'fiber': 0.0
},
'regulating': {
'climate_regulation': 0.0,
'water_regulation': 0.0,
'disease_regulation': 0.0,
'pollination': 0.0
},
'supporting': {
'soil_formation': 0.0,
'nutrient_cycling': 0.0,
'primary_production': 0.0
},
'cultural': {
'recreation': 0.0,
'aesthetic': 0.0,
'education': 0.0,
'spiritual': 0.0
}
}
# 系统状态
self.system_state = {
'total_energy': 10000.0, # 总能量
'available_nutrients': 500.0, # 可用营养物质
'biodiversity_index': 0.6, # 生物多样性指数
'stability_index': 0.7, # 稳定性指数
'health_index': 0.8 # 健康指数
}
# 动态过程
self.dynamic_processes = {
'succession': {
'active': True,
'stage': 'mature', # 'pioneer', 'intermediate', 'mature', 'climax'
'progress': 0.8
},
'disturbance': {
'frequency': 0.01, # 干扰频率
'intensity': 0.2, # 干扰强度
'recovery_time': 365.0 # 恢复时间(天)
}
}
# 统计信息
self.stats = {
'energy_flows': 0,
'nutrient_cycles': 0,
'feedback_events': 0,
'stability_changes': 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._update_energy_flow(dt)
# 更新物质循环
self._update_nutrient_cycles(dt)
# 更新系统状态
self._update_system_state(dt)
# 检查反馈机制
self._check_feedback_mechanisms(dt)
except Exception as e:
print(f"✗ 生态系统动力学更新失败: {e}")
import traceback
traceback.print_exc()
def _update_energy_flow(self, dt: float):
"""
更新能量流动
Args:
dt: 时间增量
"""
try:
# 模拟光合作用产生的初级生产力
photosynthesis = self.energy_flow_model['primary_production'] * dt / 86400
# 计算呼吸损失
respiration_loss = photosynthesis * self.energy_flow_model['respiration_loss']
# 计算净初级生产力
npp = photosynthesis - respiration_loss
# 更新系统总能量
energy_loss = self.system_state['total_energy'] * 0.001 * dt / 86400 # 基础能量流失
self.system_state['total_energy'] += npp - energy_loss
# 更新统计信息
self.stats['energy_flows'] += 1
except Exception as e:
print(f"✗ 能量流动更新失败: {e}")
def _update_nutrient_cycles(self, dt: float):
"""
更新物质循环
Args:
dt: 时间增量
"""
try:
# 更新碳循环
carbon_change = (
self.nutrient_cycle_model['carbon_cycle']['photosynthesis_rate'] -
self.nutrient_cycle_model['carbon_cycle']['respiration_rate'] -
self.nutrient_cycle_model['carbon_cycle']['decomposition_rate']
) * dt / 86400
# 更新氮循环
nitrogen_change = (
self.nutrient_cycle_model['nitrogen_cycle']['nitrogen_fixation'] +
self.nutrient_cycle_model['nitrogen_cycle']['nitrification'] -
self.nutrient_cycle_model['nitrogen_cycle']['denitrification'] -
self.nutrient_cycle_model['nitrogen_cycle']['plant_uptake']
) * dt / 86400
# 更新磷循环
phosphorus_change = (
self.nutrient_cycle_model['phosphorus_cycle']['weathering_rate'] +
self.nutrient_cycle_model['phosphorus_cycle']['mineralization'] -
self.nutrient_cycle_model['phosphorus_cycle']['plant_uptake'] -
self.nutrient_cycle_model['phosphorus_cycle']['leaching']
) * dt / 86400
# 更新可用营养物质
nutrient_change = carbon_change + nitrogen_change + phosphorus_change
self.system_state['available_nutrients'] = max(0, self.system_state['available_nutrients'] + nutrient_change)
# 更新统计信息
self.stats['nutrient_cycles'] += 1
except Exception as e:
print(f"✗ 物质循环更新失败: {e}")
def _update_system_state(self, dt: float):
"""
更新系统状态
Args:
dt: 时间增量
"""
try:
# 基于植被和动物数量更新生物多样性指数
if self.plugin.vegetation_manager and self.plugin.animal_simulator:
veg_count = self.plugin.vegetation_manager.get_stats()['total_vegetation']
animal_count = self.plugin.animal_simulator.get_stats()['total_animals']
diversity_score = min(1.0, (veg_count + animal_count) / 1000.0)
self.system_state['biodiversity_index'] = diversity_score
# 更新健康指数
health_factors = [
self.system_state['biodiversity_index'],
min(1.0, self.system_state['available_nutrients'] / 1000.0),
min(1.0, self.system_state['total_energy'] / 20000.0)
]
self.system_state['health_index'] = sum(health_factors) / len(health_factors)
except Exception as e:
print(f"✗ 系统状态更新失败: {e}")
def _check_feedback_mechanisms(self, dt: float):
"""
检查反馈机制
Args:
dt: 时间增量
"""
try:
# 检查是否触发正反馈或负反馈
feedback_probability = self.dynamic_parameters['stochastic_factor']
if random.random() < feedback_probability * dt / 3600: # 每小时检查
feedback_type = random.choice(['positive', 'negative'])
self._trigger_feedback(feedback_type)
except Exception as e:
print(f"✗ 反馈机制检查失败: {e}")
def _trigger_feedback(self, feedback_type: str):
"""
触发反馈机制
Args:
feedback_type: 反馈类型 ('positive''negative')
"""
try:
print(f"{feedback_type.capitalize()} feedback triggered in ecosystem")
# 根据反馈类型调整系统参数
if feedback_type == 'positive':
# 增强系统变化
self.system_state['total_energy'] *= 1.05
else:
# 抑制系统变化
self.system_state['total_energy'] *= 0.95
# 更新统计信息
self.stats['feedback_events'] += 1
except Exception as e:
print(f"✗ 反馈机制触发失败: {e}")
def get_energy_flow_model(self) -> Dict[str, float]:
"""
获取能量流动模型参数
Returns:
能量流动模型参数字典
"""
return self.energy_flow_model.copy()
def get_nutrient_cycle_model(self) -> Dict[str, Dict[str, float]]:
"""
获取物质循环模型参数
Returns:
物质循环模型参数字典
"""
return self.nutrient_cycle_model.copy()
def set_energy_flow_parameter(self, parameter: str, value: float):
"""
设置能量流动参数
Args:
parameter: 参数名称
value: 参数值
"""
try:
if parameter in self.energy_flow_model:
self.energy_flow_model[parameter] = value
print(f"✓ 能量流动参数已设置: {parameter} = {value}")
else:
print(f"✗ 无效的能量流动参数: {parameter}")
except Exception as e:
print(f"✗ 能量流动参数设置失败: {e}")
def set_nutrient_cycle_parameter(self, cycle: str, parameter: str, value: float):
"""
设置物质循环参数
Args:
cycle: 循环类型 ('carbon_cycle', 'nitrogen_cycle', 'phosphorus_cycle')
parameter: 参数名称
value: 参数值
"""
try:
if cycle in self.nutrient_cycle_model and parameter in self.nutrient_cycle_model[cycle]:
self.nutrient_cycle_model[cycle][parameter] = value
print(f"✓ 物质循环参数已设置: {cycle}.{parameter} = {value}")
else:
print(f"✗ 无效的物质循环参数: {cycle}.{parameter}")
except Exception as e:
print(f"✗ 物质循环参数设置失败: {e}")
def get_system_state(self) -> Dict[str, float]:
"""
获取系统状态
Returns:
系统状态字典
"""
return self.system_state.copy()
def get_stability_indicators(self) -> Dict[str, float]:
"""
获取稳定性指标
Returns:
稳定性指标字典
"""
return self.stability_indicators.copy()
def update_stability_indicator(self, indicator: str, value: float):
"""
更新稳定性指标
Args:
indicator: 指标名称
value: 指标值
"""
try:
if indicator in self.stability_indicators:
self.stability_indicators[indicator] = max(0.0, min(1.0, value))
self.stats['stability_changes'] += 1
print(f"✓ 稳定性指标已更新: {indicator} = {value}")
else:
print(f"✗ 无效的稳定性指标: {indicator}")
except Exception as e:
print(f"✗ 稳定性指标更新失败: {e}")
def get_ecosystem_services(self) -> Dict[str, Dict[str, float]]:
"""
获取生态系统服务
Returns:
生态系统服务字典
"""
return self.ecosystem_services.copy()
def calculate_ecosystem_service_value(self, service_category: str, service: str) -> float:
"""
计算生态系统服务价值
Args:
service_category: 服务类别
service: 服务名称
Returns:
服务价值
"""
try:
if service_category in self.ecosystem_services and service in self.ecosystem_services[service_category]:
base_value = self.ecosystem_services[service_category][service]
# 基于系统健康度调整价值
health_factor = self.system_state['health_index']
adjusted_value = base_value * health_factor
return adjusted_value
return 0.0
except Exception as e:
print(f"✗ 生态系统服务价值计算失败: {e}")
return 0.0
def get_dynamic_processes(self) -> Dict[str, Dict[str, Any]]:
"""
获取动态过程信息
Returns:
动态过程字典
"""
return self.dynamic_processes.copy()
def set_dynamic_parameter(self, parameter: str, value: float):
"""
设置动态参数
Args:
parameter: 参数名称
value: 参数值
"""
try:
if parameter in self.dynamic_parameters:
self.dynamic_parameters[parameter] = value
print(f"✓ 动态参数已设置: {parameter} = {value}")
else:
print(f"✗ 无效的动态参数: {parameter}")
except Exception as e:
print(f"✗ 动态参数设置失败: {e}")
def get_dynamic_parameters(self) -> Dict[str, float]:
"""
获取动态参数
Returns:
动态参数字典
"""
return self.dynamic_parameters.copy()
def trigger_disturbance(self, intensity: float = 0.5):
"""
触发干扰事件
Args:
intensity: 干扰强度 (0.0-1.0)
"""
try:
# 减少系统能量和营养物质
energy_loss = self.system_state['total_energy'] * intensity * 0.3
nutrient_loss = self.system_state['available_nutrients'] * intensity * 0.2
self.system_state['total_energy'] = max(0, self.system_state['total_energy'] - energy_loss)
self.system_state['available_nutrients'] = max(0, self.system_state['available_nutrients'] - nutrient_loss)
# 降低健康指数
self.system_state['health_index'] *= (1.0 - intensity * 0.3)
print(f"✓ 干扰事件已触发,强度: {intensity}")
except Exception as e:
print(f"✗ 干扰事件触发失败: {e}")
def get_feedback_mechanisms(self) -> Dict[str, Dict[str, Any]]:
"""
获取反馈机制信息
Returns:
反馈机制字典
"""
return self.feedback_mechanisms.copy()
def get_stats(self) -> Dict[str, int]:
"""
获取统计信息
Returns:
统计信息字典
"""
return self.stats.copy()
def reset_stats(self):
"""重置统计信息"""
self.stats = {
'energy_flows': 0,
'nutrient_cycles': 0,
'feedback_events': 0,
'stability_changes': 0
}
print("✓ 生态系统动力学统计信息已重置")
def calculate_carrying_capacity(self) -> float:
"""
计算环境承载能力
Returns:
承载能力值
"""
try:
# 基于可用营养物质和能量计算承载能力
energy_factor = self.system_state['total_energy'] / 10000.0
nutrient_factor = self.system_state['available_nutrients'] / 500.0
health_factor = self.system_state['health_index']
carrying_capacity = (energy_factor + nutrient_factor + health_factor) / 3.0
return max(0.0, min(1.0, carrying_capacity))
except Exception as e:
print(f"✗ 承载能力计算失败: {e}")
return 0.5