EG/plugins/user/swarm_intelligence/gui.py
2025-12-12 16:16:15 +08:00

1124 lines
45 KiB
Python

"""
群体智能插件GUI界面
"""
from PyQt5.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QSlider, QLabel,
QGroupBox, QCheckBox, QComboBox, QSpinBox, QDoubleSpinBox, QTabWidget,
QFormLayout, QTextEdit
)
from PyQt5.QtCore import Qt, QTimer
class SwarmGUI(QWidget):
"""
群体智能插件GUI界面
提供完整的控制面板用于调节群体行为参数
"""
def __init__(self, swarm_manager, config):
super().__init__()
self.swarm_manager = swarm_manager
self.config = config
self.init_ui()
# 启动定时器更新状态信息
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_status)
self.timer.start(1000) # 每秒更新一次
def init_ui(self):
"""
初始化UI界面
"""
self.setWindowTitle('群体智能控制面板')
self.setGeometry(100, 100, 400, 600)
# 创建标签页
tab_widget = QTabWidget()
# 基本控制标签页
basic_tab = self.create_basic_tab()
tab_widget.addTab(basic_tab, "基本控制")
# Boids参数标签页
boids_tab = self.create_boids_tab()
tab_widget.addTab(boids_tab, "Boids参数")
# 扩展行为标签页
behavior_tab = self.create_behavior_tab()
tab_widget.addTab(behavior_tab, "扩展行为")
# 队形控制标签页
formation_tab = self.create_formation_tab()
tab_widget.addTab(formation_tab, "队形控制")
# 学习控制标签页
learning_tab = self.create_learning_tab()
tab_widget.addTab(learning_tab, "学习控制")
# 环境感知标签页
environment_tab = self.create_environment_tab()
tab_widget.addTab(environment_tab, "环境感知")
# 状态信息标签页
status_tab = self.create_status_tab()
tab_widget.addTab(status_tab, "状态信息")
# 主布局
main_layout = QVBoxLayout()
main_layout.addWidget(tab_widget)
self.setLayout(main_layout)
def create_environment_tab(self):
"""
创建环境感知标签页
"""
widget = QWidget()
layout = QVBoxLayout()
# 环境感知开关
awareness_group = QGroupBox("环境感知控制")
awareness_layout = QVBoxLayout()
self.environment_awareness_checkbox = QCheckBox("启用环境感知")
self.environment_awareness_checkbox.setChecked(self.config.get("environment_awareness_enabled", True))
self.environment_awareness_checkbox.stateChanged.connect(self.toggle_environment_awareness)
awareness_layout.addWidget(self.environment_awareness_checkbox)
awareness_group.setLayout(awareness_layout)
layout.addWidget(awareness_group)
# 传感器参数
sensor_group = QGroupBox("传感器参数")
sensor_layout = QFormLayout()
# 传感器范围
self.sensor_range_spinbox = QDoubleSpinBox()
self.sensor_range_spinbox.setRange(1.0, 50.0)
self.sensor_range_spinbox.setSingleStep(1.0)
self.sensor_range_spinbox.setValue(self.config.get("sensor_range", 15.0))
self.sensor_range_spinbox.valueChanged.connect(self.update_sensor_range)
sensor_layout.addRow("传感器范围:", self.sensor_range_spinbox)
# 传感器精度
self.sensor_accuracy_spinbox = QDoubleSpinBox()
self.sensor_accuracy_spinbox.setRange(0.1, 1.0)
self.sensor_accuracy_spinbox.setSingleStep(0.05)
self.sensor_accuracy_spinbox.setValue(self.config.get("sensor_accuracy", 0.9))
self.sensor_accuracy_spinbox.valueChanged.connect(self.update_sensor_accuracy)
sensor_layout.addRow("传感器精度:", self.sensor_accuracy_spinbox)
sensor_group.setLayout(sensor_layout)
layout.addWidget(sensor_group)
# 环境响应参数
response_group = QGroupBox("环境响应参数")
response_layout = QFormLayout()
# 障碍物响应权重
self.obstacle_response_weight_spinbox = QDoubleSpinBox()
self.obstacle_response_weight_spinbox.setRange(0.0, 5.0)
self.obstacle_response_weight_spinbox.setSingleStep(0.1)
self.obstacle_response_weight_spinbox.setValue(self.config.get("obstacle_response_weight", 2.0))
self.obstacle_response_weight_spinbox.valueChanged.connect(self.update_obstacle_response_weight)
response_layout.addRow("障碍物响应权重:", self.obstacle_response_weight_spinbox)
# 捕食者响应权重
self.predator_response_weight_spinbox = QDoubleSpinBox()
self.predator_response_weight_spinbox.setRange(0.0, 5.0)
self.predator_response_weight_spinbox.setSingleStep(0.1)
self.predator_response_weight_spinbox.setValue(self.config.get("predator_response_weight", 3.0))
self.predator_response_weight_spinbox.valueChanged.connect(self.update_predator_response_weight)
response_layout.addRow("捕食者响应权重:", self.predator_response_weight_spinbox)
# 资源寻求权重
self.resource_seek_weight_spinbox = QDoubleSpinBox()
self.resource_seek_weight_spinbox.setRange(0.0, 2.0)
self.resource_seek_weight_spinbox.setSingleStep(0.05)
self.resource_seek_weight_spinbox.setValue(self.config.get("resource_seek_weight", 0.5))
self.resource_seek_weight_spinbox.valueChanged.connect(self.update_resource_seek_weight)
response_layout.addRow("资源寻求权重:", self.resource_seek_weight_spinbox)
# 危险回避权重
self.hazard_avoid_weight_spinbox = QDoubleSpinBox()
self.hazard_avoid_weight_spinbox.setRange(0.0, 5.0)
self.hazard_avoid_weight_spinbox.setSingleStep(0.1)
self.hazard_avoid_weight_spinbox.setValue(self.config.get("hazard_avoid_weight", 3.0))
self.hazard_avoid_weight_spinbox.valueChanged.connect(self.update_hazard_avoid_weight)
response_layout.addRow("危险回避权重:", self.hazard_avoid_weight_spinbox)
response_group.setLayout(response_layout)
layout.addWidget(response_group)
# 环境动态参数
dynamics_group = QGroupBox("环境动态")
dynamics_layout = QFormLayout()
# 时间流逝速度
self.time_flow_rate_spinbox = QDoubleSpinBox()
self.time_flow_rate_spinbox.setRange(0.01, 2.0)
self.time_flow_rate_spinbox.setSingleStep(0.05)
self.time_flow_rate_spinbox.setValue(self.config.get("time_flow_rate", 0.1))
self.time_flow_rate_spinbox.valueChanged.connect(self.update_time_flow_rate)
dynamics_layout.addRow("时间流逝速度:", self.time_flow_rate_spinbox)
dynamics_group.setLayout(dynamics_layout)
layout.addWidget(dynamics_group)
layout.addStretch()
widget.setLayout(layout)
return widget
def create_basic_tab(self):
"""
创建基本控制标签页
"""
widget = QWidget()
layout = QVBoxLayout()
# 控制按钮组
control_group = QGroupBox("基本控制")
control_layout = QVBoxLayout()
# 控制按钮
button_layout = QHBoxLayout()
self.pause_button = QPushButton("暂停/继续")
self.pause_button.clicked.connect(self.toggle_pause)
button_layout.addWidget(self.pause_button)
reset_button = QPushButton("重置群体")
reset_button.clicked.connect(self.reset_swarm)
button_layout.addWidget(reset_button)
control_layout.addLayout(button_layout)
# 群体数量控制
member_layout = QHBoxLayout()
member_layout.addWidget(QLabel("群体数量:"))
self.member_count_spinbox = QSpinBox()
self.member_count_spinbox.setRange(1, 1000)
self.member_count_spinbox.setValue(self.config.get("member_count", 20))
self.member_count_spinbox.valueChanged.connect(self.update_member_count)
member_layout.addWidget(self.member_count_spinbox)
control_layout.addLayout(member_layout)
control_group.setLayout(control_layout)
layout.addWidget(control_group)
# 群体类型选择
type_group = QGroupBox("群体类型")
type_layout = QVBoxLayout()
self.type_combo = QComboBox()
self.type_combo.addItems(["鸟类", "鱼类", "昆虫", "自定义"])
self.type_combo.setCurrentText(self.config.get("swarm_type", "鸟类"))
self.type_combo.currentTextChanged.connect(self.update_swarm_type)
type_layout.addWidget(self.type_combo)
type_group.setLayout(type_layout)
layout.addWidget(type_group)
# 目标控制
target_group = QGroupBox("目标控制")
target_layout = QVBoxLayout()
self.seek_target_checkbox = QCheckBox("启用目标寻求")
self.seek_target_checkbox.setChecked(self.config.get("seek_enabled", False))
self.seek_target_checkbox.stateChanged.connect(self.toggle_seek_target)
target_layout.addWidget(self.seek_target_checkbox)
target_group.setLayout(target_layout)
layout.addWidget(target_group)
layout.addStretch()
widget.setLayout(layout)
return widget
def create_boids_tab(self):
"""
创建Boids参数标签页
"""
widget = QWidget()
layout = QVBoxLayout()
# 基本Boids参数
boids_group = QGroupBox("基本Boids参数")
boids_layout = QFormLayout()
# 聚集权重
self.cohesion_spinbox = QDoubleSpinBox()
self.cohesion_spinbox.setRange(0.0, 10.0)
self.cohesion_spinbox.setSingleStep(0.1)
self.cohesion_spinbox.setValue(self.config.get("cohesion_weight", 1.0))
self.cohesion_spinbox.valueChanged.connect(self.update_cohesion_weight)
boids_layout.addRow("聚集权重:", self.cohesion_spinbox)
# 分离权重
self.separation_spinbox = QDoubleSpinBox()
self.separation_spinbox.setRange(0.0, 10.0)
self.separation_spinbox.setSingleStep(0.1)
self.separation_spinbox.setValue(self.config.get("separation_weight", 1.5))
self.separation_spinbox.valueChanged.connect(self.update_separation_weight)
boids_layout.addRow("分离权重:", self.separation_spinbox)
# 对齐权重
self.alignment_spinbox = QDoubleSpinBox()
self.alignment_spinbox.setRange(0.0, 10.0)
self.alignment_spinbox.setSingleStep(0.1)
self.alignment_spinbox.setValue(self.config.get("alignment_weight", 1.0))
self.alignment_spinbox.valueChanged.connect(self.update_alignment_weight)
boids_layout.addRow("对齐权重:", self.alignment_spinbox)
# 感知半径
self.perception_spinbox = QDoubleSpinBox()
self.perception_spinbox.setRange(0.1, 100.0)
self.perception_spinbox.setSingleStep(0.5)
self.perception_spinbox.setValue(self.config.get("perception_radius", 10.0))
self.perception_spinbox.valueChanged.connect(self.update_perception_radius)
boids_layout.addRow("感知半径:", self.perception_spinbox)
boids_group.setLayout(boids_layout)
layout.addWidget(boids_group)
# 移动参数
movement_group = QGroupBox("移动参数")
movement_layout = QFormLayout()
# 最大速度
self.max_speed_spinbox = QDoubleSpinBox()
self.max_speed_spinbox.setRange(0.1, 50.0)
self.max_speed_spinbox.setSingleStep(0.5)
self.max_speed_spinbox.setValue(self.config.get("max_speed", 5.0))
self.max_speed_spinbox.valueChanged.connect(self.update_max_speed)
movement_layout.addRow("最大速度:", self.max_speed_spinbox)
# 最大加速度
self.max_acceleration_spinbox = QDoubleSpinBox()
self.max_acceleration_spinbox.setRange(0.01, 10.0)
self.max_acceleration_spinbox.setSingleStep(0.05)
self.max_acceleration_spinbox.setValue(self.config.get("max_acceleration", 1.0))
self.max_acceleration_spinbox.valueChanged.connect(self.update_max_acceleration)
movement_layout.addRow("最大加速度:", self.max_acceleration_spinbox)
# 最大转向力
self.max_force_spinbox = QDoubleSpinBox()
self.max_force_spinbox.setRange(0.01, 5.0)
self.max_force_spinbox.setSingleStep(0.05)
self.max_force_spinbox.setValue(self.config.get("max_force", 0.5))
self.max_force_spinbox.valueChanged.connect(self.update_max_force)
movement_layout.addRow("最大转向力:", self.max_force_spinbox)
movement_group.setLayout(movement_layout)
layout.addWidget(movement_group)
# 边界参数
boundary_group = QGroupBox("边界参数")
boundary_layout = QFormLayout()
self.boundary_checkbox = QCheckBox("启用边界限制")
self.boundary_checkbox.setChecked(self.config.get("boundary_enabled", True))
self.boundary_checkbox.stateChanged.connect(self.toggle_boundary)
boundary_layout.addRow("", self.boundary_checkbox)
self.boundary_weight_spinbox = QDoubleSpinBox()
self.boundary_weight_spinbox.setRange(0.0, 10.0)
self.boundary_weight_spinbox.setSingleStep(0.1)
self.boundary_weight_spinbox.setValue(self.config.get("boundary_weight", 2.0))
self.boundary_weight_spinbox.valueChanged.connect(self.update_boundary_weight)
boundary_layout.addRow("边界权重:", self.boundary_weight_spinbox)
self.boundary_buffer_spinbox = QDoubleSpinBox()
self.boundary_buffer_spinbox.setRange(0.1, 50.0)
self.boundary_buffer_spinbox.setSingleStep(0.5)
self.boundary_buffer_spinbox.setValue(self.config.get("boundary_buffer", 5.0))
self.boundary_buffer_spinbox.valueChanged.connect(self.update_boundary_buffer)
boundary_layout.addRow("边界缓冲:", self.boundary_buffer_spinbox)
boundary_group.setLayout(boundary_layout)
layout.addWidget(boundary_group)
layout.addStretch()
widget.setLayout(layout)
return widget
def create_behavior_tab(self):
"""
创建扩展行为标签页
"""
widget = QWidget()
layout = QVBoxLayout()
# 避障行为
obstacle_group = QGroupBox("避障行为")
obstacle_layout = QFormLayout()
self.obstacle_checkbox = QCheckBox("启用避障")
self.obstacle_checkbox.setChecked(self.config.get("obstacle_avoidance_enabled", True))
self.obstacle_checkbox.stateChanged.connect(self.toggle_obstacle_avoidance)
obstacle_layout.addRow("", self.obstacle_checkbox)
self.obstacle_weight_spinbox = QDoubleSpinBox()
self.obstacle_weight_spinbox.setRange(0.0, 10.0)
self.obstacle_weight_spinbox.setSingleStep(0.1)
self.obstacle_weight_spinbox.setValue(self.config.get("obstacle_weight", 2.0))
self.obstacle_weight_spinbox.valueChanged.connect(self.update_obstacle_weight)
obstacle_layout.addRow("避障权重:", self.obstacle_weight_spinbox)
obstacle_group.setLayout(obstacle_layout)
layout.addWidget(obstacle_group)
# 游走行为
wander_group = QGroupBox("游走行为")
wander_layout = QFormLayout()
self.wander_checkbox = QCheckBox("启用游走")
self.wander_checkbox.setChecked(self.config.get("wander_enabled", False))
self.wander_checkbox.stateChanged.connect(self.toggle_wander)
wander_layout.addRow("", self.wander_checkbox)
self.wander_weight_spinbox = QDoubleSpinBox()
self.wander_weight_spinbox.setRange(0.0, 5.0)
self.wander_weight_spinbox.setSingleStep(0.05)
self.wander_weight_spinbox.setValue(self.config.get("wander_weight", 0.5))
self.wander_weight_spinbox.valueChanged.connect(self.update_wander_weight)
wander_layout.addRow("游走权重:", self.wander_weight_spinbox)
self.wander_radius_spinbox = QDoubleSpinBox()
self.wander_radius_spinbox.setRange(0.1, 50.0)
self.wander_radius_spinbox.setSingleStep(0.5)
self.wander_radius_spinbox.setValue(self.config.get("wander_radius", 5.0))
self.wander_radius_spinbox.valueChanged.connect(self.update_wander_radius)
wander_layout.addRow("游走半径:", self.wander_radius_spinbox)
self.wander_jitter_spinbox = QDoubleSpinBox()
self.wander_jitter_spinbox.setRange(0.0, 5.0)
self.wander_jitter_spinbox.setSingleStep(0.05)
self.wander_jitter_spinbox.setValue(self.config.get("wander_jitter", 1.0))
self.wander_jitter_spinbox.valueChanged.connect(self.update_wander_jitter)
wander_layout.addRow("游走抖动:", self.wander_jitter_spinbox)
wander_group.setLayout(wander_layout)
layout.addWidget(wander_group)
# 躲避捕食者行为
predator_group = QGroupBox("躲避捕食者")
predator_layout = QFormLayout()
self.predator_checkbox = QCheckBox("启用躲避捕食者")
self.predator_checkbox.setChecked(self.config.get("predator_avoid_enabled", False))
self.predator_checkbox.stateChanged.connect(self.toggle_predator_avoidance)
predator_layout.addRow("", self.predator_checkbox)
self.predator_weight_spinbox = QDoubleSpinBox()
self.predator_weight_spinbox.setRange(0.0, 10.0)
self.predator_weight_spinbox.setSingleStep(0.1)
self.predator_weight_spinbox.setValue(self.config.get("predator_avoid_weight", 3.0))
self.predator_weight_spinbox.valueChanged.connect(self.update_predator_weight)
predator_layout.addRow("躲避权重:", self.predator_weight_spinbox)
self.predator_radius_spinbox = QDoubleSpinBox()
self.predator_radius_spinbox.setRange(1.0, 100.0)
self.predator_radius_spinbox.setSingleStep(1.0)
self.predator_radius_spinbox.setValue(self.config.get("predator_radius", 15.0))
self.predator_radius_spinbox.valueChanged.connect(self.update_predator_radius)
predator_layout.addRow("感知半径:", self.predator_radius_spinbox)
predator_group.setLayout(predator_layout)
layout.addWidget(predator_group)
# 到达行为
arrival_group = QGroupBox("到达行为")
arrival_layout = QFormLayout()
self.arrival_checkbox = QCheckBox("启用到达行为")
self.arrival_checkbox.setChecked(self.config.get("arrival_enabled", False))
self.arrival_checkbox.stateChanged.connect(self.toggle_arrival)
arrival_layout.addRow("", self.arrival_checkbox)
self.arrival_slow_radius_spinbox = QDoubleSpinBox()
self.arrival_slow_radius_spinbox.setRange(0.1, 50.0)
self.arrival_slow_radius_spinbox.setSingleStep(0.5)
self.arrival_slow_radius_spinbox.setValue(self.config.get("arrival_slow_radius", 5.0))
self.arrival_slow_radius_spinbox.valueChanged.connect(self.update_arrival_slow_radius)
arrival_layout.addRow("减速半径:", self.arrival_slow_radius_spinbox)
arrival_group.setLayout(arrival_layout)
layout.addWidget(arrival_group)
layout.addStretch()
widget.setLayout(layout)
return widget
def create_formation_tab(self):
"""
创建队形控制标签页
"""
widget = QWidget()
layout = QVBoxLayout()
# 队形控制
formation_group = QGroupBox("队形控制")
formation_layout = QFormLayout()
self.formation_checkbox = QCheckBox("启用队形保持")
self.formation_checkbox.setChecked(self.config.get("formation_enabled", False))
self.formation_checkbox.stateChanged.connect(self.toggle_formation)
formation_layout.addRow("", self.formation_checkbox)
self.formation_combo = QComboBox()
self.formation_combo.addItems(["", "V字形", "直线", "圆形", "楔形", "球形"])
self.formation_combo.setCurrentText(self.config.get("formation_type", ""))
self.formation_combo.currentTextChanged.connect(self.update_formation_type)
formation_layout.addRow("队形类型:", self.formation_combo)
self.formation_weight_spinbox = QDoubleSpinBox()
self.formation_weight_spinbox.setRange(0.0, 10.0)
self.formation_weight_spinbox.setSingleStep(0.1)
self.formation_weight_spinbox.setValue(self.config.get("formation_weight", 1.0))
self.formation_weight_spinbox.valueChanged.connect(self.update_formation_weight)
formation_layout.addRow("队形权重:", self.formation_weight_spinbox)
formation_group.setLayout(formation_layout)
layout.addWidget(formation_group)
# 高级队形参数
advanced_formation_group = QGroupBox("高级队形参数")
advanced_formation_layout = QFormLayout()
self.personal_space_spinbox = QDoubleSpinBox()
self.personal_space_spinbox.setRange(0.1, 20.0)
self.personal_space_spinbox.setSingleStep(0.1)
self.personal_space_spinbox.setValue(self.config.get("personal_space", 2.0))
self.personal_space_spinbox.valueChanged.connect(self.update_personal_space)
advanced_formation_layout.addRow("个人空间:", self.personal_space_spinbox)
advanced_formation_group.setLayout(advanced_formation_layout)
layout.addWidget(advanced_formation_group)
# 路径跟随
path_group = QGroupBox("路径跟随")
path_layout = QFormLayout()
self.path_checkbox = QCheckBox("启用路径跟随")
self.path_checkbox.setChecked(self.config.get("path_following_enabled", False))
self.path_checkbox.stateChanged.connect(self.toggle_path_following)
path_layout.addRow("", self.path_checkbox)
self.path_weight_spinbox = QDoubleSpinBox()
self.path_weight_spinbox.setRange(0.0, 10.0)
self.path_weight_spinbox.setSingleStep(0.1)
self.path_weight_spinbox.setValue(self.config.get("path_weight", 1.0))
self.path_weight_spinbox.valueChanged.connect(self.update_path_weight)
path_layout.addRow("路径权重:", self.path_weight_spinbox)
self.path_radius_spinbox = QDoubleSpinBox()
self.path_radius_spinbox.setRange(0.1, 50.0)
self.path_radius_spinbox.setSingleStep(0.5)
self.path_radius_spinbox.setValue(self.config.get("path_radius", 3.0))
self.path_radius_spinbox.valueChanged.connect(self.update_path_radius)
path_layout.addRow("路径半径:", self.path_radius_spinbox)
path_group.setLayout(path_layout)
layout.addWidget(path_group)
# 预测参数
prediction_group = QGroupBox("预测参数")
prediction_layout = QFormLayout()
self.prediction_distance_spinbox = QDoubleSpinBox()
self.prediction_distance_spinbox.setRange(0.1, 100.0)
self.prediction_distance_spinbox.setSingleStep(1.0)
self.prediction_distance_spinbox.setValue(self.config.get("prediction_distance", 10.0))
self.prediction_distance_spinbox.valueChanged.connect(self.update_prediction_distance)
prediction_layout.addRow("预测距离:", self.prediction_distance_spinbox)
prediction_group.setLayout(prediction_layout)
layout.addWidget(prediction_group)
# 物理参数
physics_group = QGroupBox("物理参数")
physics_layout = QFormLayout()
self.gravity_checkbox = QCheckBox("启用重力")
self.gravity_checkbox.setChecked(self.config.get("gravity_enabled", True))
self.gravity_checkbox.stateChanged.connect(self.toggle_gravity)
physics_layout.addRow("", self.gravity_checkbox)
self.air_resistance_checkbox = QCheckBox("启用空气阻力")
self.air_resistance_checkbox.setChecked(self.config.get("air_resistance_enabled", True))
self.air_resistance_checkbox.stateChanged.connect(self.toggle_air_resistance)
physics_layout.addRow("", self.air_resistance_checkbox)
self.buoyancy_checkbox = QCheckBox("启用浮力")
self.buoyancy_checkbox.setChecked(self.config.get("buoyancy_enabled", False))
self.buoyancy_checkbox.stateChanged.connect(self.toggle_buoyancy)
physics_layout.addRow("", self.buoyancy_checkbox)
self.fluid_level_spinbox = QDoubleSpinBox()
self.fluid_level_spinbox.setRange(-100.0, 100.0)
self.fluid_level_spinbox.setSingleStep(1.0)
self.fluid_level_spinbox.setValue(self.config.get("fluid_level", 0.0))
self.fluid_level_spinbox.valueChanged.connect(self.update_fluid_level)
physics_layout.addRow("流体水平面:", self.fluid_level_spinbox)
physics_group.setLayout(physics_layout)
layout.addWidget(physics_group)
# 性能优化参数
optimization_group = QGroupBox("性能优化")
optimization_layout = QFormLayout()
self.spatial_partitioning_checkbox = QCheckBox("启用空间分区")
self.spatial_partitioning_checkbox.setChecked(self.config.get("spatial_partitioning", True))
self.spatial_partitioning_checkbox.stateChanged.connect(self.toggle_spatial_partitioning)
optimization_layout.addRow("", self.spatial_partitioning_checkbox)
self.neighbor_optimization_checkbox = QCheckBox("启用邻居优化")
self.neighbor_optimization_checkbox.setChecked(self.config.get("neighbor_search_optimization", True))
self.neighbor_optimization_checkbox.stateChanged.connect(self.toggle_neighbor_optimization)
optimization_layout.addRow("", self.neighbor_optimization_checkbox)
self.parallel_computation_checkbox = QCheckBox("启用并行计算")
self.parallel_computation_checkbox.setChecked(self.config.get("parallel_computation", True))
self.parallel_computation_checkbox.stateChanged.connect(self.toggle_parallel_computation)
optimization_layout.addRow("", self.parallel_computation_checkbox)
optimization_group.setLayout(optimization_layout)
layout.addWidget(optimization_group)
layout.addStretch()
widget.setLayout(layout)
return widget
def create_status_tab(self):
"""
创建状态信息标签页
"""
widget = QWidget()
layout = QVBoxLayout()
# 群体状态
status_group = QGroupBox("群体状态")
status_layout = QFormLayout()
self.member_count_label = QLabel("0")
status_layout.addRow("成员数量:", self.member_count_label)
self.paused_label = QLabel("")
status_layout.addRow("是否暂停:", self.paused_label)
self.fps_label = QLabel("0")
status_layout.addRow("帧率:", self.fps_label)
status_group.setLayout(status_layout)
layout.addWidget(status_group)
# 性能信息
performance_group = QGroupBox("性能信息")
performance_layout = QVBoxLayout()
self.performance_text = QTextEdit()
self.performance_text.setReadOnly(True)
self.performance_text.setMaximumHeight(200)
performance_layout.addWidget(self.performance_text)
performance_group.setLayout(performance_layout)
layout.addWidget(performance_group)
# 日志信息
log_group = QGroupBox("日志信息")
log_layout = QVBoxLayout()
self.log_text = QTextEdit()
self.log_text.setReadOnly(True)
log_layout.addWidget(self.log_text)
log_group.setLayout(log_layout)
layout.addWidget(log_group)
layout.addStretch()
widget.setLayout(layout)
return widget
def toggle_pause(self):
"""
切换暂停状态
"""
if self.swarm_manager:
self.swarm_manager.toggle_pause()
def reset_swarm(self):
"""
重置群体
"""
if self.swarm_manager:
self.swarm_manager.cleanup()
self.swarm_manager.create_example_swarm()
self.update_status()
def update_member_count(self, value):
"""
更新群体数量
"""
self.config.set("member_count", value)
# 如果当前群体数量与设置不符,重新创建群体
if self.swarm_manager and len(self.swarm_manager.members) != value:
self.swarm_manager.cleanup()
self.swarm_manager.create_example_swarm()
def update_swarm_type(self, value):
"""
更新群体类型
"""
self.config.set("swarm_type", value)
if self.swarm_manager:
self.swarm_manager.swarm_type = value
def toggle_seek_target(self, state):
"""
切换目标寻求
"""
enabled = state == Qt.Checked
self.config.set("seek_enabled", enabled)
def update_cohesion_weight(self, value):
"""
更新聚集权重
"""
self.config.set("cohesion_weight", value)
if self.swarm_manager:
self.swarm_manager.cohesion_weight = value
def update_separation_weight(self, value):
"""
更新分离权重
"""
self.config.set("separation_weight", value)
if self.swarm_manager:
self.swarm_manager.separation_weight = value
def update_alignment_weight(self, value):
"""
更新对齐权重
"""
self.config.set("alignment_weight", value)
if self.swarm_manager:
self.swarm_manager.alignment_weight = value
def update_perception_radius(self, value):
"""
更新感知半径
"""
self.config.set("perception_radius", value)
if self.swarm_manager:
self.swarm_manager.perception_radius = value
def update_max_speed(self, value):
"""
更新最大速度
"""
self.config.set("max_speed", value)
if self.swarm_manager:
self.swarm_manager.max_speed = value
def update_max_acceleration(self, value):
"""
更新最大加速度
"""
self.config.set("max_acceleration", value)
def update_max_force(self, value):
"""
更新最大转向力
"""
self.config.set("max_force", value)
def toggle_boundary(self, state):
"""
切换边界限制
"""
enabled = state == Qt.Checked
self.config.set("boundary_enabled", enabled)
def update_boundary_weight(self, value):
"""
更新边界权重
"""
self.config.set("boundary_weight", value)
def update_boundary_buffer(self, value):
"""
更新边界缓冲
"""
self.config.set("boundary_buffer", value)
def toggle_obstacle_avoidance(self, state):
"""
切换避障行为
"""
enabled = state == Qt.Checked
self.config.set("obstacle_avoidance_enabled", enabled)
def update_obstacle_weight(self, value):
"""
更新避障权重
"""
self.config.set("obstacle_weight", value)
def toggle_wander(self, state):
"""
切换游走行为
"""
enabled = state == Qt.Checked
self.config.set("wander_enabled", enabled)
def update_wander_weight(self, value):
"""
更新游走权重
"""
self.config.set("wander_weight", value)
def update_wander_radius(self, value):
"""
更新游走半径
"""
self.config.set("wander_radius", value)
def update_wander_jitter(self, value):
"""
更新游走抖动
"""
self.config.set("wander_jitter", value)
def toggle_predator_avoidance(self, state):
"""
切换躲避捕食者行为
"""
enabled = state == Qt.Checked
self.config.set("predator_avoid_enabled", enabled)
def update_predator_weight(self, value):
"""
更新躲避捕食者权重
"""
self.config.set("predator_avoid_weight", value)
def update_predator_radius(self, value):
"""
更新捕食者感知半径
"""
self.config.set("predator_radius", value)
def toggle_arrival(self, state):
"""
切换到达行为
"""
enabled = state == Qt.Checked
self.config.set("arrival_enabled", enabled)
def update_arrival_slow_radius(self, value):
"""
更新到达减速半径
"""
self.config.set("arrival_slow_radius", value)
def toggle_formation(self, state):
"""
切换队形保持
"""
enabled = state == Qt.Checked
self.config.set("formation_enabled", enabled)
def update_formation_type(self, value):
"""
更新队形类型
"""
self.config.set("formation_type", value)
def update_formation_weight(self, value):
"""
更新队形权重
"""
self.config.set("formation_weight", value)
def toggle_path_following(self, state):
"""
切换路径跟随
"""
enabled = state == Qt.Checked
self.config.set("path_following_enabled", enabled)
def update_path_weight(self, value):
"""
更新路径权重
"""
self.config.set("path_weight", value)
def update_path_radius(self, value):
"""
更新路径半径
"""
self.config.set("path_radius", value)
def update_prediction_distance(self, value):
"""
更新预测距离
"""
self.config.set("prediction_distance", value)
def update_personal_space(self, value):
"""
更新个人空间
"""
self.config.set("personal_space", value)
def toggle_gravity(self, state):
"""
切换重力
"""
enabled = state == Qt.Checked
self.config.set("gravity_enabled", enabled)
def toggle_air_resistance(self, state):
"""
切换空气阻力
"""
enabled = state == Qt.Checked
self.config.set("air_resistance_enabled", enabled)
def toggle_buoyancy(self, state):
"""
切换浮力
"""
enabled = state == Qt.Checked
self.config.set("buoyancy_enabled", enabled)
def update_fluid_level(self, value):
"""
更新流体水平面
"""
self.config.set("fluid_level", value)
def toggle_spatial_partitioning(self, state):
"""
切换空间分区
"""
enabled = state == Qt.Checked
self.config.set("spatial_partitioning", enabled)
def toggle_neighbor_optimization(self, state):
"""
切换邻居优化
"""
enabled = state == Qt.Checked
self.config.set("neighbor_search_optimization", enabled)
def toggle_parallel_computation(self, state):
"""
切换并行计算
"""
enabled = state == Qt.Checked
self.config.set("parallel_computation", enabled)
def toggle_interaction(self, state):
"""
切换群体间交互
"""
enabled = state == Qt.Checked
self.config.set("interaction_enabled", enabled)
def toggle_learning(self, state):
"""
切换学习能力
"""
enabled = state == Qt.Checked
self.config.set("learning_enabled", enabled)
def toggle_environment_awareness(self, state):
"""
切换环境感知
"""
enabled = state == Qt.Checked
self.config.set("environment_awareness_enabled", enabled)
def update_sensor_range(self, value):
"""
更新传感器范围
"""
self.config.set("sensor_range", value)
def update_sensor_accuracy(self, value):
"""
更新传感器精度
"""
self.config.set("sensor_accuracy", value)
def update_obstacle_response_weight(self, value):
"""
更新障碍物响应权重
"""
self.config.set("obstacle_response_weight", value)
def update_predator_response_weight(self, value):
"""
更新捕食者响应权重
"""
self.config.set("predator_response_weight", value)
def update_resource_seek_weight(self, value):
"""
更新资源寻求权重
"""
self.config.set("resource_seek_weight", value)
def update_hazard_avoid_weight(self, value):
"""
更新危险回避权重
"""
self.config.set("hazard_avoid_weight", value)
def update_time_flow_rate(self, value):
"""
更新时间流逝速度
"""
self.config.set("time_flow_rate", value)
def update_learning_rate(self, value):
"""
更新学习率
"""
self.config.set("learning_rate", value)
if hasattr(self.swarm_manager, 'learning_manager'):
self.swarm_manager.learning_manager.learning_rate = value
def update_exploration_rate(self, value):
"""
更新探索率
"""
self.config.set("exploration_rate", value)
if hasattr(self.swarm_manager, 'learning_manager'):
self.swarm_manager.learning_manager.exploration_rate = value
def update_memory_capacity(self, value):
"""
更新记忆容量
"""
self.config.set("memory_capacity", value)
if hasattr(self.swarm_manager, 'learning_manager'):
self.swarm_manager.learning_manager.memory_capacity = value
def clear_learning_memory(self):
"""
清空学习记忆
"""
if hasattr(self.swarm_manager, 'learning_manager'):
self.swarm_manager.learning_manager.clear_memory()
def create_learning_tab(self):
"""
创建学习控制标签页
"""
widget = QWidget()
layout = QVBoxLayout()
# 学习开关
learning_group = QGroupBox("学习控制")
learning_layout = QVBoxLayout()
self.learning_checkbox = QCheckBox("启用学习能力")
self.learning_checkbox.setChecked(self.config.get("learning_enabled", False))
self.learning_checkbox.stateChanged.connect(self.toggle_learning)
learning_layout.addWidget(self.learning_checkbox)
clear_memory_button = QPushButton("清空学习记忆")
clear_memory_button.clicked.connect(self.clear_learning_memory)
learning_layout.addWidget(clear_memory_button)
learning_group.setLayout(learning_layout)
layout.addWidget(learning_group)
# 学习参数
params_group = QGroupBox("学习参数")
params_layout = QFormLayout()
# 学习率
self.learning_rate_spinbox = QDoubleSpinBox()
self.learning_rate_spinbox.setRange(0.01, 1.0)
self.learning_rate_spinbox.setSingleStep(0.01)
self.learning_rate_spinbox.setValue(self.config.get("learning_rate", 0.1))
self.learning_rate_spinbox.valueChanged.connect(self.update_learning_rate)
params_layout.addRow("学习率:", self.learning_rate_spinbox)
# 探索率
self.exploration_rate_spinbox = QDoubleSpinBox()
self.exploration_rate_spinbox.setRange(0.0, 1.0)
self.exploration_rate_spinbox.setSingleStep(0.05)
self.exploration_rate_spinbox.setValue(self.config.get("exploration_rate", 0.3))
self.exploration_rate_spinbox.valueChanged.connect(self.update_exploration_rate)
params_layout.addRow("探索率:", self.exploration_rate_spinbox)
# 记忆容量
self.memory_capacity_spinbox = QSpinBox()
self.memory_capacity_spinbox.setRange(100, 10000)
self.memory_capacity_spinbox.setSingleStep(100)
self.memory_capacity_spinbox.setValue(self.config.get("memory_capacity", 1000))
self.memory_capacity_spinbox.valueChanged.connect(self.update_memory_capacity)
params_layout.addRow("记忆容量:", self.memory_capacity_spinbox)
params_group.setLayout(params_layout)
layout.addWidget(params_group)
# 学习统计信息
stats_group = QGroupBox("学习统计")
stats_layout = QFormLayout()
self.experience_count_label = QLabel("0")
stats_layout.addRow("经验数量:", self.experience_count_label)
self.policy_count_label = QLabel("0")
stats_layout.addRow("策略数量:", self.policy_count_label)
self.exploration_rate_label = QLabel("0.0")
stats_layout.addRow("当前探索率:", self.exploration_rate_label)
stats_group.setLayout(stats_layout)
layout.addWidget(stats_group)
layout.addStretch()
widget.setLayout(layout)
return widget
def update_status(self):
"""
更新状态信息
"""
if self.swarm_manager:
count = len(self.swarm_manager.members)
self.member_count_label.setText(str(count))
self.paused_label.setText("" if self.swarm_manager.paused else "")
# 更新性能信息
performance_info = f"成员数量: {count}\n"
performance_info += f"是否暂停: {'' if self.swarm_manager.paused else ''}\n"
performance_info += f"感知半径: {self.config.get('perception_radius', 10.0)}\n"
performance_info += f"最大速度: {self.config.get('max_speed', 5.0)}\n"
performance_info += f"成员数量: {self.config.get('member_count', 20)}\n"
performance_info += f"并行计算: {'' if self.config.get('parallel_computation', True) else ''}\n"
# 添加学习统计信息
if hasattr(self.swarm_manager, 'learning_manager') and self.config.get("learning_enabled", False):
learning_stats = self.swarm_manager.learning_manager.get_learning_stats()
performance_info += f"经验数量: {learning_stats['experience_count']}\n"
performance_info += f"策略数量: {learning_stats['policy_count']}\n"
performance_info += f"探索率: {learning_stats['exploration_rate']:.2f}\n"
performance_info += f"学习率: {learning_stats['learning_rate']:.2f}\n"
# 更新学习统计标签
if hasattr(self, 'experience_count_label'):
self.experience_count_label.setText(str(learning_stats['experience_count']))
if hasattr(self, 'policy_count_label'):
self.policy_count_label.setText(str(learning_stats['policy_count']))
if hasattr(self, 'exploration_rate_label'):
self.exploration_rate_label.setText(f"{learning_stats['exploration_rate']:.2f}")
self.performance_text.setPlainText(performance_info)