Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

多智能体强化学习

发表于 2022-01-18 | 更新于 2022-03-03

强化学习的核心思想是“试错”(trial-and-error):智能体通过与环境的交互,根据获得的反馈信息迭代地优化。在 RL 领域,待解决的问题通常被描述为马尔科夫决策过程。

当同时存在多个智能体与环境交互时,整个系统就变成一个多智能体系统(multi-agent system)。每个智能体仍然是遵循着强化学习的目标,也就是是最大化能够获得的累积回报,而此时环境全局状态的改变就和所有智能体的联合动作(joint action)相关了。因此在智能体策略学习的过程中,需要考虑联合动作的影响。

马尔科夫决策过程拓展到多智能体系统,被定义为马尔科夫博弈(又称为随机博弈,Markov/stochastic game)。

完全合作式

完全竞争式

混合关系式

MADDPG算法

MADDPG是OpenAI给的仿真代码。

安装MADDPG

安装步骤如下:

  1. 安装pyenv,用于python的多版本管理
  2. 使用pyenv安装python 3.5.4
  3. 使用venv创建虚拟环境
  4. 使用pip安装OpenAI gym (0.10.5), tensorflow (1.8.0), numpy (1.14.5)

注意使用pip安装tensorflow (1.8.0)时,可能报错,需要先安装grpcio(1.10.1)。

参考链接

  1. 万字长文:详解多智能体强化学习的基础和应用,by 机器之心.
  2. 多智能体强化学习综述-Lucian Busoniu,by Xray.
  3. AlphaGo原来是这样运行的,一文详解多智能体强化学习的基础和应用,by 机器之心.
  4. 多智能体强化学习中的非平稳性问题,by hoogle.
  5. 深度强化学习的弱点和局限,by 论智.
  6. Self-Play:让计算机学会相扑的强化学习“左右互搏术” ,by 贪心科技.
  7. 从Fictitious Play 到 NFSP,by Yumho.
  8. 传统的战略式博弈求解方法——虚拟博弈(Fictitious Play)讲解及其代码,by 码农家园.
  9. 【论文阅读】Deep Reinforcement Learning from Self-Play in Imperfect-Information Games,by 博弈真的不简单啊.
  10. 多智能体博弈强化学习研究综述笔记,by 一丨.
  11. 多智能体博弈强化学习研究综述笔记,by 一丨.
  12. 【多智能体RL】Actor-Attention-Critic for Multi-Agent RL,by 星桥翊月.
  13. COMA:Counterfactual Multi-Agent Policy Gradients,by 张现杰.
  14. Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments,by AHU-WangXiao.
  15. 丧的时候写写东西总没错,《Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments》,by 王小惟 Weixun.
  16. 多智能体强化学习入门(四)——MADDPG算法,by ECKai.
  17. 从代码到论文理解并复现MADDPG算法(基于飞桨的强化学习套件PARL),by Mr.郑先生_.
  18. maddpg原理以及代码解读,by Jianeng.
  19. linux中配置MPE和MADDPG环境,by codenong.
  20. Multi-agent Particle Environment - MPE多智能体强化学习运行环境的任务简介,by 普通攻击往后拉.
  21. 左右互搏,self-play,《Emergent Complexity via Multi-Agent Competition》,by 王小惟 Weixun.
  22. 多智能体深度强化学习综述与批判,by Xray.
  23. 伯克利开源工具库 RLib 现已支持大规模多智能体强化学习,by Eric Liang.
  24. python2 安装 tensorflow 遇到问题,by leo_fengj.

OSG的observer_ptr指针

发表于 2021-12-25

observer_ptr指针,这个指针和它的名字一样,就是用来观察指针的,可以把它想象成一个观察者,它只观察一个你给他指点的对象,但是不会影响这个对象的创建和销毁,它只是一个旁观者,但是它观察的这个对象要是被销毁了它也会知道并且自己也会被销毁。和osg::ref_ptr不同,osg::ref_ptr是用来管理指针的创建和删除的。

参考链接

  1. OSG中的observer_ptr指针,by vincent-xia.

OSG中的OpenThreads库使用帮助

发表于 2021-12-24

