이전 게시물에서 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의 에이전트 기반 시뮬레이션에 대해 더 많이 배우기위한 출발점이 될 것입니다.
최적화 및 시뮬레이션을 전문으로하는 산업 엔지니어 (R, Python, SQL, VBA)
Leave a Reply