""" 群体智能插件配置 提供完整的配置管理功能,支持多种数据类型和持久化存储 """ import json import os from pathlib import Path class Config: """ 配置管理类 支持配置的加载、保存、验证和管理 """ def __init__(self, config_file=None): # 配置文件路径 self.config_file = config_file or self._get_default_config_path() # 默认配置 self.default_settings = { # 基本Boids参数 "cohesion_weight": 1.0, "separation_weight": 1.5, "alignment_weight": 1.0, "perception_radius": 10.0, # 移动参数 "max_speed": 5.0, "max_acceleration": 1.0, "max_force": 0.5, # 群体参数 "member_count": 20, "swarm_type": "鸟类", # 行为开关 "seek_enabled": False, "obstacle_avoidance_enabled": True, "wander_enabled": False, "boundary_enabled": True, "predator_avoid_enabled": False, "arrival_enabled": False, "formation_enabled": False, "path_following_enabled": False, "interaction_enabled": True, # 群体间交互开关 "learning_enabled": False, # 学习能力开关 "environment_awareness_enabled": True, # 环境感知开关 # 高级行为参数 "personal_space": 2.0, # 个人空间半径 "obstacle_radius": 5.0, # 障碍物影响半径 "seek_weight": 1.0, # 寻求力权重 "flee_weight": 1.0, # 逃离力权重 "wander_weight": 0.5, # 游走力权重 "wander_radius": 5.0, # 游走半径 "wander_distance": 10.0, # 游走距离 "wander_jitter": 1.0, # 游走抖动 "boundary_weight": 2.0, # 边界力权重 "boundary_buffer": 5.0, # 边界缓冲区 "path_radius": 3.0, # 路径影响半径 "path_weight": 1.0, # 路径跟随权重 "prediction_distance": 10.0, # 预测距离 "formation_weight": 1.0, # 队形保持权重 "predator_avoid_weight": 3.0, # 捕食者躲避权重 "predator_radius": 15.0, # 捕食者影响半径 "arrival_slow_radius": 5.0, # 到达减速半径 "interaction_weight": 1.0, # 群体间交互权重 # 学习参数 "learning_rate": 0.1, # 学习率 "exploration_rate": 0.3, # 探索率 "memory_capacity": 1000, # 记忆容量 # 环境感知参数 "sensor_range": 15.0, # 传感器范围 "sensor_accuracy": 0.9, # 传感器精度 "obstacle_response_weight": 2.0, # 障碍物响应权重 "predator_response_weight": 3.0, # 捕食者响应权重 "resource_seek_weight": 0.5, # 资源寻求权重 "hazard_avoid_weight": 3.0, # 危险回避权重 "time_flow_rate": 0.1, # 时间流逝速度 # 物理参数 "gravity_enabled": True, # 重力开关 "air_resistance_enabled": True, # 空气阻力开关 "buoyancy_enabled": False, # 浮力开关 "fluid_level": 0.0, # 流体水平面高度 # 性能参数 "update_rate": 60, # FPS "spatial_partitioning": True, # 空间分区优化 "neighbor_search_optimization": True, # 邻居搜索优化 "parallel_computation": True, # 并行计算 } # 当前配置 self.settings = self.default_settings.copy() # 配置验证规则 self.validation_rules = { # 基本Boids参数 "cohesion_weight": (float, 0.0, 10.0), "separation_weight": (float, 0.0, 10.0), "alignment_weight": (float, 0.0, 10.0), "perception_radius": (float, 0.1, 100.0), # 移动参数 "max_speed": (float, 0.1, 50.0), "max_acceleration": (float, 0.01, 10.0), "max_force": (float, 0.01, 5.0), # 群体参数 "member_count": (int, 1, 1000), "swarm_type": (str, ["鸟类", "鱼类", "昆虫", "自定义"]), # 行为开关 "seek_enabled": (bool, None, None), "obstacle_avoidance_enabled": (bool, None, None), "wander_enabled": (bool, None, None), "boundary_enabled": (bool, None, None), "predator_avoid_enabled": (bool, None, None), "arrival_enabled": (bool, None, None), "formation_enabled": (bool, None, None), "path_following_enabled": (bool, None, None), "interaction_enabled": (bool, None, None), "learning_enabled": (bool, None, None), "environment_awareness_enabled": (bool, None, None), # 高级行为参数 "personal_space": (float, 0.1, 20.0), "obstacle_radius": (float, 0.1, 50.0), "seek_weight": (float, 0.0, 10.0), "flee_weight": (float, 0.0, 10.0), "wander_weight": (float, 0.0, 5.0), "wander_radius": (float, 0.1, 50.0), "wander_distance": (float, 0.1, 100.0), "wander_jitter": (float, 0.0, 5.0), "boundary_weight": (float, 0.0, 10.0), "boundary_buffer": (float, 0.1, 50.0), "path_radius": (float, 0.1, 50.0), "path_weight": (float, 0.0, 10.0), "prediction_distance": (float, 0.1, 100.0), "formation_weight": (float, 0.0, 10.0), "predator_avoid_weight": (float, 0.0, 10.0), "predator_radius": (float, 1.0, 100.0), "arrival_slow_radius": (float, 0.1, 50.0), "interaction_weight": (float, 0.0, 5.0), # 学习参数 "learning_rate": (float, 0.01, 1.0), "exploration_rate": (float, 0.0, 1.0), "memory_capacity": (int, 100, 10000), # 环境感知参数 "sensor_range": (float, 1.0, 50.0), "sensor_accuracy": (float, 0.1, 1.0), "obstacle_response_weight": (float, 0.0, 5.0), "predator_response_weight": (float, 0.0, 5.0), "resource_seek_weight": (float, 0.0, 2.0), "hazard_avoid_weight": (float, 0.0, 5.0), "time_flow_rate": (float, 0.01, 2.0), # 物理参数 "gravity_enabled": (bool, None, None), "air_resistance_enabled": (bool, None, None), "buoyancy_enabled": (bool, None, None), "fluid_level": (float, -100.0, 100.0), # 性能参数 "update_rate": (int, 1, 240), "spatial_partitioning": (bool, None, None), "parallel_computation": (bool, None, None), # 队形类型 "formation_type": (str, ["无", "V字形", "直线", "圆形", "楔形", "球形"]), } # 加载配置 self.load() def _get_default_config_path(self): """ 获取默认配置文件路径 """ # 获取插件目录 plugin_dir = Path(__file__).parent return plugin_dir / "config.json" def get(self, key, default=None): """ 获取配置值 """ return self.settings.get(key, default) def set(self, key, value): """ 设置配置值 """ # 验证配置值 if self._validate_setting(key, value): self.settings[key] = value return True else: print(f"配置值验证失败: {key} = {value}") return False def _validate_setting(self, key, value): """ 验证配置值是否有效 """ if key not in self.validation_rules: return True # 没有验证规则的配置项直接通过 rule = self.validation_rules[key] value_type, min_val, max_val = rule # 类型检查 if not isinstance(value, value_type): return False # 范围检查 if value_type in (int, float) and min_val is not None and max_val is not None: if value < min_val or value > max_val: return False # 枚举检查 if value_type == str and isinstance(min_val, list): if value not in min_val: return False return True def reset_to_default(self): """ 重置为默认配置 """ self.settings = self.default_settings.copy() self.save() def load_from_dict(self, config_dict): """ 从字典加载配置 """ for key, value in config_dict.items(): self.set(key, value) def to_dict(self): """ 导出配置为字典 """ return self.settings.copy() def load(self): """ 从文件加载配置 """ try: if os.path.exists(self.config_file): with open(self.config_file, 'r', encoding='utf-8') as f: config_data = json.load(f) self.load_from_dict(config_data) print(f"配置已从 {self.config_file} 加载") else: print("配置文件不存在,使用默认配置") except Exception as e: print(f"加载配置文件时出错: {e}") print("使用默认配置") def save(self): """ 保存配置到文件 """ try: # 确保目录存在 os.makedirs(os.path.dirname(self.config_file), exist_ok=True) # 保存配置 with open(self.config_file, 'w', encoding='utf-8') as f: json.dump(self.settings, f, ensure_ascii=False, indent=4) print(f"配置已保存到 {self.config_file}") return True except Exception as e: print(f"保存配置文件时出错: {e}") return False def get_all_settings(self): """ 获取所有配置项 """ return self.settings.copy() def update_setting(self, key, value): """ 更新单个配置项并保存 """ if self.set(key, value): return self.save() return False def export_config(self, file_path): """ 导出配置到指定文件 """ try: with open(file_path, 'w', encoding='utf-8') as f: json.dump(self.settings, f, ensure_ascii=False, indent=4) print(f"配置已导出到 {file_path}") return True except Exception as e: print(f"导出配置时出错: {e}") return False def import_config(self, file_path): """ 从指定文件导入配置 """ try: with open(file_path, 'r', encoding='utf-8') as f: config_data = json.load(f) self.load_from_dict(config_data) self.save() print(f"配置已从 {file_path} 导入") return True except Exception as e: print(f"导入配置时出错: {e}") return False def get_setting_info(self, key): """ 获取配置项信息 """ if key in self.validation_rules: rule = self.validation_rules[key] return { "type": rule[0].__name__, "min": rule[1], "max": rule[2], "default": self.default_settings.get(key) } return None def validate_all_settings(self): """ 验证所有配置项 """ invalid_settings = [] for key, value in self.settings.items(): if not self._validate_setting(key, value): invalid_settings.append(key) return invalid_settings