Python에서 Matplotlib를 사용하여 시각화 된 간단한 에이전트 기반 시뮬레이션 실행

이전 게시물에서 저는 전장 그리드에 위치 할 수있는 에이전트 그룹을 포함하는 간단한 에이전트 기반 시뮬레이션 모델을 구성했습니다. 모델은 시각화를 위해 matplotlib를 사용하여 Python으로 코딩되었습니다.

에이전트는 아래와 같이 클래스로 모델링되었습니다.

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

전장 그리드 모델링을위한 2 차원 배열은 Python의 목록 이해력으로 생성되었습니다.

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

정의 된 그룹 크기로 에이전트 그룹을 생성하기위한 도우미 기능이 아래와 같이 구현되었습니다.

# 에이전트를 생성하고 그리드에 할당하는 기능을 정의합니다.
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 루프를 종료하십시오. 현장에서 자리를 잡다
                break

이러한 모델 구성 요소를 사용하여 초기 전장 인구를 생성하고 matplotlib를 사용하여 에이전트 위치를 표시했습니다. 이것은 아래 코드에서 수행됩니다.

# 사용 가능한 x 및 y 위치가있는 목록
locations = battlefield.copy() # using .copy prevents copying by reference
# 나중에 에이전트 참조를 포함하기 위해 빈 목록을 만들고 A 및 B를 입력합니다
agents_A = []
agents_B = []
# 그룹 A 및 B의 에이전트에 무작위 스팟 할당;
import random
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) 
# .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 means "A"
        else: # 그룹 B 에이전트
            population[i][j] = 2.0 # 2.0 means "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 0x22495922ac8>

이제 간단한 시뮬레이션 실행을 수행 할 수 있으며,이 작업은 이후 게시물에서 실험으로 바뀝니다. 이를 위해 두 가지 공격 전략을 구현합니다.

그룹 A는 각 라운드에서 항상 같은 에이전트를 공격하는 전략을 가지고 있습니다. 그룹 B는 적을 공격하기위한 무작위적이고 독립적 인 전략을 가지고 있습니다. 즉, B 유형의 각 요원은 해당 요원이 도달 할 수있는 범위 내에서 무작위로 선택된 적을 공격합니다.

이제 시뮬레이션은 다음 조건에서 수행됩니다.

  1. 각 라운드는 한 번의 반복입니다.
  2. 각 라운드에서 각 에이전트는 자신의 손이 닿는 범위 내에서 하나의 에이전트를 공격 할 수 있습니다.
  3. 에이전트의 도달 범위는 시뮬레이션 시작시 정의되며 기본값은 10입니다.
  4. 요원이 죽으면 더 이상 전장에 있지 않습니다.
  5. 에이전트는 자신의 라이프 스코어가 0 이하일 때 사망합니다.
  6. 각 에이전트는 10에서 60까지 무작위로 분산 된 공격 데미지를 처리합니다.
  7. 각 라운드에서 모든 에이전트는 공격을 시작합니다.

이 규칙이 적용되면 이제 50 라운드의 전투를 반복 할 것입니다. 마지막으로 전장에 남아있는 요원의 플롯을 인쇄합니다. 구현은 다음과 같습니다.

for counter in range(0,50): #이 경우에는 50 회 반복합니다.
    # 전장의 모든 셀을 반복
    for i in range(0,len(battlefield)):
        for j in range(0,len(battlefield)):
            #print("top tier iteration, i: "+str(i)+", j: "+str(j))
            # 각 셀에 에이전트가 있는지 확인
            if battlefield[i][j] != None:
                # 유형에 따라 : 각각의 공격 전략 실행
                if battlefield[i][j].group == "A":
                    found_i = None
                    found_j = None
                    # 각 반복에 대해 동일한 순서로 인접 셀을 찾습니다.
                    for k in range(i-10,i+11):
                        for l in range(j-10,j+11):
                            # 음수 인덱스 값을 확인합니다. 그렇다면-휴식!
                            if k < 0 or l < 0:
                                break
                            # 99 이상의 인덱스 값을 확인하십시오. 그렇다면 break!
                            if k > 99 or l > 99:
                                break
                            if battlefield[k][l]:
                                if battlefield[k][l].group == "B": # 그러면 이것은 적입니다
                                    if found_i == None:
                                        found_i = k
                                        found_j = l
                    # 식별 된 적에게 피해를줍니다.
                    if found_i:
                        battlefield[found_i][found_j].life = battlefield[found_i][found_j].life - random.randint(10,60)
                else: 
                    # 먼저 주변 셀 중 하나에 적이 있는지 확인
                    enemy_found = False
                    for k in range(i-10,i+11):
                        for l in range(j-10,j+11):
                            # 음수 색인을 확인합니다. 그렇다면 다음 반복으로 중단됩니다.
                            if k < 0 or l < 0:
                                break
                            # 99 이상의 인덱스 값을 확인합니다. 그렇다면 중단됩니다.
                            if k > 99 or l > 99:
                                break
                            if battlefield[k][l] != None:
                                if battlefield[k][l].group == "A":
                                    enemy_found = True
                    # 임의의 행과 임의의 열을 선택
                    found_i = None
                    found_j = None
                    while enemy_found and found_i == None:
                        k = random.randint(i-10,i+10)
                        l = random.randint(j-10,j+10)
                        # 음수 색인을 확인합니다. 그렇다면 다음 반복을 계속합니다.
                        if k < 0 or l < 0:
                            continue
                        # 색인 값> 99를 확인합니다. 그렇다면 계속합니다.
                        if k > 99 or l > 99:
                            continue
                        if k != i:
                            if battlefield[k][l]: 
                                if battlefield[k][l].group == "A":
                                    found_i = k
                                    found_j = l
                        else:
                            if l != j:
                                if battlefield[k][l]:
                                    if battlefield[k][l].group == "A":
                                        found_i = k
                                        found_j = l
                    # 식별 된 적에게 피해를줍니다.
                    if found_i:
                        battlefield[found_i][found_j].life = battlefield[found_i][found_j].life - random.randint(10,60)
    # 점수 또는 그 이하의 수명 점수를 가진 에이전트 식별-그리드에서 제거
    for i in range(0,len(battlefield)):
        for j in range(0,len(battlefield)):
            if battlefield[i][j]:
                if battlefield[i][j].life <= 0:
                    battlefield[i][j] = None
# 모든 전장 위치의 플롯 생성, 이후 10 회 반복
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: # 그룹 B 상담원 # 명
            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 after 50 iterations (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 0x22495be1848>

다음 게시물에서는 코드를 정리하고 그 기능을 재사용 가능한 기능으로 압축합니다. 그런 다음 전투 결과에 미치는 영향을 조사하기 위해 다양한 매개 변수를 변경하는보다 포괄적 인 시뮬레이션 연구를 수행 할 것입니다.

이 예에서는 Python 목록을 선택한 에이전트 컨테이너로 사용했습니다. 그러나 유사한 모델은 예를 들어 구성 할 수 있습니다. NumPy 배열.

You May Also Like

Leave a Reply

Leave a Reply

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

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