아코스피어에 대해 설명한 글들이 여러가지 있는데
( 소거로 설명한게 제일 이해하기에 난이도가 낮아보였음 https://gall.dcinside.com/factorio/58798 )
문제는 이러한 결과를 팩토리오 회로로 어떻게 변환 할 것이냐가 문제임.
산술적으로 뽑아낸 조건들 늘어놓은걸 팩토리오 회로로 옮길 때 자칫하면 크기가 엄청나게 커지고 복잡해지기 때문에…
그렇기 때문에 여기선 수학적으로 완벽한 답을 찾는게 아니라, 최종 인게임 회로까지 접근하기 쉬운 방식의 예를 들어보고자 함.
아래 내용에서 푸른색 글이 실제 팩토리오 회로로 적용되는 부분임.
맨 처음 아코스피어 전체목록이 다 써있는 레시피이자, 먼저 기본 아코스피어를 각각의 타입으로 바꾸기 위한 아코스피어 분극을 보면 아래 순서대로 되어있음.
이 순서는 규칙을 한눈에 알아보기 어렵도록 에렌델이 약간 꼬아놓은거로 보이고,
한눈에 보이도록 바꾸기 위해선 제타+세타, 엡실론+피의 자리를 바꾸고 전도와 접기를 정리해보면 아래처럼 된다.
8종의 아코스피어는 4개씩
나눠서 A, B그룹으로 분리 할 수 있고, 이는 전도를 통해서
A->B 혹은 B->A로 전달이 가능하다.
그리고 아코스피어 접기는 A, B그룹 내에서 각각 변환을 수행하고, 각 그룹의 아코스피어 합을 변경시키지 않는다.
그니까 A/B그룹의 개수를 전도로 맞추고, 그룹 내의 밸런싱은 접기로 하면 되는것임.
전도를 먼저
팩토리오 회로로 정리해보면
A그룹에 있는걸 모두 더하고, B그룹에 있는것도 모두 더하고, 양쪽을 빼서 개수만 세주면 됨.
그 개수의 차이가 일정 개수가 넘는 경우 전도를 시행해주면 되는 것.
여기까지는 모든 설명글이 똑같고, 아주 간단하게 도출되는 결론이다.
진짜 문제는 이제 접기로 어떻게 A/B그룹을 각각 밸런싱 할것이냐
임.
베이스가 되는 아이디어는 밸런싱이 끝나면 모두 평균값에 수렴할 것이니, 평균값에 미달하는걸 끌어올리는 접기를 하자.
그리고 이 평균값 구하는 회로 역시 간단함.
8종의 아코스피어 신호를 모두 합해서 다른 신호(로 변환해버리면 그 한 개의 신호로 모두 합쳐지고, 그것을 8로 나누면 끝임.
아까 정리했던 이 표를 보면, 각각의 아코스피어를 늘리는 (1이 적혀있는) 접기는 2개씩이 존재함.
그럼 그 2개중에 어떤 걸 선택할 것이냐? 물론 평균값보다 많은거지. 평균값보다 많은건 평균값으로 끌어내려야 하니까.
그럼 또 두개의
회로가 나왔음. 그룹 A에서 아코스피어 시를 더해준다 라고
가정하면,
접기 1의 조건을 예로 들면
시 – 평균값 < 0
람다 – 평균값 > 0 가 됨.
자 근데 시를 더해주는 접기는 1과 7이 있고, 거기서 각각 빠지는 아코스피어는 람다와 피임.
근데 만약에 람다와 피가 현재 딱 평균값이라면? 그러면 시가 모자라도 더해줄 수 없게됨.
데드락이 걸릴 가능성이 존재하는거임. (실제
사용에서는 그럴 일 없다고 봐도 된다.)
데드락의 가능성을 완전히 없애주기
위해 두번째 조건을 람다 – 평균값 >= 0 으로 수정하자.
자 이게 이 아이디어에서 출발한 밸런싱에 필요한 모든 회로의 거의 대부분임.
거의라고 하면 마지막 하나는 무엇이냐?
평균값의 마진임.
A그룹의 밸런싱을 수행 할 때 B그룹이 동시에 맞춰지면 좋겠지만 그렇지 않을 가능성도 높고, 그 반대도 마찬가지임.
이렇게 아코스피어를 모두 완벽하게 평균값으로
맞추려고 한다면 평균값 근처에서 무한루프 같은게 발생해버릴 가능성이 있지 않을까?
맞음. 실제로는 무한루프까진 안생기지만 평균값 근처에서 단 한개 때문에 드는 시간이 그
앞에서 10개를 맞추는 것보다 오래 걸릴 수도 있음. 쓸데없이
로봇 전력만 낭비되고 그런단 말이야.
그래서 위에서 구한 평균값을 약간 내려주는 거임. 완전히 평균값까지 도달하진 못하더라도, 그 근처의 합리적 지점에서 빠르게 끝내고 멈출 수 있게.
회로도 단순함.
평균값 구했던 거에다가 평균값 – 원하는값 = 목표값 으로 해서, 접기에 사용하는 평균값을 저 목표값으로 사용하면 되는거임.
그럼 이제 진짜 끝났음. 여기까지 온 짬바가 있는 친구들은 의문점이 있겠지만, (B는 고려 안해도 돼??) 일단 이걸로 완성임. 그 의문에 대해서는 뒤에 설명하고…
1. 아코스피어 전도
A그룹을 O로 치환해서 합해서 -1을 곱하고,
B그룹을 합해서 O로 치환해서 서로를 더해줬음.
그럼 A그룹이 많으면 음수가 나오고, B그룹이
많으면 양수가 나올것임.
여기다 조건을 4개 초과로 차이나면 수행하게끔 O < -4, O > 4로 걸어줬음.
4개차이일 때 해버리면 -4 +4 해서 반대쪽이 4개
많게 되거든.
2. 평균값과 목표치 구하고 각 아코스피어와 목표치의 편차 구하기
이것도 엄청 간단하다. 단순히 모두 더하고, 나누고, 빼고가 끝임.
3. 위에서 구한 편차 정보로 접기 수행하기
4. 완성된 최종 모습
이것만으로도 충분히 실사용이 가능한 수준의 아코스피어 밸런서가 됨.
결과가 퍼펙트하고 최선의 속도로 빠르게 밸런싱되는건 아니지만 말이야.
행렬이나 수식 동원하거나 완벽한 산술적 조건으로 구하는것보다 밸런싱 결과는 쪼금 나쁘지만, 별 문제가 없는 수준이고
무엇보다 최종적으로 회로로 변환 할 때 접근성은 훨씬 좋음.
자 그럼 아까 다소 의문이 들 수 있었던 문젠데, 왜 접기할때 A나 B각각의 그룹만 고려하지? A맞춘다고 B망가지는건 왜 고려하지 않지?
이거는 결과가 말해주듯 고려하지 않아도 됨.
왜냐면, AB그룹 8종의 모든 아코스피어 차원에서 바라볼 때, A나 B그룹만 단독조건으로 수행하더라도 엔트로피는 무조건 유지되거나 감소하기때문임.
엔트로피가 이해가 어렵다면, 전체 아코스피어 측면에서 목표값과의 편차는 최악의 경우에도 유지되거나, 일반적으로 줄어든다는 말임.
접기를 할때마다 4종의 아코스피어의 상태가 변하는데,
한 그룹에서 2종의 아코스피어에서 편차를 줄이는 방향으로 조건을 고정해놨으므로
최악의 경우 나머지 2종에서 모두 반대방향이 되더라도 전체에서는 편차가 커지지 않고,
확률적으로 그 최악보다는 최소 1개의 아코스피어가 추가로 밸런싱될 가능성이 더 높기 때문임.
따라서 이걸 계속 수행하다보면 목표값과의 편차는 계속해서 줄어들게 된다.
평균값에서 마진을 빼서 목표값을 낮춰주지 않는다면, 그 최악의 경우가 될 확률이 평균값 근처에서 급격히 높아지기 때문에
마진을 빼서 목표값을 실제 평균값보다 낮게 설정한것임.
그리고 이 엔트로피 발상에서 두번째 아이디어가 도출되는데, 이 아이디어는 위에꺼보다 결과가 더 좋음..
그건 다음글에.







댓글 0