Python으로 간단한 에이전트 기반 시뮬레이션 모델 개발

이전 게시물에서 Python에서 matplotlib 및 pyplot을 사용하여 2D 그리드를 시각화하는 방법을 시연했습니다 ( “Python에서 matplotlib를 사용하여 2D 그리드 및 배열 시각화”라는 제목의 게시물). 이 게시물은 Python에서 그리드를 시각화하는 방법에 대한 첫 번째 소개였습니다. 그리드 시각화는 다음과 같은 경우에 흥미로울 수 있습니다. 에이전트 기반 시뮬레이션 연구의 결과를 시각화합니다. 이 게시물에서는 2D 배열을 두 가지 유형의 에이전트로 채울 수있는 환경으로 사용하여 간단한 에이전트 기반 시뮬레이션 모델의 기초를 모델링합니다. 이 2D 어레이는 두 그룹의 에이전트가 전투를 벌이는 전장 역할을합니다. 상담원은 동일한 속성 집합을 가지며 그 중 하나는 그룹 구성원이됩니다. 이 외에도 시뮬레이션이 시작될 때와 동일한 수명 점수가 있습니다. 마지막으로 2 차원 세계에서 공간 위치를 나타내는 일련의 좌표 (x 및 y 좌표)가 있습니다. 이 게시물에서는 시뮬레이션 연구를 수행하지 않을 것입니다. 이것은 다음 포스트에서 수행 될 것입니다. 이 게시물의 모델을 향후 게시물에서 두 에이전트 그룹 간의 전투를 시뮬레이션하는 데 사용할 것입니다. 아래 코드 스 니펫에서 관련 속성 및 메서드를 포함하는 에이전트 용 클래스를 정의합니다. 주석의 형태로 코드에 문서가 추가됩니다.

# 클래스, 에이전트를 추상 데이터 유형으로 정의
class agent:
    # init-method, 에이전트의 생성자 메소드
    def __init__(self,x,y,group):
        self.life = 100.0 # 에이전트의 수명 점수
        self.x = x
        self.y = y
        self.group = group

다음 단계는 2D 목록 형태로 2D 격자 배열을 정의하는 것입니다. 행은 x 좌표를 나타내고 열은 y 좌표를 나타냅니다. 이 2D 목록은 전장을 나타냅니다. 100 x 100 셀 크기, 즉 10,000 개의 위치를 ​​갖도록 정의합니다. 이 “전장”배열을 정의하기 위해 파이썬에서 기본 목록 유형을 사용할 것입니다. 가는 방법은 Python에서 목록 이해를 사용하는 것입니다.

# 파이썬에서 목록 이해력을 사용하여 빈 100 x 100 목록 만들기
battlefield = [[None for i in range(0,100)] for i in range(0,100)]

다음으로 두 그룹의 요원을 만들어 전장 내 임의의 위치에 배치합니다. 별도의 목록에 에이전트 개체에 대한 참조를 추가로 저장합니다. 그룹 A의 에이전트 1000 명과 그룹 B의 에이전트 1000 명을 만들겠습니다.

# 사용 가능한 x 및 y 위치가있는 목록
locations = battlefield.copy() # .copy를 사용하면 참조로 복사 할 수 없습니다.
# 나중에 에이전트 참조를 포함하기 위해 빈 목록을 만들고 A 및 B를 입력합니다.
agents_A = []
agents_B = []
# 그룹 A 및 B의 에이전트에 무작위 스팟 할당; 
# -- 이를 위해 무작위 모듈이 필요하므로 가져 오기
import random
# -- 에이전트를 생성하고 그리드에 할당하는 기능을 정의합니다.
def agentCreator(size,group,groupList,field,n,m):
    # 전체 그룹을 반복합니다 (이 경우 1000 개 단위).
    for j in range(0,size):
        # 임의의 사용 가능한 위치 선택
        while True:
            # 임의의 x 좌표
            x = random.choice(range(0,n))
            # 임의의 y 좌표
            y = random.choice(range(0,m))
            # 자리가 있는지 확인하십시오. 그렇지 않다면 다시 반복하십시오
            if field[x][y] == None:
                field[x][y] = agent(x=x,y=y,group=group)
                # 그룹 목록에 에이전트 개체 참조 추가
                groupList.append(field[x][y])
                # while 루프를 종료하십시오. 현장에서 자리를 잡다
# -- agentCreator 함수를 사용하여 전장을 채 웁니다.
agentCreator(size = 1000,
                group = "A",
                groupList = agents_A,
                field = battlefield,
                n = 100,
                m = 100)
 agentCreator(size = 1000,
                group = "B",
                groupList = agents_B,
                field = battlefield,
                n = 100,
                m = 100) 

2D 목록 “전장”에는 이제 “없음”또는 A 또는 B 유형의 에이전트 참조가 포함됩니다. 전투가 아직 시작되지 않았으므로 모든 에이전트의 라이프 점수는 100입니다. 에이전트 기반 시뮬레이션에 대한이 첫 번째 게시물을 완료하기 위해 유형 A 에이전트의 위치와 유형 B 에이전트의 위치를 ​​두 개의 별도 그리드 플롯으로 시각화 할 것입니다. 이를 수행하는 핵심은 .imshow () 메소드와 함께 matplotlib.pyplot을 사용하는 것입니다.

# .imshow ()에는 float 요소가있는 행렬이 필요합니다.
population = [[0.0 for i in range(0,100)] for i in range(0,100)]
# 에이전트가 A 유형이면 1.0을 입력하고 B 유형이면 2.0을 입력합니다.
for i in range(1,100):
    for j in range(1,100):
        if battlefield[i][j] == None: # 빈
            pass # 인구 세포에 0.0을 남겨 두십시오.
        elif battlefield[i][j].group == "A": # 그룹 A 에이전트
            population[i][j] = 1.0 # 1.0은 "A"를 의미합니다.
        else: # group B agents
            population[i][j] = 2.0 # 2.0은 "B"를 의미합니다.
# matplotlib에서 pyplot 및 색상 가져 오기
from matplotlib import pyplot, colors
# matplotlib의 색상을 사용하여 색상 맵 정의
colormap = colors.ListedColormap(["lightgrey","green","blue"])
# pyplot을 사용하여 그림 크기 정의
pyplot.figure(figsize = (12,12))
# 줄거리를 사용하여 제목 추가
pyplot.title("battlefield before simulation run (green = A, blue = B)",
            fontsize = 24)
# pyplot을 사용하여 x 및 y 레이블 추가
pyplot.xlabel("x coordinates", fontsize = 20)
pyplot.ylabel("y coordinates", fontsize = 20)
# pyplot을 사용하여 x 및 y 축 눈금 조정
pyplot.xticks(fontsize = 16)
pyplot.yticks(fontsize = 16)
# pyplot의 .imshow () 메서드를 사용하여 에이전트 위치 시각화
pyplot.imshow(X = population,
             cmap = colormap)
<matplotlib.image.AxesImage at 0x1c756b04c88>

다음 포스트에서는 두 에이전트 그룹 간의 실제 전투를 시뮬레이션하기 위해이 포스트에서 개발 한 기본 모델을 사용할 것입니다. 다양한 매개 변수와 이들이 전투 결과에 어떤 영향을 미치는지 살펴 보겠습니다. 이것은 Python의 에이전트 기반 시뮬레이션에 대해 더 많이 배우기위한 출발점이 될 것입니다.

You May Also Like

Leave a Reply

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.