OpenThreads库是一个轻量级的跨平台多线程库,在2.x之前是独立发展的一个库,在2.x后并入到OSG的源码中,OSG中大量的多线程操作都是基于这个库编写的。

参考链接

  1. OpenThreads库介绍——Thread,by csxiaoshui.
  2. OpenThreads库介绍——Mutex,by csxiaoshui.
  3. OpenThreads库介绍——Block,by csxiaoshui.

CPlusPlus之volatile关键字

发表于 2021-12-22

C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。

当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。

参考链接

  1. C/C++ 中 volatile 关键字详解,by runoob.
  2. InterlockedCompareExchange用法详解,by 漂泊心情.

CPlusPlus之mutable关键字

发表于 2021-12-22

在 C++ 中,mutable 是为了突破 const 的限制而设置的。被 mutable 修饰的变量,将永远处于可变的状态,即使在一个 const 函数中,甚至结构体变量或者类对象为 const,其 mutable 成员也可以被修改。

mutable的作用有两点:

  1. 保持常量对象中大部分数据成员仍然是“只读”的情况下,实现对个别数据成员的修改;
  2. 使类的const函数可以修改对象的mutable数据成员。

使用mutable的注意事项:

  1. mutable只能作用于类的非静态和非常量数据成员。
  2. 在一个类中,应尽量或者不用mutable,大量使用mutable表示程序设计存在缺陷。

参考链接

  1. c++关键字mutable作用,by 苍老流年.
  2. C++中mutable关键字存在的必要性是什么?,by zhihu.

CPlusPlus运算符重载

发表于 2021-12-22

C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。

重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。

当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。

运算符重载

您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

->重载

C++98 standard §13.5.6/1 “Class member access”:

An expression x->m is interpreted as (x.operator->())->m for a class object x of type T if T::operator-> exists and if the operator is selected at the best match function by the overload resolution mechanism (13.3).

函数重载

在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。

参考链接

  1. Is operator-> “chained” for pointers? [duplicate],by stackoverflow.

CPlusPlus迭代器

发表于 2021-12-22

iterator是不是pointer呢?要看container而定,由上可知,vector的iterator是pointer,list的iterator就不是pointer,而是object利用operator overloading使它表面上的操作像pointer而已,但並不是一個pointer。

参考链接

  1. iterator到底是不是pointer? (C/C++) (STL),by 真 OO无双.

CPlusPlus的using关键字用法

发表于 2021-12-21

C++ using关键字主要有三种用法:

  • 导入命名空间
1
2
3
4
5
// 导入整个命名空间到当前作用域
using namespace std;

// 只导入某个变量到当前作用域
using std::cout;
  • 指定别名

C++ 11 通过 using 指定别名,作用等同于 typedef,但相比 typedef,逻辑更直观,可读性更好。

1
2
typedef int T; // 用 T 代替 int
using T = int; // 用 T 代替 int
  • 在派生类中引用基类成员

using关键字可以让父类同名函数在子类中以重载方式使用。

参考链接

  1. c++11中的using关键字,by 蝶泳奈何桥.
  2. C++中using的三种用法 ,by 算法集市.

CPlusPlus的typename关键字

发表于 2021-12-21

“typename”是一个C++程序设计语言中的关键字。当用于泛型编程时是另一术语”class”的同义词。typename关键字主要功能有两项:

  • class关键字的同义词

这是一项C++编程语言的泛型编程(或曰“模板编程”)的功能,typename关键字用于引入一个模板参数。

  • 类型名指示符

显式地告诉编译器,T::bar是一个类型名。这就必须用typename关键字,而非模板类的静态变量。

参考链接

  1. typename,by wikipedia.
  2. 知无涯之C++ typename的起源与用法,by libfeihu.

CPlusPlus友元函数与友元类

发表于 2021-12-21

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。

C++ 设计者认为, 如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做一点妥协以满足他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C++ 就有了友元(friend)的概念。打个比方,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私。

友元分为两种:友元函数和友元类。

友元函数

在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。

友元类

一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的私有成员。

参考链接

  1. C++友元函数和友元类(C++ friend)详解,by c语言中文网.
上一页1…192021…53下一页

Jack Huang

530 日志
69 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse