2013-04-08 36 views
3

我正在寻找在Python中实现蚁群优化算法,虽然我对Python和面向对象编程都很陌生,所以学习曲线一直很陡峭。在这一点上,我坚持就如何应对以下情况:Python数据结构对于2D网格的建议

  • 蚂蚁走动2D网格,他们会遇到障碍,信息素存款其他蚂蚁,食品等什么数据结构我做用来表示这个2D世界以及每个单元格的上述属性?

我试过一个二维数组,以为array[x-coord][y-coord]可能指向适当的属性(Obstacle: 'Yes/'No', Pheromone Level: X %, etc.)一个{} (dictionary)。不幸的是,虽然NumPy让我创建一个二维数组,但我无法将字典对象分配给各个坐标。

from numpy import * 

myArray = array([[1,2,3,4], 
       [5,6,7,8], 
       [9,10,11,12]]) 

myArray[2][2]={} 

返回:

Traceback (most recent call last): 
    File "/Users/amormachine/Desktop/PythonTest.py", line 7, in <module> 
    myArray[2][2]={} 
TypeError: long() argument must be a string or a number, not 'dict' 
[Finished in 0.6s with exit code 1] 

我不承诺任何字典或这种模式实施这个项目肯定会欣赏群体的智慧。

+0

有许多不同的方式来表示这个问题。表示问题的最佳方式主要取决于您想要对表示做什么。因此,我们需要一些指导方针来帮助您:您是否期望数据的任何部分都非常大(例如2D世界的大小,这个世界中有多少个单元格会被填充属性)?您希望能够快速执行哪些操作(例如,访问矩阵中单元格的属性,对矩阵执行算术运算)? – Bitwise 2013-04-09 00:53:34

+0

感谢您的Bitwise问题。随着项目的进一步深入,我将深入探讨更多方面。目前,简单清晰的数据结构非常有帮助。 – amormachine 2013-04-09 02:08:15

回答

1

相信你能,你真的不能,如果你的D型为int ...所以让你的数组对象,你可以使用对象...

In [43]: a = [[{},{},{}],[{},{},{}]] 

In [44]: a = numpy.array(a) 

In [45]: a[1][1] = {'hello':'world','something':5} 

In [46]: a 
Out[46]: 
array([[{}, {}, {}], 
     [{}, {'hello': 'world', 'something': 5}, {}]], dtype=object) 

虽然不知道whay您将获得使用numpy的用对象,你可能会更好,只是把它留作列表清单

+2

使用numpy数组而不是Python列表的一个可能的好处是内存使用率。如果他有一个真正巨大的二维世界,那么numpy阵列的成本会更低。 – ecline6 2013-04-09 00:14:56

+0

谢谢乔兰 - 你钉了它,这正是我需要的。 – amormachine 2013-04-09 02:04:21

0

在普通的Python中,我会选择list-of-dicts方法,但是使用NumPy我发现使用不同属性的单独数组更加自然而不是试图将事物放在一个结构中。

import numpy as np 

grid_shape = (120,80) 

# example of random initialization with this grid shape 
pheremone_level = np.random.rand(*grid_shape) 
obstacle = np.random.rand(*grid_shape) > 0.8 

由于@bitwise说它完全取决于你想要执行的操作。一般而言,NumPy中的“正确”方式将非常接近您在Matlab中编写它的方式,而非非NumPy Python。不幸的是,我不熟悉蚁群优化如何工作,所以我不能说什么更合适。