假设我使用scipy/numpy创建直方图,所以我有两个数组:一个用于bin计数,一个用于bin边缘.如果我使用直方图来表示概率分布函数,我该如何有效地从该分布中生成随机数?
我使用R构建一个基于代理的模型,使用蒙特卡罗过程.这意味着我有许多使用某种随机引擎的函数.为了获得可重复的结果,我必须修复种子.但是,据我所知,我必须在每个随机抽签或样本之前设置种子.这是一个真正的痛苦.有没有办法修理种子?
set.seed(123)
print(sample(1:10,3))
# [1] 3 8 4
print(sample(1:10,3))
# [1] 9 10 1
set.seed(123)
print(sample(1:10,3))
# [1] 3 8 4
Run Code Online (Sandbox Code Playgroud) 你能解释一下如何建树吗?
我完全理解如何选择节点,但更好的解释将真正帮助我实现这个算法.我已经有一个代表游戏状态的棋盘,但我不知道(理解)如何生成树.
有人能指出一个评论很好的算法实现(我需要用它来进行AI)吗?还是更好的解释/例子呢?
我没有在网上找到很多资源,这个算法比较新...
编辑:Uploded完整的源代码,如果你想看看如果你能得到的AI表现得更好:https://www.dropbox.com/s/ous72hidygbnqv6/MCTS_TTT.rar
编辑:搜索搜索空间并找到导致丢失的移动.但由于UCT算法,不会经常访问导致损失的移动.
要了解MCTS(蒙特卡罗树搜索),我已经使用该算法为经典的井字游戏制作AI.我使用以下设计实现了算法:
树策略基于UCT,默认策略是执行随机移动直到游戏结束.我在实现中观察到的是,计算机有时会进行错误的移动,因为它无法"看到"特定的移动会直接导致丢失.
例如:
注意动作6(红色方块)的值略高于蓝色方块,因此计算机标记了这个位置.我认为这是因为游戏政策是基于随机移动,因此很有可能人类不会在蓝框中加上"2".如果玩家没有在蓝色框中放置2,那么计算机就会赢得胜利.
我的问题
1)这是MCTS的已知问题还是实施失败的结果?
2)有什么可能的解决方案?我正在考虑将这些动作限制在选择阶段,但我不确定:-)
核心MCTS的代码:
//THE EXECUTING FUNCTION
public unsafe byte GetBestMove(Game game, int player, TreeView tv)
{
//Setup root and initial variables
Node root = new Node(null, 0, Opponent(player));
int startPlayer = player;
helper.CopyBytes(root.state, game.board);
//four phases: descent, roll-out, update and growth done iteratively X times
//-----------------------------------------------------------------------------------------------------
for (int iteration = 0; iteration < 1000; iteration++)
{
Node current = Selection(root, game);
int value = Rollout(current, game, startPlayer);
Update(current, value);
}
//Restore game …
Run Code Online (Sandbox Code Playgroud) 应该何时使用蒙特卡罗方法?
例如,为什么Joel决定使用蒙特卡罗方法进行基于证据的调度,而不是有条不紊地处理过去一年的所有用户数据?
我对这里给出的简单粒子滤波算法感兴趣:http://www.aiqus.com/upfiles/PFAlgo.png看起来很简单,但我不知道如何实际做到这一点.关于如何实现它的任何想法(只是为了更好地理解它是如何工作的)?
编辑: 这是一个很好的简单示例,解释它是如何工作的:http://www.aiqus.com/questions/39942/very-simple-particle-filters-algorithm-sequential-monte-carlo-method-implementation?page= 1#39950
我试图用C++实现它:http://pastebin.com/M1q1HcN4但是我要注意我是否以正确的方式执行它.你能否检查我是否理解得很好,或者根据我的代码存在一些误解?
#include <iostream>
#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_01.hpp>
#include <boost/random/uniform_int_distribution.hpp>
using namespace std;
using namespace boost;
double uniform_generator(void);
#define N 4 // number of particles
#define evolutionProba_A_A 1.0/3.0 // P(X_t = A | X_t-1 = A)
#define evolutionProba_A_B 1.0/3.0 // P(X_t = A | X_t-1 = B)
#define evolutionProba_B_B 2.0/3.0 // P(X_t = B | X_t-1 = B)
#define evolutionProba_B_A 2.0/3.0 // P(X_t = …
Run Code Online (Sandbox Code Playgroud) 我使用多处理模块在Python中编写了简单的monte-carloπ计算程序.它工作正常,但是当我为每个工作者传递1E + 10次迭代时,会出现一些问题,结果是错误的.我无法理解问题是什么,因为1E + 9迭代的一切都很好!
import sys
from multiprocessing import Pool
from random import random
def calculate_pi(iters):
""" Worker function """
points = 0 # points inside circle
for i in iters:
x = random()
y = random()
if x ** 2 + y ** 2 <= 1:
points += 1
return points
if __name__ == "__main__":
if len(sys.argv) != 3:
print "Usage: python pi.py workers_number iterations_per_worker"
exit()
procs = int(sys.argv[1])
iters = float(sys.argv[2]) # 1E+8 is cool …
Run Code Online (Sandbox Code Playgroud) 我需要一个用于2D蒙特卡罗模拟的伪随机数生成器,它没有使用简单LCG获得的特征超平面.我使用以下代码在Excel 2013中测试了随机数生成器Rnd()(运行大约需要5秒):
Sub ZoomRNG()
Randomize
For i = 1 To 1000
Found = False
Do
x = Rnd() ' 2 random numbers between 0.0 and 1.0
y = Rnd()
If ((x > 0.5) And (x < 0.51)) Then
If ((y > 0.5) And (y < 0.51)) Then
' Write if both x & y in a narrow range
Cells(i, 1) = i
Cells(i, 2) = x
Cells(i, 3) = y
Found = True
End If
End If
Loop While (Not …
Run Code Online (Sandbox Code Playgroud) 任何人都可以推荐一本关于c ++中蒙特卡罗算法的好书吗?优选地,应用于物理学,甚至更优选地,物理学的类型是量子力学.
谢谢!
我有一个方法,它使用随机样本来近似计算.这种方法被称为数百万次,因此选择随机数的过程非常有效.
我不确定javas Random().nextInt
真的有多快,但我的程序似乎并没有像我想的那样受益.
选择随机数时,我会执行以下操作(半伪代码):
// Repeat this 300000 times
Set set = new Set();
while(set.length != 5)
set.add(randomNumber(MIN,MAX));
Run Code Online (Sandbox Code Playgroud)
现在,这显然有一个糟糕的最坏情况运行时间,因为理论上的随机函数可以为永恒添加重复数字,从而永远保持在while循环中.但是,数字是从{0..45}中选择的,因此重复的值大部分都不太可能.
当我使用上面的方法时,它只比我的其他方法快40%,这不是近似的,但会产生正确的结果.这大约跑了100万次,所以我期待这种新方法至少快50%.
您对更快的方法有什么建议吗?或许你知道一种更有效的方法来生成一组随机数.
澄清一下,这是两种方法:
// Run through all combinations (1 million). This takes 5 seconds
for(int c1 = 0; c1 < deck.length; c1++){
for(int c2 = c1+1; c2 < deck.length; c2++){
for(int c3 = c2+1; c3 < deck.length; c3++){
for(int c4 = c3+1; c4 < deck.length; c4++){
for(int c5 = c4+1; c5 < deck.length; c5++){
enumeration(hands, cards, deck, c1, c2, c3, …
Run Code Online (Sandbox Code Playgroud) montecarlo ×10
c++ ×2
java ×2
python ×2
random ×2
algorithm ×1
c# ×1
excel-2013 ×1
excel-vba ×1
inference ×1
iteration ×1
numpy ×1
physics ×1
pi ×1
probability ×1
r ×1
scipy ×1
tic-tac-toe ×1
tree ×1
vba ×1