4

我希望在 Python 中实现一个蚁群优化算法,尽管对 Python 和面向对象编程都是新手,所以学习曲线相当陡峭。在这一点上,我被困在如何解决以下情况:

  • 当蚂蚁在 2D 网格中行走时,它们会遇到障碍物、其他蚂蚁的信息素沉积、食物等。我使用什么数据结构来表示这个 2D 世界以及每个单元的上述属性?

我尝试了一个二维数组,认为它array[x-coord][y-coord]可以指向{} (dictionary)具有适当属性的 a (Obstacle: 'Yes / 'No', Pheromone Level: X %, etc.)。不幸的是,尽管 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]

我不致力于使用字典或这种范式来实施这个项目,我当然会欣赏这个小组的智慧。

4

3 回答 3

1

当然可以,如果你的 dtype 是 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)

虽然不确定为什么将 numpy 与对象一起使用会有所收获,但最好将其保留为列表列表

于 2013-04-09T00:11:19.993 回答
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 Python 相比,NumPy 中的“正确”方式更接近于在 Matlab 中编写它的方式。不幸的是,我不熟悉蚁群优化的工作原理,所以我不能说什么更合适。

于 2013-04-09T09:34:36.203 回答
0

我正在寻找与结构化 2D 网格相关的东西,谷歌将我带到了这个页面。

尽管我的解决方案与问题中所问的网格并不完全相关,而且我不想重复关于“结构化 2D 网格”数据结构的问题,但我在这里发布了我的解决方案。我希望它对搜索二维结构化网格并被搜索引擎重定向到这里的观众有用

注意:该方法只返回单元格顶点和每个单元格的顶点连通性。可以通过添加额外的例程轻松生成应用所需的其他量,如细胞体积、细胞质心、外接圆、内圆等

import numpy as np
import matplotlib.pyplot as plt

def create_structured_grid(corner1=None, corner2=None, nx=5, ny=5, plt_=True, annotate=True):
   """
   creates a structured grid of rectangular lattice

   input:
   ------
       corner1 : [x_start, y_start]
       corner2 : [x_end, y_end]
       nx      : numpts in x
       ny      : numpts in y
       plt_    : boolean whether to plot or not
       annotate: whether to annotate the grid points or not
   output:
   -------
       vertex_array : numpy.array((numpts, dim),dtype=float) of vertices
       connectivity : numpy.array((num_cells, 2**dim), dtyp=int) of
                   vertex connectivity for each cell
       plots   : additionally plots if boolean values are true
   """
   #corner1 = np.array([0.0, 0.0])
   #corner2 = np.array([1.0, 1.0])
   dim = len(corner1) #currently only for 2D,
   x_pts = np.linspace(corner1[0], corner2[0], nx)
   y_pts = np.linspace(corner1[1], corner2[1], ny)

   Xv, Yv = np.meshgrid(x_pts, y_pts)
   numpts = nx*ny
   vertex_array = np.zeros((numpts, 2), dtype=float)

   vertex_array[:,0] = np.reshape(Xv, numpts)
   vertex_array[:,1] = np.reshape(Yv, numpts)

   num_cells = int(nx-1)*(ny-1)
   connectivity = np.zeros((num_cells, int(2**dim)), dtype=int)

   rows = ny-1
   cols = nx-1
   for row in range(rows):
       for col in range(cols):
           num = nx*row + col
           connectivity[cols*row + col] = [num+0, num+1, num+nx, num+nx+1]

   if plt_:
       X,Y = vertex_array.T
       fig = plt.figure()
       ax = fig.add_subplot(111)
       ax.set_aspect('equal')
       plt.scatter(X,Y, marker='o', s=50, color='g', alpha=1.0)
       plt.plot(Xv,Yv, linewidth=2, color='k')
       plt.plot(Yv,Xv, linewidth=2, color='k')
       if annotate:
           for idx, cc in enumerate(vertex_array):
               plt.text(cc[0], cc[1],  str(idx), color='k', verticalalignment='bottom', horizontalalignment='right', fontsize='medium')
       plt.show(block=False)

   return vertex_array, connectivity

函数调用可以是这样的:

c1 = np.array([0.0, 0.0])
c2 = np.array([1.0, 1.0])
vertices, connctivity = create_structured_grid(corner1=c1, corner2=c2, nx=4, ny=4)

vertices = array([[ 0.        ,  0.        ],
                  [ 0.33333333,  0.        ],
                  [ 0.66666667,  0.        ],
                  [ 1.        ,  0.        ],
                  [ 0.        ,  0.33333333],
                  [ 0.33333333,  0.33333333],
                  [ 0.66666667,  0.33333333],
                  [ 1.        ,  0.33333333],
                  [ 0.        ,  0.66666667],
                  [ 0.33333333,  0.66666667],
                  [ 0.66666667,  0.66666667],
                  [ 1.        ,  0.66666667],
                  [ 0.        ,  1.        ],
                  [ 0.33333333,  1.        ],
                  [ 0.66666667,  1.        ],
                  [ 1.        ,  1.        ]])
connectivity = array([[ 0,  1,  5,  6],
                      [ 1,  2,  6,  7],
                      [ 2,  3,  7,  8],
                      [ 4,  5,  9, 10],
                      [ 5,  6, 10, 11],
                      [ 6,  7, 11, 12],
                      [ 8,  9, 13, 14],
                      [ 9, 10, 14, 15],
                      [10, 11, 15, 16]])

在此处输入图像描述

于 2019-03-20T14:14:09.473 回答