Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

QT5中文乱码解决方法

发表于 2022-02-21 | 更新于 2024-08-03

问题产生

常用设置窗口标题方式:

1
2
3
4
window.setWindowTitle("中文") 

QString title = "中文"
window.setWindowTitle(title);

使用上述方式设置窗口标题将产生乱码。

原因分析

字符编码不匹配导致乱码现象。

1
2
3
4
5
6
7
8
9
10
11
12
/* 源码版本5.12 */
void QWindowsWindow::setWindowTitle(const QString &title)
{
setWindowTitle_sys(QWindowsWindow::formatWindowTitle(title));
}

/* 源码版本5.12 */
void QWindowsBaseWindow::setWindowTitle_sys(const QString &title)
{
qCDebug(lcQpaWindows) << __FUNCTION__ << this << window() << title;
SetWindowText(handle(), reinterpret_cast<const wchar_t *>(title.utf16()));
}

从源码可以看出title.utf16()最终转换为utf16字符编码。

解决方案

1
2
3
QString::fromUtf16(u"中文");

QString::fromLocal8Bit("中文");

参考链接

  1. QT 中文乱码解决汇总(包括QString与string、char*互转乱码),by 高祥xiang.
  2. 源码分析Qt窗口标题中文乱码的问题,by Qt君.

QT多线程及其与GUI组件的通信

发表于 2022-02-21

每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。

每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。

QT线程创建方法

QThread使用方法1——重写run()函数

对于使用Qthread创建的进程而言,run()函数则是新线程的入口,run()函数退出,意味着线程的终止。

QThread使用方法2——moveToThread()

如果不想每执行一种任务就自定义一个新线程,那么可以自定义用于完成任务的类,并让它们继承自QObject。

然后使用moveToThread()将QObject对象实例移动到新线程。注意moveToThread()是QObject的公有函数。移动之后启动子线程。

多线程与GUI组件的通信

GUI系统的设计原则:所有界面组件的创建只能在GUI线程(主线程)中完成。子线程与界面组件的通信有两种方式:

  • 信号槽方式
  • 发送自定事件方式

参考链接

  1. 深入理解QT多线程编程,by 编程宝库.
  2. 零基础学 qt4 编程,by wd007.
  3. 多线程与界面组件的通信,by 程序员ITS401.
  4. QT从入门到入土(五(1))——多线程(QThread),by 唯有自己强大.

QT事件处理函数被触发两次的问题

发表于 2022-02-19 | 更新于 2022-02-21

如果用官方的写法on_btn_pressed()可以不用写connect函数,可以直接触发槽函数。如果此时用connect再次连接的话,就会导致on_btn_pressed()被执行两次。

Qt信号-槽连接函数原型如下:

1
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection )

Qt支持5种连接方式

  • Qt::DirectConnection(直连方式)(信号与槽函数关系类似于函数调用,同步执行)

当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。
当信号发射时,槽函数将直接被调用。
无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。

  • Qt::QueuedConnection(队列方式)(此时信号被塞到事件队列里,信号与槽函数关系类似于消息通信,异步执行)

当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。
当控制权回到接收者所依附线程的事件循环时,槽函数被调用。
槽函数在接收者所依附线程执行。

  • Qt::AutoConnection(自动方式)

Qt的默认连接方式,如果信号的发出和接收信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与队列方式相同。
如果信号在接收者所依附的线程内发射,则等同于直接连接
如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接

  • Qt::BlockingQueuedConnection(信号和槽必须在不同的线程中,否则就产生死锁)

槽函数的调用情形和Queued Connection相同,不同的是当前的线程会阻塞住,直到槽函数返回。

  • Qt::UniqueConnection

与默认工作方式相同,只是不能重复连接相同的信号和槽,因为如果重复连接就会导致一个信号发出,对应槽函数就会执行多次。

参考链接

  1. QT按钮被触发两次的问题,by 不二侬.
  2. QVariant的用法,by 十年之少.
  3. QT入门系列(4):QString与int相互转换方法,by 李奕锋.
  4. 深入理解QT多线程编程,by 编程宝库.
  5. 在Qt(C++)中使用QThread实现多线程,by 星夜之夏.
  6. Q_OBJECT宏的作用,by 沈子恒.

VS2017+QT5.8.0时,新建GUI应用程序编译报错的问题

发表于 2022-02-19 | 更新于 2022-07-20

