이전 게시물에서 저는 전장 그리드에 위치 할 수있는 에이전트 그룹을 포함하는 간단한 에이전트 기반 시뮬레이션 모델을 구성했습니다. 모델은 시각화를 위해 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 유형의 각 요원은 해당 요원이 도달 할 수있는 범위 내에서 무작위로 선택된 적을 공격합니다.
이제 시뮬레이션은 다음 조건에서 수행됩니다.
- 각 라운드는 한 번의 반복입니다.
- 각 라운드에서 각 에이전트는 자신의 손이 닿는 범위 내에서 하나의 에이전트를 공격 할 수 있습니다.
- 에이전트의 도달 범위는 시뮬레이션 시작시 정의되며 기본값은 10입니다.
- 요원이 죽으면 더 이상 전장에 있지 않습니다.
- 에이전트는 자신의 라이프 스코어가 0 이하일 때 사망합니다.
- 각 에이전트는 10에서 60까지 무작위로 분산 된 공격 데미지를 처리합니다.
- 각 라운드에서 모든 에이전트는 공격을 시작합니다.
이 규칙이 적용되면 이제 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 배열.
최적화 및 시뮬레이션을 전문으로하는 산업 엔지니어 (R, Python, SQL, VBA)
Leave a Reply