在2D计划中放置N个代理

时间:2018-06-05 12:26:35

标签: python python-3.x

抱歉,如果我的英语不好(我是法国学生)。

我正在为一个学校项目工作,我想在一个模型化的地方创建一个人群运动,有一些墙壁,一个喷泉和路灯。我做了几乎所有的事情:人工智能已经创建并且可以继续进行2D计划,我的地方用我之前说过的一些东西模型化,我使用了雷诺兹' Boid规则(Alignement,Cohesion,Separation)在人群运动中接近人类的互动。当人们触摸墙壁或其他结构时,我仍然需要编写一个函数来对物理进行建模。

但是我正在进行人群的初始化(创造)并且它不起作用:人群由N人(代理人)组成,其中N在1到5518之间(最大人数到期)到空间限制)。 这是代码:

self.agents = []
x = 50
y = 55
X = 0
while X < N:
    if x <= 100 and x >= 50 and y <= 165 and y >= 55:
        k = 0
        while k < 50 and X < N:
            for a in range(11):
                for b in range(13):
                    if (x, y) != ((70 + a),(104 + b)):
                        x += k
                        agent = UnAgent(x, y)
                        self.agents.append(agent)
                        X += 1
                        k += 1
        x = 50
        y += 1

我认为存在无限循环,但我无法解决它。为了更好地理解我的代码,这里是我的绘画计划的图像,然后第二个图像是我的程序,其中所有代理在地点中心的独特图(x,y)上产生(这就是我的意思)我不希望,我希望每个人都在一个独特的情节中穿过X坐标,然后加1到Y坐标,然后穿过X坐标等,人们不能在红色块中产生所以喷泉)

First image of my plan on paint with explanation

Second image of my real program without the spawn feature

编辑:

嗨@PatrickArtner,感谢关注我的问题并帮助我!您的回复非常有用,因此我尝试调整您的代码(与我的代码相比真的可以理解!)以及我所拥有的代码:

def addMonumentCentral():
    '''Bloque la place de (70,104) à (80,116) avec des "briques" '''
    L=[]
    for a in range(70,81):
        for b in range(104,117):
            L.append((a,b)) # List of every unique tuple occupied by water
class Foule:
def __init__(self, count, largeur = 150, hauteur = 220):
    self.largeur = largeur
    self.hauteur = hauteur
    self.agents = []
    numAg = 0
    MonumentCentral = addMonumentCentral()
    for y in range(55,166):permise
        for x in range(55,101):
            if (x,y) not in MonumentCentral:
                agent = UnAgent(x, y)
                agent.largeur = largeur
                agent.hauteur = hauteur
                self.agents.append(agent)
                numAg += 1ajoutes
            if numAg == count:
                break
        if numAg == count:
            break

我对字典感到不舒服,所以我调整了你的第一个函数来返回每个水块的列表,它返回的内容如下:[(.. , ..),(.. , ..), ... ,(.. , ..)]其中每个括号都是2D计划中的水图

然后,我在我的课程Foule中应用你的第二个功能(这意味着英语&#34;人群&#34;)并且唯一没有工作的东西(这会阻止整个代码工作,通常一切都很完美,除了那个)是行if (x,y) not in MonumentCentral:。我似乎无法用Python中的元组列表来测试一个元组:我是Python的初学者,似乎它不起作用,但我不知道如何做类似的事情我以前用这条线做过。

当我执行代码时,我有这个错误行:TypeError: argument of type 'NoneType' is not iterable。您是否知道如何使用类似的元组列表测试元组来替换测试行?

你真的, Axel JOLY

编辑2:

我的代码现在有效,结果如下:

class Foule:
def __init__(self, count, largeur = 150, hauteur = 220):
    self.largeur = largeur
    self.hauteur = hauteur
    self.agents = []
    numAg = 0 # Nombre d'agents ajoutes
    MonumentCentral = []
    for a in range(70,81):
        for b in range(104,117):
            MonumentCentral.append((a,b))
    for y in range(55,166): # On parcourt selon les y la zone de spawn permise
        for x in range(55,101): # On parcourt selon les x la zone de spawn permise
            if (x,y) not in MonumentCentral: # On check si c'est bloqué ou non
                agent = UnAgent(x, y) # Position de depart
                agent.largeur = largeur
                agent.hauteur = hauteur
                self.agents.append(agent)
                numAg += 1 # Iteration pour compter le nombre d'agents ajoutes
            if numAg == count: # On casse si on atteint le nombre d'agents voulu
                break
        if numAg == count: # On casse si on atteint le nombre d'agents voulu
            break

对不起它主要是法语,但它现在完美地工作,有1个代理商到5518个代理商!

1 个答案:

答案 0 :(得分:2)

我很难理解您使用的while循环,因此我将它们重写为更简单的for .. in range(..):循环,这些循环超出了所需的x / y范围。

如果可以使用{em>阻止的set坐标检查可以放置代理 - 我选择使用dict - 用于额外存储什么阻止了瓷砖(主要用于显示目的)。

在放置任何代理之前,您将阻止所有不可用的图块(将它们放在集合中)。然后开始放置代理,通过检查是否阻塞了瓷砖并计算它。迭代直到所有代理人放置:

def addFountain(place):
   """Blocks the places (70,104) to (80,116) with water tiles"""
    for a in range(70,81):
        for b in range(104,117):
            place[(a,b)] = "~"  # water    


occupied = dict()               # dict as "playground" - it remembers which places are 
                                # already occupied. You can simply use a set of coords.

addFountain(occupied)           # add all water tiles to the dict (block the spaces)

maxNum = 74                     # place 74 agents
numAg = 0                       # placed 0 agents so far

for y in range(55,166):         # go over all tiles vertically
    for x in range(55,101):         # go over all tiles horizontally
        if (x,y) not in occupied:    # check if blocked, if not 
            occupied[(x,y)] = "A"                    # add UnAgent(x, y), I am adding "A"
            numAg += 1                               # count added agent
        if numAg == maxNum:                          # break if max reached
            break
    if numAg == maxNum:                       # break outer if max reached
        break

# visualizing the dictionary:
print("-" * (101-55+2))       # print plaza

for y in range(166,54,-1):     # print plaza (reversed so 55 is at bottom)
    print("|", end="")
    for x in range(55,101):
        print(occupied.get( (x,y), " "), end="") # print if in dict, else print space
    print("|")

print("-" * (101-55+2))

输出:

------------------------------------------------
|                                              |
|                                              |
      ... removed lots of empty lines ...
|                                              |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|               ~~~~~~~~~~~                    |
|                                              |
      ... removed lots of empty lines ...
|                                              |
|AAAAAAAAAAAAAAAAAAAAAAAAAAAA                  |
|AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|
------------------------------------------------

您可以从dict中获取代理列表,如下所示:

agents = [occupied[coord] for coord in occupied if occupied[coord] == "A"] (isinstance of your agent class)

您可能应该将此代码调整为您的类结构。