完成编辑^^:
if __name__ == '__main__':
walk = [100, 100]
#start: probability 1.0 at position 0.
position0 = Distribution.start(10)
plot(position.plotlists(*arena)[0], position.plotlists(*arena)[1],
linestyle='steps')
for m in walk:
move = Distribution.probability(m, 2)
position1 = convolve(position1, move)
plot(position1.plotlists(0,300)[0], position1.plotlists(0,300)[1],
linestyle='steps')
我想计算机器人到达100厘米的可能性,我做了2次,这是由变量 walk 完成的。因此,作为一个简单的案例,我分配(从期望的目标+/- 1)第一步的概率:
99 cm为0.25,100 cm为0.5和101 cm为0.25,为start = 99, values = 0.250000 0.500000 0.250000
,保存在变量 move 中。下一个循环变量被覆盖。
这很好用。所以现在我需要制作一个树形图并对两个步骤进行总结。取决于第二步的3个可能位置,由 卷积 完成....我应该
我的卷积(位置,移动)看起来像预定义函数c= position.append(move) result=sum_upTC(c) return result
的{{1}}。当我执行它时,python给出了错误:第20行,在convolve中
C = a.append(b)中
AttributeError:分发实例没有属性'append'
sum_upTC采用一个包含position1(最初为sum_upTC(distributions, weights = None)
)且变量 move
在2次循环后,应绘制下面的每个循环单独计算的可用性分布:
start = 0, values = 1.0000
还需要 sum_upTC 代码吗?
任何人都可以给我输入(以简单的方式解释^^ 新手)吗? 请和thx ^^
所以我希望创建一个情节,向我展示我的机器人处于所需位置的概率以及错过它并到达所需目标的+ -1 cm的概率。因此我用.25,.5和.25(-1,期望的目标,+ 1)分配到达的可能性。当我多次移动时,到达那个距离的概率会发生变化,可能性会增加。在这种情况下,第一步有3种可能性,第二步有5.(对于上面的值,使用树形图计算),这应该被绘制。
我将从主要部分开始。
1.定义参数 步行 中每一步的移动距离,移动2次100 cm
2.创建一个值为100%的起点,因为它是扩展坞并且位置是完全已知的。绘制它
3.loop 2次。循环计算从100厘米开始移动的步骤(功能 移动 )。分发在第一篇文章中。卷入,然后绘制成现有的情节。
第一个循环不值得一提第二个循环应该给start = 0, values = 1.0000
start = 99, values = 0.250000 0.500000 0.250000
start = 198, values = 0.062500 0.250000 0.37500 0.250000 0.062500
作为坐标,而start = 99, values = 0.250000 0.500000 0.250000
都是实例的类型。但是我的函数 sum(a,b) 将 a 作为两个实例,因为一个参数 b 是权重分配。
所以我的问题是如何将2个实例放在一起。很明显,标准start = 198, values = 0.250000 0.500000 0.250000
和.extend
不起作用。我得到上面提到的错误
答案 0 :(得分:0)
这应该在复制到文件时起作用。
from pylab import plot, show, ylim
from math import exp, ceil
class Distribution:
def __init__(self, offset = 0, values = [1.0]):
self.offset = offset
self.values = values[:]
def normalize(self):
s = float(sum(self.values))
if s != 0.0:
self.values = [i / s for i in self.values]
def value(self, index):
index -= self.offset
if index < 0 or index >= len(self.values):
return 0.0
else:
return self.values[index]
def plotlists(self, start = None, stop = None):
if start == None:
start = self.start()
if stop == None:
stop = self.stop()
if start <= stop:
indices = [i + 0.5 for i in xrange(start, stop)]
vals = [self.value(i) for i in xrange(start, stop)]
return (indices, vals)
else:
return ([], [])
@staticmethod
def unit_pulse(center):
return Distribution(center, [1.0])
@staticmethod
def triangle(center, half_width):
w = int(half_width)
c = int(center)
values = []
for i in xrange(-w+1, 0):
values.append(w+i)
for i in xrange(0, w):
values.append(w-i)
d = Distribution(center-w+1, values)
d.normalize()
return d
@staticmethod
def sum(distributions, weights = None):
if not weights:
weights = [1.0 for d in distributions]
start = min([d.start() for d in distributions])
stop = max([d.stop() for d in distributions])
sum_dist = [0.0 for _ in xrange(start, stop)]
for i in xrange(len(distributions)):
dist = distributions[i]
for j in xrange(len(dist.values)):
sum_dist[dist.start()-start+j] += dist.values[j] * weights[i]
d = Distribution(start, sum_dist)
Distribution.normalize(d)
return d
def move(distribution, delta):
return Distribution(distribution.offset+delta, distribution.values)
def convolve(a, b):
c=a.append(b)
result=sum(c)
return result
if __name__ == '__main__':
walk = [100,100]
coordinates = Distribution.unit_pulse(10)
plot(coordinates.plotlists(0,300)[0], coordinates.plotlists(0,300)[1],
linestyle='steps')
# Now move and plot.
for m in walk:
move_distribution = Distribution.triangle(m, 2)
coordinates = convolve(coordinates, move_distribution)
print coordinates
plot(coordinates.plotlists(0,300)[0], coordinates.plotlists(0,300)[1],
linestyle='steps')
ylim(0.0, 1.1)
show()