Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的方法。
1 | function minimax(node, depth) |
参考链接
- 一张图读懂极大极小搜索和α-β剪枝,by housong_csdn.
- 极小化极大算法,by wikipedia.
Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的方法。
1 | function minimax(node, depth) |
Python代码中设置了arg paser,需要手动设置,VS code的debug没有简单的添加参数的方式,需要创建launch.json文件配置调试参数,具体方法见vscode 调试python代码时添加参数(args)。
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})。
1 | """ |
1 | """ |
pyenv是一个forked自ruby社区的简单、低调、遵循UNIX哲学的Python环境管理工具, 它可以轻松切换全局解释器版本, 同时结合vitualenv插件可以方便的管理对应的包源.
pyenv 让您可以轻松地在多个 Python 版本之间切换。它简单、不显眼,并且遵循 UNIX 的传统,即做好一件事的单一用途工具。
通过pip获取pyenv,对已安装python的用户:
直接下载pyenv-win的zip压缩包
通过Git
在linux操作系统中:
1 | wget https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer |
使用命令leafpad .bashrc打开.bashrc文件,在其末尾输入如下内容:
1 | export PYENV_ROOT="$HOME/.pyenv" |
1 | # No module named '_ctypes'解决方法 |
1 | pyenv uninstall 2.7.3 # 卸载 python |
切换全局或者项目中的 Python 版本:
1 | pyenv global 2.7.3 # 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。 |
寻找 python 的时候优先级:
1 | shell > local > global |
1 | pyenv shell 2.7.3 # 设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。`--unset` 参数可以用于取消当前 shell 设定的版本。 |
1 | pip freeze > requirement #导出依赖包 |
venv是python从3.3版本开始自带的虚拟环境,它的很多操作都和 virtualenv 类似,但是两者运行机制不同。要在 python2 上使用虚拟环境,依然要利用 virtualenv。
1 | python -m venv env |
virtualenv 是目前最流行的 Python 虚拟环境配置工具。它不仅同时支持 Python2 和 Python3,而且可以为每个虚拟环境指定 Python 解释器,并选择不继承基础版本的包。
1 | pip install virtualenv |
最近在使用OSG 3.4的过程中,需要将一个GLB格式的3D模型文件,转换成IVE格式,以便osgDB::readNodeFile函数加载。具体方法是通过Blender建模软件进行3D文件格式转换。这个过程中遇到很多问题,记录一下。
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只能保存贴图坐标信息,贴图需要手动重新指认,但不需要再调整贴图坐标。
COLLADA ( COLLA borative Design A ctivity ) 是一种用于交互式3D应用程序的交换文件格式。它由非营利性技术联盟Khronos Group管理,并已被 ISO 采用为公开可用的规范 ISO/PAS 17506。[1]
COLLADA 定义了一个开放的标准 XML 模式,用于在各种图形软件应用程序之间交换数字资产,否则这些应用程序可能会将其资产存储在不兼容的文件格式中。描述数字资产的 COLLADA 文档是 XML 文件,通常以.dae(数字资产交换)文件扩展名标识。
FBX是FilmBoX软件中所使用的格式,后来这一软件改名为Motionbuilder。
应用因为Motionbuilder扮演的是动作制作平台,所以FBX格式最大的用途是在3dsMax、Maya、softimage等软件间进行模型、材质、动作和摄影机信息的互导,这样就可以发挥max和maya等各个软件的优势。可以说,FBX方案是最好的互导方案。
其优点如下:
FBX格式是一种3D通用模型文件。包含动画、材质特性、贴图、骨骼动画、灯光、摄像机等信息。
FBX格式支持多边形(Polygons)游戏模型、曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials)。
FBX格式支持法线和贴图坐标。贴图以及坐标信息都可以存入FBX文件中,文件导入后不需要手动指认贴图以及调整贴图坐标。
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的全称是Open Scene Gragh Binary。这里的Binary是二进制的意思。
应用目前市面上生产的倾斜模型,尤其是Smart3D处理的倾斜摄影三维模型的数据组织方式一般是二进制存贮的、带有嵌入式链接纹理数据(.jpg)的OSGB格式。
特点此类数据文件碎、数量多、高级别金字塔文件大。因而难以形成高效、标准的网络发布方案,无法实现不同地域、不同部门之间的数据共享。
ive是由OpenSceneGraph(OSG)创建的三维模型文件,OSG是用于建模和动画处理的开源3D图形工具包; 包含使用该软件创建的3D场景; 用于可视化,仿真,游戏,虚拟现实和其他建模方案。IVE文件以二进制格式存储,有助于查看和渲染场景时提高性能。
osgconv是一种非常有用的的工具来读取标准的3D格式,如OpenFlight,3DS,Alias Wavefront(OBJ) etc,并且可以将它们转换为一种OSG所支持的格式,如OSG中的ASCII格式的.osg,二进制格式的.ive。
在程序运行的默认情况下,优化导入的场景图,将形成的这样结果:场景图读取的数据量将会更少且速度会更快。尤其值得指出的是,.ive格式的的文件,快速装载数据的能力使它非常适合数据页和大型的数据库。
osgconv常用方式为:
1 | # 将cow.obj转成ive |
osgviewer 是随 OpenSceneGraph 一起分发的基本场景图查看器。它的主要目的是一个如何编写简单查看器的示例,但它的功能也足以用作基本的 3D 图形查看器。使用方法如下:
1 | osgviewer cow.ive |
OpenSceneGraph 核心发行版中有 45 个插件,它们提供了对原生和 3rd 方文件格式的读写支持。OpenSceneGraph 数据库插件库 osgDB 自动按需加载插件,使用正在加载/保存的文件的扩展名来确定要加载哪个插件。osgDB 加载必要的插件是透明的,实际上你不应该做任何特殊的事情来加载某种文件类型。唯一需要记住的因素是 OSG 需要支持文件格式(由文件的扩展名决定)并且您应该已经编译了必要的插件。
将glb文件转换成ive文件的流程如下:
3D文件格式转换需要注意的问题主要有:
因为对blender建模软件不够熟悉,刚开始以为是纹理贴图的问题,后面才发现是面朝向的问题。法线朝外的面是正面,朝里的面是背面。透明区域的面法线朝里,我们看到的是背面。由于blender着色器默认使用背面剔除功能,导致本应不透明的面被删除,导致出现透明区域现象。
检测方面很简单,在blender中选择“视图叠加层”->“面朝向”打勾,模型正面将显示蓝色,背面显示红色。显示红色的区域就是透明区域。
解决方法很简单,在blender中选择红色区域三角面,选择“网格”->“法线”->“翻转”, 将背面变为正面,即可解决模型显示透明区域问题。
blender将glb转换成obj丢失纹理问题。解决方法在转换流程中已有介绍,在此不再详述。
模型朝向问题。解决方法在转换流程中已有介绍,在此不再详述。
强化学习的核心思想是“试错”(trial-and-error):智能体通过与环境的交互,根据获得的反馈信息迭代地优化。在 RL 领域,待解决的问题通常被描述为马尔科夫决策过程。
当同时存在多个智能体与环境交互时,整个系统就变成一个多智能体系统(multi-agent system)。每个智能体仍然是遵循着强化学习的目标,也就是是最大化能够获得的累积回报,而此时环境全局状态的改变就和所有智能体的联合动作(joint action)相关了。因此在智能体策略学习的过程中,需要考虑联合动作的影响。
马尔科夫决策过程拓展到多智能体系统,被定义为马尔科夫博弈(又称为随机博弈,Markov/stochastic game)。
MADDPG是OpenAI给的仿真代码。
安装步骤如下:
注意使用pip安装tensorflow (1.8.0)时,可能报错,需要先安装grpcio(1.10.1)。
observer_ptr指针,这个指针和它的名字一样,就是用来观察指针的,可以把它想象成一个观察者,它只观察一个你给他指点的对象,但是不会影响这个对象的创建和销毁,它只是一个旁观者,但是它观察的这个对象要是被销毁了它也会知道并且自己也会被销毁。和osg::ref_ptr不同,osg::ref_ptr是用来管理指针的创建和删除的。
OpenThreads库是一个轻量级的跨平台多线程库,在2.x之前是独立发展的一个库,在2.x后并入到OSG的源码中,OSG中大量的多线程操作都是基于这个库编写的。
C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。
当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。
在 C++ 中,mutable 是为了突破 const 的限制而设置的。被 mutable 修饰的变量,将永远处于可变的状态,即使在一个 const 函数中,甚至结构体变量或者类对象为 const,其 mutable 成员也可以被修改。
mutable的作用有两点:
使用mutable的注意事项: