이전 게시물에서 저는 전장 그리드에 위치 할 수있는 에이전트 그룹을 포함하는 간단한 에이전트 기반 시뮬레이션 모델을 구성했습니다. 모델은 시각화를 위해 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