多智能体,想象一场2v2的对决
多智能体强化学习(Multi-Agent Reinforcement Learning,简称 MARL)是强化学习的一个分支,它涉及多个智能体在同一个环境中相互作用和学习。在多智能体环境中,每个智能体都有自己的观察、动作空间和奖励信号,它们需要通过合作或竞争来实现各自的目标。以下是多智能体强化学习的一些关键特点:
-
合作与竞争:在多智能体环境中,智能体可以是合作的(共同实现一个目标),也可以是竞争的(争夺资源或达成个人目标)。
-
共同环境:所有智能体都存在于同一个环境或世界中,它们的动作可能会相互影响环境的状态。
-
策略交互:智能体的策略不仅取决于自身的观察和目标,还可能受到其他智能体策略的影响。
-
信用分配:在多智能体环境中,确定哪些智能体对成功或失败的团队结果负责是一个挑战。
-
通信与协调:智能体可能需要通过通信来协调它们的行动,以实现更有效的合作或竞争。
-
部分可观察性:每个智能体可能只能观察到环境的一部分,需要通过局部信息来做出决策。
-
多样化的策略:在多智能体环境中,可能需要学习多种策略来应对不同的对手或合作伙伴。
-
学习稳定性:多智能体环境中的策略学习可能更加复杂和不稳定,因为每个智能体的学习过程都可能受到其他智能体策略变化的影响。
-
算法设计:设计多智能体强化学习算法时,需要考虑智能体之间的相互作用和潜在的非平稳性。
-
应用领域:多智能体强化学习在多个领域都有应用,包括机器人协作、自动驾驶车辆的交通管理、经济市场模拟、社交网络分析、多人游戏等。
多智能体强化学习的一些常见算法包括:
- 独立学习:每个智能体独立地使用强化学习算法学习,不考虑其他智能体的存在。
- 联合学习:智能体在一定程度上共享知识或模型,以促进合作或协调。
- 通信机制:智能体通过某种形式的通信来交换信息,以协调它们的行动。
- 竞争性学习:智能体学习如何在其他智能体存在的情况下优化自己的策略。
- 模仿学习:智能体通过模仿其他智能体的行为来学习策略
#测试环境,15x15的棋盘,两个己方棋子,两个对方的
from combat import Combatdef test_env():state = env.reset()action = env.action_space.sample()next_state,reward,over,_ = env.step(action)print('state=',len(state[0]),len(state[1]))print('action=',action)print('reward=',reward)print('next_state=',len(next_state[0]),len(next_state[1]))print('over',over)env = Combat(grid_shape = (15,15),n_agents= 2,n_opponents= 2)test_env()
定义PPO模型,省略http://t.csdnimg.cn/teQs3
获取一局游戏数据
def get_data():data0= {'state' : [],'action':[],'reward' :[],'next_state':[],'over':[],}data1 = {'state' : [],'action':[],'reward' :[],'next_state':[],'over':[],}state = env.reset()over =Falsewhile not over:action= [None,None]action[0] = ppo.get_action(state[0])action[0] = ppo.get_action(state[1])next_state,reward,over,info = env.step(action)win = info['win']del info#对reward进行偏移if win:reward[0] +=100reward[1]+=100else:reward[0] -=0.1reward[1] -=0.1data0['state'].append(state[0])data0['action'].append(state[0])data0['reward'].append(state[0])data0['next_state'].append(next_state[0])data0['over'].append(False)#常量data1['state'].append(state[1])data1['action'].append(state[1])data1['reward'].append(state[1])data1['next_state'].append(next_state[1])data1['over'].append(False)#常量state = next_stateover = over[0] and over[1]data0['state'] = torch.FloatTensor(data0['state']).reshpe(-1,150)data0['action'] = torch.LongTensor(data0['action']).reshpe(-1,1)data0['reward'] = torch.FloatTensor(data0['reward']).reshpe(-1,1)data0['next_state'] = torch.FloatTensor(data0['next_state']).reshpe(-1,150)data0['over'] = torch.LongTensor(data0['over']).reshpe(-1,1)data1['state'] = torch.FloatTensor(data0['state']).reshpe(-1,150)data1['action'] = torch.LongTensor(data0['action']).reshpe(-1,1)data1['reward'] = torch.FloatTensor(data0['reward']).reshpe(-1,1)data1['next_state'] = torch.FloatTensor(data0['next_state']).reshpe(-1,150)data1['over'] = torch.LongTensor(data0['over']).reshpe(-1,1)return data0,data1,win
训练
wins = []
for i in range(200000):data0,data1,win=get_data()wins.append(win)ppo.train(**data0)ppo.train(**data1)if i %10000 == 0:wins = wins[-100:]print(i,sum(wins)/len(wins))wins=[]