이번에 소개할 청사진은 벨트 유동량 측정기.
이 청사진 자체는 자작이지만, 원리와 다른 원본 청사진은 이미 몇몇년전에 팩토리오 포럼에서 나왔다.
이 청사진도 옛날에 만들어 지금까지 보관하고 있던거지만 지금도 동작한다.
아마 갤에 올리는건 처음이 아닐까 하는데... 올린적 있던가? 검색해보니 없어서 올려본다.
- 사용법 -
1. 측정할 벨트를 "벨트 회로 필터 제거"로 미리 "닦아서" 벨트에 회로를 연결했을 때의 기본값인 "활성화/비활성화"의 체크를 내부적으로 미리 풀어놓고 회로를 연결하면 벨트 흐름이 멈추는 순간이 발생하지 않는다.
"닦는" 건 청사진 들고 벨트에 갖대 대었을 때, 파랗게 표시(이미 건설되어 있음을 알림)되면 전신주는 무시하도록 시프트를 누르고 좌클릭하면 된다.
미터기 전극 꽂기 전에 녹 먼지 한번 닦는거랑 비슷한 느낌으로 하면 됨.
2. 청사진과 조합기들을 적당한 빈공간에 놓고, 가장 뒤쪽에 있는 곱셈조합기의 입력에 벨트의 측정할 위치를 연결한다.
3. 측정할 벨트의 설정을 "벨트 내용물 읽기" & "펄스"로 한다.
4. 어느정도의 시간 이후,(첫 가동 직후, 대략 5~10초 정도 기다려 본다.) 가장 앞쪽의 나눗셈 조합기에 마우스 커서를 올려두고 확인한다.
마지막 조합기에 뜨는 입력신호는 소수점도 어느정도 확인할 수 있도록 10k가 곱해져 있다.
출력신호는 수치 그대로 item/s이다.
5. 사용이 끝나면 조합기를 다 회수하면 된다. 전자공학, 전기공학 하는 사람들 만약 있으면, 멀티미터 같은 기계를 사용하는 느낌으로 쓰면 된다. 다른 분야는 딱히 비유할만한 행위가 떠오르는게 없네...
*. STOP 일정신호조합기를 ON/OFF하는 것으로 신호선이 꽂힌 상태에서 초기화를 할 수 있다.
*. 횡대로 늘어서있는 여러줄의 벨트를 합쳐서 같이 측정할 수 있다. 그러나 같은 라인에는 두군데 이상 꽂지 말자.
*. 여러 종류의 아이템을 동시에 측정할 수 있다.
- 원리 -
지수 이동 평균법 (Exponetial Moving Average)
현재값에 추가되는 신규 값에 가장 큰 가중치를 주어 계속 더하고, 이전값은 가중치를 점점 낮추어 더하는 방법이며, 시간x-가중치y 그래프로 나타내면 각 데이터에 적용된 가중치가 지수모양을 그리기 때문에 지수 이동 평균이라 부른다. (카더라 같은거임. 직접 그려본건 아니다.)
검색해보면 이동 평균의 개념과 원래 수식 표현방식이 나오지만, 팩토리오 식으로 바꿔서 설명해봄.
이동 평균 개념은 생략한다. 궁금하면 알아서 검색해서 공부해보시라.
현재 틱의 평균을 EMA_new,
이전 틱의 평균을 EMA_old,
매 틱마다 들어오는 입력을 input,
샘플가중치를 w라고 하면,
EMA_new = w * input + (1-w) * EMA_old
라고 지수이동평균을 표현할 수 있다.
그런데 팩토리오에서는 새로운 EMA_new를 계산하는건 1틱 = 1/60초 마다 계산이 일어나므로 평범하게 계산하면 최종 수치는 틱당 유동량이 될 것이다.
그러므로 input에 60을 곱해주면 최종 수치가 초당 유동량이 되며, EMA_new는 다음과 같이 된다.
EMA_new = w * 60*input + (1-w) * EMA_old
그리고 원래 w의 정의는 다음과 같다.
w = 2 / (n + 1)
여기서 n은 샘플범위를 나타낸다.
주식같은데서 매일 EMA_new를 계산하면서 대략 2~3일 이내의 영향력을 가진 평균을 원한다면 n=2~3를 사용하겠지만,
팩토리오에서 초당 유동량을 측정하려면 꽤 많은 틱이 흐르는 동안 데이터를 모아야하므로 n은 몇백틱쯤 되는 충분히 큰 값이다.
그러므로 1은 거의 무시되어 w는 다음과 같이 된다.
w ~= 2 / n
근데 샘플범위는 내맘대로 정할 수 있으므로 n을 미리 2배 했다 치고 원래 정의같은거 모르겠고 더 단순하게 바꿀 수 있다.
w ~= 1 / n
이것을 EMA_new에 대입하면 다음과 같다.
EMA_new = 60*input / n + EMA_old - EMA_old / n
그럼 이걸 팩토리오 조합기에서 구현하면 다음과 같다.
조합기가 출력을 내보내는데에는 1틱이 소요되고, 한 네트워크 신호선에 묶인 출력은 자동으로 합산된다는 팩토리오의 회로 네트워크 기본 매커니즘을 기억하면서 보자.
회로 네트워크 기본 매커니즘을 모른다고...?
https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=13800&exception_mode=recommend
념글에 회로 기본 매커니즘 글 하나 있으니 참고해보자.
어쨌든 그러면,
60/n은 어떤값A의 포지션이 되고,
-n은 어떤값B에 대응된다.
만약 샘플범위 n=150틱을 하고 싶으면, (생각해보니 150 입력하면 150틱이 아니고, 300틱이네. 중간에 2 날려버렸으니.)
어떤값A는 60/150 = 0.4,
어떤값B는 -150을 넣으면 된다.
그런데 팩토리오는 소수점 지원이 안되므로, 일단 중간계산을 위해 처음에 큰 수를 곱하고, 최종결과에 그만큼을 다시 나누어야 한다.
10000 정도 곱하면, 어떤값A = 600000/n이 되어,
어떤값A는 4000이 된다.
일단 청사진엔 n=150이 입력되어있다.
만약 아이템이 너무 띄엄띄엄 와서 수치가 너무 출렁거려서 샘플범위를 늘려 n=300을 하고 싶으면,
4000은 2000으로
-150은 -300으로 바꾸면 된다.
청사진에 메모해둔 "샘플범위 2배 ex:음수2배, 양수0.5배"는 그런 의미이다.
■■■■■■■■■■■
청사진 문자열 https://pastebin.com/VkkZ472X
■■■■■■■■■■■
0eNrtWM1u00AQfhVrT4Bs8E8iWks8A0hwQ5W1iSfNCv9pdx0aVTnRA6BKCKmggoJobxxDT32mxnkHdu381bHrOC1QVC6Od9f77cx838yOso9aXgwRJQF3WmH4Ctn7ixmG7JdLQ7lG2mGQTTOyG2BPzvF+BMhGhIOPVBRgX444xQGLQsq1FngcDVREAhf2kG0M1MrNmBLe9YGTttYO/RYJMA/pEoY52FERBJxwApk16aDvBLHfAioOqYBSURQysTsMpA0CUTMfNlXUFy/CPuQSCu1s1VSRcJnT0HNa0MU9InaLLQtYRyy7KRSTCx1CGXdW/OsRymMxM7cr+0ID3O5KxxhIGInFOJahbui6rqIwAoozQ9ADsTmMeRTXhh8MUieCzKfUTFM+dilAsBw+4mYOE9qOCU+HKV1Ly1Z+eUfCrxBgzi1xoU1coFdHX68X/Snm9UL/HGVhmQZclwM/wjQ10UZPNgl3D2ifd0mwm2FHfWFiLFKrQ0PfIYEAQzanMRQwYsgHBTfPR1NqvZAp4zIVZo4pM7+8Iw41S05prNCq3oQ8zBJ5WLXz05gqRL8d6akZzVx6PrrJ9DRK07OCdKuU9EI062o2zfXYbNRl07hlxdbQV6rtzdNZkHVrxrc5P2hm8pXR1eeJUhTMDvE40JI7vKJWxmmw5tfwVuFVXobxYglDn2Ns18J4Wohh6LVAnhWDpDWPMEfGsYM9BhvzmF2KEk12NfZSB6UiD4t+SMyNz35M3p8ryfBk/OHL+Ps7JTk/TU4+XZyPlHvJm+PJ0eH47CgZHijmeDRSYM9Ovh0mb4/lSFWSzx/Fu7g0xei+ABXXDkv5f2zpxnaz2dxq6ItuKY3OX+jiRKC01yK5LzVu1dvaMdcizDhoPAy9pc3WGpvTKpc/tbF+u5hzuGZuzUQAAW554LiEyd+pnBYaoYBdp4uzEsQhbbRzn8wWsm/90IX5qWsJsrItYz72RMXyBBgV1ToKhZ0l3qZVes2Da0h/8vVwfDpUJp8OJgcjJTkZXvwcKUalmo3N1dwRqtLunKR/E9PVEisK97+aUNfVtVmpa3NzXcNeRIGxuyftEsf/V+0/XLWtSnVbReha+o/TOj2R+AgLN3rgzHqakgMHvwBi3qCq
■■■■■■■■■■■
생각해보니 n=150입력하면 150틱이 아니고 300틱이네. 중간에 2 곱하기 날려버렸으니.
왜캐 똑똑하누