在二维平面上放置N个代理

2024-06-25 05:20:05 发布

您现在位置:Python中文网/ 问答频道 /正文

对不起,如果我的英语不好(我是法国学生)。你知道吗

我正在为一个学校项目工作,我想在一个有墙壁、喷泉和路灯的模型化的地方创造一个人群运动。我几乎做了所有的事情:人工智能被创造出来,可以在二维平面上移动,我的地方用我之前说过的一些东西来建模,我用雷诺的Boid规则(对齐、内聚、分离)来处理人群移动过程中的人与人之间的互动。我仍然需要编写一个函数来模拟人们触摸墙壁或其他结构时的物理现象。你知道吗

但我正在研究群组的初始化(创建),但它不起作用:群组由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

我对dictionary不太熟悉,所以我修改了您的第一个函数来返回一个列表,其中返回的每一块水都是这样的:[(.. , ..),(.. , ..), ... ,(.. , ..)]其中每两个圆括号都是二维平面上的水图。你知道吗

然后,我在我的类Foule中应用了你的第二个函数(在英语中是“crowd”的意思),唯一一个thar不起作用的是if (x,y) not in MonumentCentral:行。似乎我不能用Python中的元组列表来测试元组:我是Python的初学者,它似乎不起作用,但我不知道如何做一些我以前用这行代码做过的事情。你知道吗

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

真的, 阿克塞尔·乔利

编辑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个代理!你知道吗


Tags: 代码inselfforifoncountrange
1条回答
网友
1楼 · 发布于 2024-06-25 05:20:05

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

如果可以放置一个代理,那么可以通过使用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|
                        

你可以从字典里得到一份特工名单,比如:

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

您可能应该根据您的类结构调整此代码。你知道吗

相关问题 更多 >