使用VS2017+QT5.8.0时,报如下错误:

1
2
严重性	代码	说明	项目	文件	行	禁止显示状态
错误 C3615 constexpr 函数 "QAlgorithmsPrivate::qt_builtin_ctz" 不会生成常数表达式 (编译源文件 BaitLaunchingstrategy.cpp) Simulation d:\qt\qt5.8.0\5.8\msvc2015_64\include\qtcore\qalgorithms.h 593

解决方法请参考VS2017/2015 静态编译Qt 5.8_帝江VII的博客-程序员宝宝。

参考链接

  1. 使用VS2017+QT5.8.0时,新建GUI应用程序,编译报错的问题解决,by 麻辣鸡丝GIS.
  2. VS2017/2015 静态编译Qt 5.8_帝江VII的博客-程序员宝宝,by 程序员宝宝.

极大极小算法

发表于 2022-02-13

Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的方法。

1
2
3
4
5
6
7
8
9
10
11
12
function minimax(node, depth)
if node is a terminal node or depth = 0
return the heuristic value of node
if the adversary is to play at node
let α := +∞
foreach child of node
α := min(α, minimax(child, depth-1))
else {we are to play at node}
let α := -∞
foreach child of node
α := max(α, minimax(child, depth-1))
return α

参考链接

  1. 一张图读懂极大极小搜索和α-β剪枝,by housong_csdn.
  2. 极小化极大算法,by wikipedia.

VSCode中Python调试方法

发表于 2022-01-28

Python代码中设置了arg paser,需要手动设置,VS code的debug没有简单的添加参数的方式,需要创建launch.json文件配置调试参数,具体方法见vscode 调试python代码时添加参数(args)。

参考链接

  1. vscode 调试python代码时添加参数(args),by zk0272.

Python函数参数与注释

发表于 2022-01-28 | 更新于 2024-01-09

Python函数参数

Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

要注意定义可变参数和关键字参数的语法:

*args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict。

以及调用函数时如何传入可变参数和关键字参数的语法:

可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过args传入:func((1, 2, 3));

关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过kw传入:func({‘a’: 1, ‘b’: 2})。

Python函数注释

  • Google风格
1
2
3
4
5
6
7
8
9
10
11
12
13
"""
This is a groups style docs.

Parameters:
param1 - this is the first param
param2 - this is a second param

Returns:
This is a description of what is returned

Raises:
KeyError - raises an exception
"""
  • Rest风格
