我正在编写一个物理模拟软件的想法,其中每个物理元素都将在自己的线程中进行模拟.
这种方法有几个优点.它在概念上非常接近现实世界的运作方式.将系统扩展到多台机器要容易得多.
但是,为了实现这一点,我需要确保所有线程以相同的速度运行,并对"相同"进行相当自由的解释.比如说在彼此的1%之内.
这就是为什么我不一定需要Thread.join()之类的解决方案.我不想要一些超级控制的学校情妇,确保所有线程定期与彼此同步.我只需要能够以大致相同的速度运行线程运行时(无论是Java,Erlang还是其他最适合此问题的运行时).
任何建议都将非常感激.
更新2009-03-16
我要感谢所有回答这个问题的人,特别是那些回答基本上都是"不要这样做"的人.由于每个人的评论,我现在更了解我的问题,而且我不太确定我应该像我原先计划的那样继续.尽管如此,我觉得彼得的答案是问题本身的最佳答案,这也是我接受它的原因.
我正在寻找一个允许我计算随机微积分的python库,比如我将定义扩散的随机过程的(条件)期望.我看了一下simpy(simpy.sourceforge.net),但它似乎并不能满足我的需求.
这是为了快速原型设计和实验.在java中,我使用了一些成功的(现在不活动的)http://martingale.berlios.de/Martingale.html库.
这个问题本身并不困难,但是有许多非常重要的需要做的事情(有效的内存使用,可变减少技术等等).
理想情况下,我可以写这样的东西(只是说明性的):
def my_diffusion(t, dt, past_values, world, **kwargs):
W1, W2 = world.correlated_brownians_pair(correlation=kwargs['rho'])
X = past_values[-1]
sigma_1 = kwargs['sigma1']
sigma_2 = kwargs['sigma2']
dX = kwargs['mu'] * X * dt + sigma_1 * W1 * X * math.sqrt(dt) + sigma_2 * W2 * X * X * math.sqrt(dt)
return X + dX
X = RandomProcess(diffusion=my_diffusion, x0 = 1.0)
print X.expectancy(T=252, dt = 1./252., N_simul= 50000, world=World(random_generator='sobol'), sigma1 = 0.3, sigma2 = 0.01, rho=-0.1)
有人知道别的东西,而不是例如在numpy中重新实现它吗?
如何在python中模拟击键?我也想同时按下多个键.
就像是:
keystroke('CTRL+F4')
Run Code Online (Sandbox Code Playgroud)
要么
keystroke('Shift+A')
Run Code Online (Sandbox Code Playgroud) 我正在用Python构建一个小模拟,我想使用Common Random Numbers来减少变化.我知道我必须实现CRN的同步才能工作:
CRN需要同步随机数流,这确保除了使用相同的随机数来模拟所有配置之外,在一种配置中用于特定目的的特定随机数用于所有其他配置中的完全相同的目的.
我想知道我想在模拟中实现它的方式是否有效,或者我是否应该使用不同的方法.
我的模拟有三个不同的类(ClassA,ClassB,ClassC),ClassA对象具有随机传播时间,ClassB对象具有随机服务时间和随机使用率,而ClassC对象具有随机服务时间.当然,每类对象可以有多个实例.
在模拟开始时,我指定一个随机数seed(replication_seed),这样我就可以为每个模拟复制使用不同的种子.
import numpy.random as npr
rep_rnd_strm = npr.RandomState().seed(replication_seed)
Run Code Online (Sandbox Code Playgroud)
然后在每个Class的构造函数中,我rep_rnd_strm用来生成一个种子,用于初始化类实例的随机数流:
self.class_rnd_strm = npr.RandomState().seed(rep_rnd_strm.randint(10000000))
Run Code Online (Sandbox Code Playgroud)
然后self.class_rnd_strm,我用于为类实例所需的每个随机数流生成种子.例如,ClassA的构造函数具有:
self.travel_time_strm = npr.RandomState().seed(self.class_rnd_strm.randint(10000000))
Run Code Online (Sandbox Code Playgroud)
而ClassB的构造函数有:
self.service_time_strm = npr.RandomState().seed(self.class_rnd_strm.randint(10000000))
self.usage_rate_strm = npr.RandomState().seed(self.class_rnd_strm.randint(10000000))
Run Code Online (Sandbox Code Playgroud)
我在这里做的是一个有效的方法来使同步工作,或者我应该做不同的事情?
目标
我想使用dplyr在参数网格上运行模拟.具体来说,我想要一个我可以在另一个程序中使用的函数
这是我的方法
require(dplyr)
run <- function(data, fun, fixed_parameters, ...) {
## ....
## argument checking
##
fixed_parameters <- as.environment(fixed_parameters)
grouped_out <- do_(rowwise(data), ~ do.call(fun, c(., fixed_parameters, ...)))
ungroup(grouped_out)
}
Run Code Online (Sandbox Code Playgroud)
这有效.例如,对于
growth <- function(n, r, K, b) {
# some dynamical simulation
# this is an obviously-inefficient way to do this ;)
n + r - exp(n) / K - b - rnorm(1, 0, 0.1)
}
growth_runner <- function(r, K, b, ic, ...) {
# a wrapper …Run Code Online (Sandbox Code Playgroud) 我想列出一系列卓越的机器人仿真环境,包括它们的优缺点.我所知道的一些例子是Webots和Player/Stage.
我有一个游戏理念,需要对流体在各种物体周围流动的半真实模拟.想象一下在不规则表面上的水银池,它在各个方向上倾斜.
这适用于游戏,因此不需要100%的物理真实感.最重要的是,计算可以在具有iPhone功能的设备上实时完成.
我认为某种细胞自动机或粒子系统是可行的方法,但我不知道从哪里开始.
有什么建议?
我正在寻找一个轻量级的纯Java物理引擎来为机器人运动控制做一些模拟.
我的要求:
您是否可以推荐任何适合该法案的现有库,而不是重新发明轮子?
ps我已经使用Google搜索了 - 我只是希望得到已经使用或实施此类内容的人的诚实意见!
我目前正在开发一个基于OpenCV/C++的应用程序来跟踪小动物:以下是它应该处理的视频类型的示例.程序只输出动物的x,y位置和每个区域的时间.这是原始图像的结果图形表示.
我的问题有点尴尬 - 也许是主题 - 因为我不是在问如何改进我的程序,而是如何评估它.我知道在跟踪数据集上存在Bonn Benchmark,但它不适合我的情况.
该计划旨在处理非常长的视频,因此,我无法真实地要求独立人类评估动物的位置并比较人与计划.我还考虑过使用机器人或将转发器放在较大的动物上以获得精确的位置,但我并没有真正的资源.
我想出了使用程序生成在二维环境中移动的blob视频的想法.我的问题很简单:
您是否了解任何可编程的高级框架,我可以使用它来图形化模拟在可参数化背景中随机移动的对象的运动?
我的梦想是拥有一个像这样工作的命令行工具:
$ program [BACKGROUND_OPTIONS] [OBJECT_OPTIONS] -V VIDEO_OUTPUT -P POSITIONS_OUTPUT
Run Code Online (Sandbox Code Playgroud)
可以操纵背景纹理以及移动对象的形状,颜色和运动模式.
我知道我可能"很容易"自己制作(如果我找不到任何东西,我会的话),但我更愿意,如果评估的程序和参考尽可能独立(例如,不是两者都是相同的)人).
我正在尝试实现2维n体仿真的OpenMP版本.
但是存在一个问题:我假设每个粒子的初始速度和加速度都为零.当颗粒首先聚集在一起时,它们会高速分散,不再聚集.
这似乎与牛顿法不一致,对吧?
有人可以解释为什么会发生这种情况以及如何解决错误?
这是我的代码的一部分:
/* update one frame */
void update() {
int i, j;
omp_set_num_threads(8);
# pragma omp parallel private(j)
{
# pragma omp for schedule(static)
for ( i = 0; i < g_N; ++i ) {
g_pv[i].a_x = 0.0;
g_pv[i].a_y = 0.0;
for ( j = 0; j < g_N; ++j ) {
if (i == j)
continue;
double r_2 = pow((g_pv[i].pos_x - g_pv[j].pos_x),2) + pow((g_pv[i].pos_y - g_pv[j].pos_y),2);
g_pv[i].a_x += (-1) * G * g_pv[j].m …Run Code Online (Sandbox Code Playgroud)