183 lines
6.0 KiB
Python
183 lines
6.0 KiB
Python
"""
|
|
高级群体智能示例
|
|
演示使用高级Boids算法和优化功能
|
|
"""
|
|
|
|
from panda3d.core import Vec3
|
|
import random
|
|
import time
|
|
|
|
def create_optimized_swarm(swarm_manager):
|
|
"""
|
|
创建优化的群体
|
|
使用空间分区和高级行为
|
|
"""
|
|
print("创建优化的群体...")
|
|
|
|
# 配置高级参数
|
|
swarm_manager.config.set("member_count", 200) # 增加群体规模
|
|
swarm_manager.config.set("cohesion_weight", 1.2)
|
|
swarm_manager.config.set("separation_weight", 1.8)
|
|
swarm_manager.config.set("alignment_weight", 1.0)
|
|
swarm_manager.config.set("perception_radius", 15.0)
|
|
swarm_manager.config.set("max_speed", 8.0)
|
|
|
|
# 启用物理效果
|
|
swarm_manager.config.set("gravity_enabled", True)
|
|
swarm_manager.config.set("air_resistance_enabled", True)
|
|
|
|
# 启用空间分区优化
|
|
swarm_manager.config.set("spatial_partitioning", True)
|
|
swarm_manager.config.set("neighbor_search_optimization", True)
|
|
|
|
# 重新创建群体
|
|
swarm_manager.reset()
|
|
|
|
print(f"优化群体创建完成,包含{len(swarm_manager.members)}个成员")
|
|
|
|
def create_complex_obstacles(swarm_manager, count=20):
|
|
"""
|
|
创建复杂障碍物环境
|
|
"""
|
|
print(f"创建{count}个复杂障碍物...")
|
|
|
|
for i in range(count):
|
|
# 随机位置
|
|
position = Vec3(
|
|
random.uniform(-40, 40),
|
|
random.uniform(-40, 40),
|
|
random.uniform(5, 25)
|
|
)
|
|
# 随机半径
|
|
radius = random.uniform(1, 8)
|
|
|
|
# 创建障碍物
|
|
swarm_manager.create_obstacle(position, radius)
|
|
|
|
print(f"复杂障碍物创建完成")
|
|
|
|
def create_hierarchical_flock(swarm_manager):
|
|
"""
|
|
创建分层群体结构
|
|
包含领导者和跟随者
|
|
"""
|
|
print("创建分层群体结构...")
|
|
|
|
# 标记前10%的成员为领导者
|
|
leader_count = max(1, len(swarm_manager.members) // 10)
|
|
|
|
for i, member in enumerate(swarm_manager.members):
|
|
if i < leader_count:
|
|
member['is_leader'] = True
|
|
# 设置领导者颜色
|
|
if 'node' in member:
|
|
member['node'].setColor(0, 1, 0, 1) # 绿色
|
|
else:
|
|
member['is_leader'] = False
|
|
# 设置跟随者颜色
|
|
if 'node' in member:
|
|
member['node'].setColor(1, 1, 1, 1) # 白色
|
|
|
|
# 调整领导者参数
|
|
swarm_manager.config.set("leader_cohesion_weight", 2.0)
|
|
swarm_manager.config.set("leader_separation_weight", 1.0)
|
|
|
|
print(f"分层群体结构创建完成,{leader_count}个领导者")
|
|
|
|
def create_dynamic_environment(swarm_manager):
|
|
"""
|
|
创建动态环境
|
|
包括移动障碍物和变化的目标
|
|
"""
|
|
print("创建动态环境...")
|
|
|
|
# 添加移动障碍物
|
|
moving_obstacle = {
|
|
'position': Vec3(0, 0, 15),
|
|
'radius': 5.0,
|
|
'velocity': Vec3(2, 1, 0),
|
|
'bounds': {'min_x': -30, 'max_x': 30, 'min_y': -30, 'max_y': 30}
|
|
}
|
|
|
|
swarm_manager.moving_obstacles = [moving_obstacle]
|
|
|
|
# 设置移动目标
|
|
swarm_manager.set_target(Vec3(20, 20, 15))
|
|
swarm_manager.config.set("seek_enabled", True)
|
|
|
|
print("动态环境创建完成")
|
|
|
|
def update_dynamic_environment(swarm_manager, dt):
|
|
"""
|
|
更新动态环境
|
|
移动障碍物和变化目标
|
|
"""
|
|
# 更新移动障碍物
|
|
if hasattr(swarm_manager, 'moving_obstacles'):
|
|
for obstacle in swarm_manager.moving_obstacles:
|
|
# 移动障碍物
|
|
obstacle['position'] += obstacle['velocity'] * dt
|
|
|
|
# 边界反弹
|
|
bounds = obstacle['bounds']
|
|
if obstacle['position'].x < bounds['min_x'] or obstacle['position'].x > bounds['max_x']:
|
|
obstacle['velocity'].x *= -1
|
|
if obstacle['position'].y < bounds['min_y'] or obstacle['position'].y > bounds['max_y']:
|
|
obstacle['velocity'].y *= -1
|
|
|
|
# 保持在边界内
|
|
obstacle['position'].x = max(bounds['min_x'], min(bounds['max_x'], obstacle['position'].x))
|
|
obstacle['position'].y = max(bounds['min_y'], min(bounds['max_y'], obstacle['position'].y))
|
|
|
|
# 定期改变目标位置
|
|
if not hasattr(swarm_manager, 'last_target_change'):
|
|
swarm_manager.last_target_change = time.time()
|
|
|
|
if time.time() - swarm_manager.last_target_change > 10.0: # 每10秒改变一次目标
|
|
new_target = Vec3(
|
|
random.uniform(-30, 30),
|
|
random.uniform(-30, 30),
|
|
random.uniform(10, 25)
|
|
)
|
|
swarm_manager.set_target(new_target)
|
|
swarm_manager.last_target_change = time.time()
|
|
|
|
def create_performance_test(swarm_manager):
|
|
"""
|
|
创建性能测试场景
|
|
"""
|
|
print("创建性能测试场景...")
|
|
|
|
# 创建大规模群体
|
|
swarm_manager.config.set("member_count", 500)
|
|
swarm_manager.reset()
|
|
|
|
# 添加大量障碍物
|
|
create_complex_obstacles(swarm_manager, 50)
|
|
|
|
# 启用所有优化
|
|
swarm_manager.config.set("spatial_partitioning", True)
|
|
swarm_manager.config.set("neighbor_search_optimization", True)
|
|
swarm_manager.config.set("gravity_enabled", True)
|
|
swarm_manager.config.set("air_resistance_enabled", True)
|
|
|
|
print("性能测试场景创建完成")
|
|
|
|
def run_advanced_example(swarm_manager):
|
|
"""
|
|
运行高级示例
|
|
"""
|
|
print("=== 高级群体智能示例 ===")
|
|
|
|
# 创建优化群体
|
|
create_optimized_swarm(swarm_manager)
|
|
|
|
# 创建复杂环境
|
|
create_complex_obstacles(swarm_manager, 10)
|
|
create_hierarchical_flock(swarm_manager)
|
|
create_dynamic_environment(swarm_manager)
|
|
|
|
print("高级示例设置完成")
|
|
print("观察群体的复杂行为和优化性能")
|
|
|
|
return update_dynamic_environment |