24/8/18算法笔记 MARL多智能体算法

多智能体,想象一场2v2的对决

多智能体强化学习(Multi-Agent Reinforcement Learning,简称 MARL)是强化学习的一个分支,它涉及多个智能体在同一个环境中相互作用和学习。在多智能体环境中,每个智能体都有自己的观察、动作空间和奖励信号,它们需要通过合作或竞争来实现各自的目标。以下是多智能体强化学习的一些关键特点:

  1. 合作与竞争:在多智能体环境中,智能体可以是合作的(共同实现一个目标),也可以是竞争的(争夺资源或达成个人目标)。

  2. 共同环境:所有智能体都存在于同一个环境或世界中,它们的动作可能会相互影响环境的状态。

  3. 策略交互:智能体的策略不仅取决于自身的观察和目标,还可能受到其他智能体策略的影响。

  4. 信用分配:在多智能体环境中,确定哪些智能体对成功或失败的团队结果负责是一个挑战。

  5. 通信与协调:智能体可能需要通过通信来协调它们的行动,以实现更有效的合作或竞争。

  6. 部分可观察性:每个智能体可能只能观察到环境的一部分,需要通过局部信息来做出决策。

  7. 多样化的策略:在多智能体环境中,可能需要学习多种策略来应对不同的对手或合作伙伴。

  8. 学习稳定性:多智能体环境中的策略学习可能更加复杂和不稳定,因为每个智能体的学习过程都可能受到其他智能体策略变化的影响。

  9. 算法设计:设计多智能体强化学习算法时,需要考虑智能体之间的相互作用和潜在的非平稳性。

  10. 应用领域:多智能体强化学习在多个领域都有应用,包括机器人协作、自动驾驶车辆的交通管理、经济市场模拟、社交网络分析、多人游戏等。

多智能体强化学习的一些常见算法包括:

  • 独立学习:每个智能体独立地使用强化学习算法学习,不考虑其他智能体的存在。
  • 联合学习:智能体在一定程度上共享知识或模型,以促进合作或协调。
  • 通信机制:智能体通过某种形式的通信来交换信息,以协调它们的行动。
  • 竞争性学习:智能体学习如何在其他智能体存在的情况下优化自己的策略。
  • 模仿学习:智能体通过模仿其他智能体的行为来学习策略
#测试环境,15x15的棋盘,两个己方棋子,两个对方的
from combat import Combat

def 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 =False
    while 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] +=100
            reward[1]+=100
        else:
            reward[0] -=0.1
            reward[1] -=0.1
        data0['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_state
        over = 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=[]
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值