1
2
3
4
5
6
7
8
"""
This is a reST style.

:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""

参考链接

  1. 函数的参数,by 廖雪峰.
  2. Python3 - 6种方法拼接合并列表(list),by Mediumcn.
  3. python函数注释,by 戴思达.

Python多版本管理工具pyenv

发表于 2022-01-25 | 更新于 2022-05-25

pyenv是一个forked自ruby社区的简单、低调、遵循UNIX哲学的Python环境管理工具, 它可以轻松切换全局解释器版本, 同时结合vitualenv插件可以方便的管理对应的包源.

pyenv 让您可以轻松地在多个 Python 版本之间切换。它简单、不显眼,并且遵循 UNIX 的传统,即做好一件事的单一用途工具。

安装方法

获得pyenv

  • 通过pip获取pyenv,对已安装python的用户:

    • Powershell or Git Bash: pip install pyenv-win –target $HOME\.pyenv
    • cmd.exe: pip install pyenv-win –target %USERPROFILE%.pyenv
  • 直接下载pyenv-win的zip压缩包

  • 通过Git

    • Powershell or Git Bash: git clone https://github.com/pyenv-win/pyenv-win.git “$HOME/.pyenv”
    • cmd.exe: git clone https://github.com/pyenv-win/pyenv-win.git “%USERPROFILE%.pyenv”

安装pyenv

在linux操作系统中:

1
2
wget  https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer
bash pyenv-installer

使用命令leafpad .bashrc打开.bashrc文件,在其末尾输入如下内容:

1
2
3
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

完成安装

  1. 添加PYENV, PYENV_HOME, PYENV_ROOT三个环境变量。
  2. 将pyenv-win所在路径添加到PATH环境变量。
  3. 使用命令 pyenv –version 查看pyenv版本。
  4. 在 %USERPROFILE% 目录运行命令 pyenv rehash。
  5. 运行 pyenv 查看使用方法。

使用方法

安装python解释器

1
2
3
4
5
6
7
8
9
10
# No module named '_ctypes'解决方法
sudo apt-get install -y libffi-devel
sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
#
pyenv install 3.7.3 # 安装 python
pyenv versions # 查看本机安装版本
pyenv install --list # 查看可安装版本

# pyenv install build failed:Fatal: You must get working getaddrinfo() function
PYTHON_CONFIGURE_OPTS="--disable-ipv6" proxychains pyenv install 3.9.6

卸载python解释器

1
pyenv uninstall 2.7.3 # 卸载 python

Python 切换

切换全局或者项目中的 Python 版本:

1
2
pyenv global 2.7.3  # 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。
pyenv local 2.7.3 # 设置 Python 本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。

寻找 python 的时候优先级:

1
shell > local > global
1
2
3
4
5
pyenv shell 2.7.3 # 设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。`--unset` 参数可以用于取消当前 shell 设定的版本。

pyenv shell --unset

pyenv rehash # 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)

安装卸载python包

1
2
3
4
pip freeze > requirement #导出依赖包
pip install -r requirement #安装依赖包
pip install -r requirement --proxy localhost:8080 # 通过代理服务安装依赖包
pip uninstall -r requirement #卸载所有依赖包

创建虚拟环境

venv

venv是python从3.3版本开始自带的虚拟环境,它的很多操作都和 virtualenv 类似,但是两者运行机制不同。要在 python2 上使用虚拟环境,依然要利用 virtualenv。

1
2
3
python -m venv env
.\env\Scripts\activate
deactivate

virtualenv

virtualenv 是目前最流行的 Python 虚拟环境配置工具。它不仅同时支持 Python2 和 Python3,而且可以为每个虚拟环境指定 Python 解释器,并选择不继承基础版本的包。

1
2
3
4
5
pip install virtualenv
pyenv exec virtualenv myproject
cd myproject
.\env\Scripts\activate
deactivate

参考链接

  1. Python多版本管理工具–pyenv,by tigeriaf.
  2. Python版本管理神器-pyenv,by 安阳.
  3. pyenv,by pyenv.
  4. pyenv for Windows,by pyenv-win.
  5. Windows环境下的Python环境搭建,by 魏晓蕾.
  6. 使用 pyenv 管理 Python 版本,by Ein Verne.
  7. Windows平台Python安装与配置教程,by jackhuang.
  8. Pipenv最新一代Python项目环境与依赖管理工具,by jackhuang.
  9. 一文解读 virtualenv & venv & pipenv 之间的联系与区别,by I’m George.
  10. 什么时候-e,–editable选项对pip安装有用,by qastack.
  11. 1. 让PIP源使用国内镜像,提升下载速度和安装成功率。,by dotohi.
  12. pip install –proxy,by pip homepage.
  13. 花了两天,终于把 Python 的 setup.py 给整明白了,by 王炳明.
  14. pyenv install build failed:Fatal: You must get working getaddrinfo() function.,by Honcy Ye.
  15. python虚拟环境管理工具venv教程,by Yunfeng.
  16. Python3.7.0以上版本安装pip报错ModuleNotFoundError: No module named ‘_ctypes’解决方法,by bro丶默默.

OSG中GLB转IVE之路

发表于 2022-01-20 | 更新于 2023-04-10

最近在使用OSG 3.4的过程中,需要将一个GLB格式的3D模型文件,转换成IVE格式,以便osgDB::readNodeFile函数加载。具体方法是通过Blender建模软件进行3D文件格式转换。这个过程中遇到很多问题,记录一下。

常用的3D文件格式

.obj

OBJ文件是Alias | Wavefront公司为它的一套基于工作站的3D建模和动画软件“AdvancedVisualizer”开发的一种标准3D模型文件格式。

应用OBJ文件一般包括三个子文件,分别是.obj、.mtl、.jpg,除了模型文件,还需要.jpg纹理文件。OBJ可以是传统模型,也可以是倾斜模型。

特点OBJ格式适合用于3D软件模型之间的互导。比如Smart3D里面生成的模型需要修饰,就可以输出OBJ格式,然后导入到3dsMax进行处理;如果你想把在3dsMax中建的模型调到Maya里面渲染或制作动画,导出OBJ文件就是一种很好的选择。

目前几乎所有知名的3D软件都支持OBJ文件的读写,不过其中很多需要通过插件才能实现。另外,OBJ文件还是一种文本文件,可以直接用写字板打开进行查看和编辑修改。值得一提的是,老子云平台能够支持OBJ格式数据的上传和OBJ格式与其它格式间的互转。

其特点如下:

  • OBJ文件是一种3D模型文件。不包含动画、材质特性、贴图路径、动力学、粒子等信息。

  • OBJ文件主要支持多边形(Polygons)模型。虽然也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。

  • OBJ文件支持法线和贴图坐标。OBJ只能保存贴图坐标信息,贴图需要手动重新指认,但不需要再调整贴图坐标。

.dae

COLLADA ( COLLA borative Design A ctivity ) 是一种用于交互式3D应用程序的交换文件格式。它由非营利性技术联盟Khronos Group管理,并已被 ISO 采用为公开可用的规范 ISO/PAS 17506。[1]

COLLADA 定义了一个开放的标准 XML 模式,用于在各种图形软件应用程序之间交换数字资产,否则这些应用程序可能会将其资产存储在不兼容的文件格式中。描述数字资产的 COLLADA 文档是 XML 文件,通常以.dae(数字资产交换)文件扩展名标识。

.fbx

FBX是FilmBoX软件中所使用的格式,后来这一软件改名为Motionbuilder。

应用因为Motionbuilder扮演的是动作制作平台,所以FBX格式最大的用途是在3dsMax、Maya、softimage等软件间进行模型、材质、动作和摄影机信息的互导,这样就可以发挥max和maya等各个软件的优势。可以说,FBX方案是最好的互导方案。

其优点如下:

  • FBX格式是一种3D通用模型文件。包含动画、材质特性、贴图、骨骼动画、灯光、摄像机等信息。

  • FBX格式支持多边形(Polygons)游戏模型、曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials)。

  • FBX格式支持法线和贴图坐标。贴图以及坐标信息都可以存入FBX文件中,文件导入后不需要手动指认贴图以及调整贴图坐标。

.gltf 和 .glb

glTF( Graphics Language Transmission Format或GL Transmission Format的衍生简称)是三维场景和模型的标准文件格式。glTF 文件使用两种可能的文件扩展名之一,.gltf ( JSON / ASCII ) 或 .glb ( binary )。.gltf 文件可以是自包含的,也可以引用外部二进制和纹理资源,而 .glb 文件是完全自包含的。Khronos Group开发和维护的开放标准,支持3D 模型几何、外观、场景图层次结构和动画。它旨在成为一种简化的、可互操作的格式,用于交付 3D 资产,同时最大限度地减少文件大小和应用程序的运行时处理。因此,其创建者将其描述为“ 3D JPEG ”。

应用GlTF是一种可以减少3D格式中与渲染无关的冗余数据并且在更加适合OpenGL簇加载的一种3D文件格式。GlTF的提出是源自于3D工业和媒体发展的过程中,对3D格式统一化的急迫需求。如果用一句话来描述:GlTF 就是三维文件的 JPEG ,三维格式的 MP3。在没有GlTF的时候,大家都要花很长的的时间来处理模型的载入。尽管一些3D Web框架支持特定于平台的模型格式,如FBX和OBJ,但几乎每个框架都支持GLTF。如果有人要为你提供3D模型,你可以请求他们提供GLTF格式的版本。

特点GLTF是一种输出格式,这意味着我们无法直接修改它们。但我们可以修改其位置和大小,并对其进行旋转操作。

另外,GLTF文件不是单个文件,而是包含JSON文档、图片、几何图形、纹理、凹凸贴图等的文件夹。

.OSGB

OSGB的全称是Open Scene Gragh Binary。这里的Binary是二进制的意思。

应用目前市面上生产的倾斜模型,尤其是Smart3D处理的倾斜摄影三维模型的数据组织方式一般是二进制存贮的、带有嵌入式链接纹理数据(.jpg)的OSGB格式。

特点此类数据文件碎、数量多、高级别金字塔文件大。因而难以形成高效、标准的网络发布方案,无法实现不同地域、不同部门之间的数据共享。

.ive

ive是由OpenSceneGraph(OSG)创建的三维模型文件,OSG是用于建模和动画处理的开源3D图形工具包; 包含使用该软件创建的3D场景; 用于可视化,仿真,游戏,虚拟现实和其他建模方案。IVE文件以二进制格式存储,有助于查看和渲染场景时提高性能。

OSG实用工具

osgconv

osgconv是一种非常有用的的工具来读取标准的3D格式,如OpenFlight,3DS,Alias Wavefront(OBJ) etc,并且可以将它们转换为一种OSG所支持的格式,如OSG中的ASCII格式的.osg,二进制格式的.ive。

在程序运行的默认情况下,优化导入的场景图,将形成的这样结果:场景图读取的数据量将会更少且速度会更快。尤其值得指出的是,.ive格式的的文件,快速装载数据的能力使它非常适合数据页和大型的数据库。

osgconv常用方式为:

1
2
3
4
# 将cow.obj转成ive
osgconv cow.obj cow.ive
# 沿Z轴逆时针旋转90度
osgconv -o -90-0,0,1 cow.obj cow.ive

osgviewer

osgviewer 是随 OpenSceneGraph 一起分发的基本场景图查看器。它的主要目的是一个如何编写简单查看器的示例,但它的功能也足以用作基本的 3D 图形查看器。使用方法如下:

1
osgviewer cow.ive

osg插件

OpenSceneGraph 核心发行版中有 45 个插件,它们提供了对原生和 3rd 方文件格式的读写支持。OpenSceneGraph 数据库插件库 osgDB 自动按需加载插件,使用正在加载/保存的文件的扩展名来确定要加载哪个插件。osgDB 加载必要的插件是透明的,实际上你不应该做任何特殊的事情来加载某种文件类型。唯一需要记住的因素是 OSG 需要支持文件格式(由文件的扩展名决定)并且您应该已经编译了必要的插件。

转换方法

将glb文件转换成ive文件的流程如下:

  1. 使用blender 2.92 导入 glb 文件。
  2. 使用blender 2.92 将 glb 文件导出成 dae 文件。注意导出时选择导出纹理图像。该步骤的主要目的是为了获取glb文件的纹理图像。
  3. 使用blender 2.92 将 glb 文件导出成 obj 文件。 注意导出时选择导出纹理图像。该步骤将生成.obj、.mtl、.jpg三种文件,其中.jpg是纹理图像。如果纹理图像导出失败,可使用 dae 文件的纹理图像,同时注意修改.mtl文件中纹理图像的路径。.obj、.mtl均是文本文件,可直接打开。
  4. 使用命令 osgconv -o -90-0,0,1 cow.obj cow.ive 将obj文件转换成ive文件。-o选择将模型朝向沿着坐标轴进行旋转。

转换需要注意的问题

3D文件格式转换需要注意的问题主要有:

  • blender打开glb文件渲染时出现透明区域,显示背面区域的问题。

因为对blender建模软件不够熟悉,刚开始以为是纹理贴图的问题,后面才发现是面朝向的问题。法线朝外的面是正面,朝里的面是背面。透明区域的面法线朝里,我们看到的是背面。由于blender着色器默认使用背面剔除功能,导致本应不透明的面被删除,导致出现透明区域现象。

检测方面很简单,在blender中选择“视图叠加层”->“面朝向”打勾,模型正面将显示蓝色,背面显示红色。显示红色的区域就是透明区域。

解决方法很简单,在blender中选择红色区域三角面,选择“网格”->“法线”->“翻转”, 将背面变为正面,即可解决模型显示透明区域问题。

  • blender将glb转换成obj丢失纹理问题。解决方法在转换流程中已有介绍,在此不再详述。

  • 模型朝向问题。解决方法在转换流程中已有介绍,在此不再详述。

参考链接

  1. 三维文件格式知多少 | abc、glTF、fbx、obj、dae、stl、3ds..,by 饼干教育.
  2. 超实用:一篇文章带你了解市面上主流通用的3D模型格式,by qq.
  3. COLLADA,by wikipedia.
  4. glTF,by wikipedia.
  5. osgconv使用指南(转),by 3D入魔.
  6. osgconv,by osgchina.
  7. 背面剔除,正面剔除是什么能干嘛,从Blender和Unity解读,来2个效果你就懂了,by 拉克哈尼.
  8. osgPlugins,by openscenegraph.
  9. 科普:FBX格式和OBJ格式异同,by Tech fan.

多智能体强化学习

发表于 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.
上一页1…171819…52下一页

Jack Huang

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