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

286 lines
9.0 KiB
Python

"""
群体间交互完整示例
演示如何使用群体间交互功能创建复杂的生态系统
"""
from panda3d.core import Vec3
import random
def create_ecosystem_demo(swarm_manager):
"""
创建生态系统演示
包含多个群体和复杂的交互关系
"""
print("创建生态系统演示...")
# 清理现有群体
swarm_manager.cleanup()
swarm_manager.swarms.clear()
swarm_manager.swarm_id_counter = 0
# 创建生产者群体(植物)
print("创建生产者群体...")
producer_swarm = swarm_manager.create_example_swarm(
swarm_type="昆虫",
member_count=150,
position_offset=Vec3(0, 0, 2)
)
# 设置生产者群体为绿色
for member in producer_swarm['members']:
if 'node' in member:
member['node'].setColor(0, 1, 0, 1) # 绿色
# 创建初级消费者群体(食草动物)
print("创建初级消费者群体...")
primary_consumer_swarm = swarm_manager.create_example_swarm(
swarm_type="鱼类",
member_count=60,
position_offset=Vec3(-10, -10, 8)
)
# 设置初级消费者群体为蓝色
for member in primary_consumer_swarm['members']:
if 'node' in member:
member['node'].setColor(0, 0, 1, 1) # 蓝色
# 创建次级消费者群体(食肉动物)
print("创建次级消费者群体...")
secondary_consumer_swarm = swarm_manager.create_example_swarm(
swarm_type="鸟类",
member_count=20,
position_offset=Vec3(20, 20, 15)
)
# 设置次级消费者群体为红色
for member in secondary_consumer_swarm['members']:
if 'node' in member:
member['node'].setColor(1, 0, 0, 1) # 红色
# 创建分解者群体
print("创建分解者群体...")
decomposer_swarm = swarm_manager.create_example_swarm(
swarm_type="昆虫",
member_count=80,
position_offset=Vec3(15, -15, 3)
)
# 设置分解者群体为棕色
for member in decomposer_swarm['members']:
if 'node' in member:
member['node'].setColor(0.5, 0.3, 0, 1) # 棕色
# 添加环境元素
print("添加环境元素...")
# 添加水源
swarm_manager.create_obstacle(Vec3(-20, -20, 1), 8.0) # 湖泊
# 添加食物源
swarm_manager.create_obstacle(Vec3(10, 10, 4), 3.0) # 果树林
# 添加栖息地
swarm_manager.create_obstacle(Vec3(-15, 15, 6), 5.0) # 森林
# 设置交互关系
print("设置交互关系...")
# 初级消费者吃生产者(竞争关系)
swarm_manager.interaction_manager.add_interaction(
primary_consumer_swarm,
producer_swarm,
'competitive',
1.2
)
# 次级消费者捕食初级消费者(捕食者-猎物关系)
swarm_manager.interaction_manager.add_interaction(
secondary_consumer_swarm,
primary_consumer_swarm,
'predator_prey',
1.5
)
# 分解者与生产者合作(分解有机物,提供养分)
swarm_manager.interaction_manager.add_interaction(
decomposer_swarm,
producer_swarm,
'cooperative',
0.8
)
# 分解者与初级消费者竞争(争夺有机物资源)
swarm_manager.interaction_manager.add_interaction(
decomposer_swarm,
primary_consumer_swarm,
'competitive',
0.6
)
# 更新配置
swarm_manager.config.set("interaction_enabled", True)
swarm_manager.config.set("interaction_weight", 1.0)
swarm_manager.config.set("cohesion_weight", 0.8)
swarm_manager.config.set("separation_weight", 1.2)
swarm_manager.config.set("alignment_weight", 0.6)
swarm_manager.config.set("max_speed", 6.0)
swarm_manager.config.set("perception_radius", 12.0)
print("生态系统演示创建完成")
print(f"共创建了 {len(swarm_manager.swarms)} 个群体")
print("观察生态系统中不同群体之间的复杂交互行为")
def create_battle_demo(swarm_manager):
"""
创建群体对战演示
两个敌对群体之间的竞争
"""
print("创建群体对战演示...")
# 清理现有群体
swarm_manager.cleanup()
swarm_manager.swarms.clear()
swarm_manager.swarm_id_counter = 0
# 创建红方群体
print("创建红方群体...")
red_swarm = swarm_manager.create_example_swarm(
swarm_type="鸟类",
member_count=50,
position_offset=Vec3(-25, 0, 15)
)
# 设置红方群体为红色
for member in red_swarm['members']:
if 'node' in member:
member['node'].setColor(1, 0, 0, 1) # 红色
# 创建蓝方群体
print("创建蓝方群体...")
blue_swarm = swarm_manager.create_example_swarm(
swarm_type="鱼类",
member_count=50,
position_offset=Vec3(25, 0, 10)
)
# 设置蓝方群体为蓝色
for member in blue_swarm['members']:
if 'node' in member:
member['node'].setColor(0, 0, 1, 1) # 蓝色
# 在中间添加一个资源点
resource_position = Vec3(0, 0, 10)
swarm_manager.create_obstacle(resource_position, 4.0)
# 设置敌对关系
swarm_manager.interaction_manager.add_interaction(
red_swarm,
blue_swarm,
'competitive',
1.8
)
# 更新配置
swarm_manager.config.set("interaction_enabled", True)
swarm_manager.config.set("interaction_weight", 1.5)
swarm_manager.config.set("cohesion_weight", 1.2)
swarm_manager.config.set("separation_weight", 1.0)
swarm_manager.config.set("alignment_weight", 0.8)
swarm_manager.config.set("max_speed", 8.0)
swarm_manager.config.set("perception_radius", 15.0)
print("群体对战演示创建完成")
print("观察两个敌对群体如何争夺中心资源")
def create_symbiosis_demo(swarm_manager):
"""
创建共生关系演示
两个群体相互依赖,共同生存
"""
print("创建共生关系演示...")
# 清理现有群体
swarm_manager.cleanup()
swarm_manager.swarms.clear()
swarm_manager.swarm_id_counter = 0
# 创建植物群体
print("创建植物群体...")
plant_swarm = swarm_manager.create_example_swarm(
swarm_type="昆虫",
member_count=100,
position_offset=Vec3(0, 0, 3)
)
# 设置植物群体为绿色
for member in plant_swarm['members']:
if 'node' in member:
member['node'].setColor(0, 1, 0, 1) # 绿色
# 创建传粉者群体
print("创建传粉者群体...")
pollinator_swarm = swarm_manager.create_example_swarm(
swarm_type="鸟类",
member_count=30,
position_offset=Vec3(10, 10, 12)
)
# 设置传粉者群体为黄色
for member in pollinator_swarm['members']:
if 'node' in member:
member['node'].setColor(1, 1, 0, 1) # 黄色
# 设置共生关系
swarm_manager.interaction_manager.add_interaction(
plant_swarm,
pollinator_swarm,
'cooperative',
1.5
)
# 添加多个花丛
for i in range(5):
angle = i * 2 * 3.14159 / 5
x = 20 * math.cos(angle)
y = 20 * math.sin(angle)
swarm_manager.create_obstacle(Vec3(x, y, 5), 3.0)
# 更新配置
swarm_manager.config.set("interaction_enabled", True)
swarm_manager.config.set("interaction_weight", 1.2)
swarm_manager.config.set("cohesion_weight", 1.0)
swarm_manager.config.set("separation_weight", 1.3)
swarm_manager.config.set("alignment_weight", 0.7)
swarm_manager.config.set("max_speed", 5.0)
swarm_manager.config.set("perception_radius", 10.0)
swarm_manager.config.set("wander_enabled", True)
swarm_manager.config.set("wander_weight", 0.8)
print("共生关系演示创建完成")
print("观察植物和传粉者之间的互利共生关系")
def run_interaction_demo(swarm_manager, demo_type="ecosystem"):
"""
运行群体间交互演示
:param swarm_manager: 群体管理器
:param demo_type: 演示类型 ("ecosystem", "battle", "symbiosis")
"""
import math
print("=== 群体间交互演示 ===")
if demo_type == "ecosystem":
create_ecosystem_demo(swarm_manager)
elif demo_type == "battle":
create_battle_demo(swarm_manager)
elif demo_type == "symbiosis":
create_symbiosis_demo(swarm_manager)
else:
print(f"未知的演示类型: {demo_type}")
return
# 启用交互功能
swarm_manager.config.set("interaction_enabled", True)
print(f"\n{demo_type} 演示已启动")
print("使用控制面板可以调整交互参数")
print("观察不同群体之间的复杂交互行为")
return demo_type