완제품으로 품질작 돌리다가 특정 재료만 너무 많이 쌓여서 막힐 가능성은 없을까?
3줄요약
- 버퍼 크기와 상관없이 반드시 막힌다.
- 근데 그 전에 원자재 고갈난다.
- 안전한 정도는 버퍼 크기의 제곱에 비례한다.
밑에는 쌩으로 수학임
아퀼로 가려고 품질작 준비하다가 문득 든 생각인데
이게 아마도 표준적인 품질작 루프다. (일반등급 재료 입력은 적당해 통제해야 할거임)
품질1 생산물을 품질 재활용기로 갈아서 품질 2 재료를 얻은 뒤, 이를 소모하는 구조를 가지고 있다. 한 단계 더 단순화하면
생산물을 갈아서 재료를 얻고, 버퍼를 거쳐 다시 물건을 생산한다.
그런데 재활용기 갈갈이를 하다 보면 확률적으로 아이템을 내뱉는 경우가 있고, 따라서 재료의 불균형이 발생할 수 있다. 예를 들어보면,
벨트 1개를 재활용기에 넣었을 때 1/8 확률로 철판 1개, 1/8 확률로 톱니바퀴를 준다. 또한, 두 확률은 독립적으로 독립적으로 작동한다.
D를 버퍼에 들어가 있는 [톱니바퀴 수] - [철판 수]라고 정의한다.
매 스텝마다 재활용기를 1번 돌리는 과정을 반복한다면, D는 확률론에서 말하는 random walk가 된다.
D의 절댓값이 버퍼의 크기를 x를 초과하는 순간 문제가 생긴다. 이 사건이 최초로 발생하는 시간(hitting time) t를 고려한다.
적당히 근사를 해 줬을 때, 알려진 사실은
1. t가 무한대일 확률은 0. 즉, 충분히 긴 시간이 흐르면 버퍼의 크기 x와 무관하게 버퍼는 반드시 막힌다.
2. 스텝 하나에서 D 변위의 표준편차가 σ라면, t의 기댓값은 E[t] = x^2/σ^2다.
즉, 버퍼의 크기를 2배로 늘리면 안전도가 4배 정도 늘어난다.
- 벨트의 경우 p_1=p_2=1/8, σ^2 = p_1(1-p_1) + p_2(1-p_2) = 7/32이다. 즉, t/x^2 = 32/7 ≈ 4.57을 기대할 수 있다.
- 재료가 3개 이상인 경우는? gemini한테 야매로 물어보니까 E[t] ~ x^2/σ^2인건 동일하고, 비례 계수도 1에서 크게 벗어나지는 않는 것 같다. 진위확인은 안된다.
정말로 그런가?
팩토리오의 유사난수생성기는 정말로 그럴듯하게 작동하며,
숨겨진 최적화나 버그 등으로 독립성이 깨지지는 않을까?
hitting time t를 실제로 측정해보자. 버퍼 내용물을 읽어서 D가 설정된 버퍼 크기를 벗어나는 순간 t를 기록한다.
0eNrt3Utu40Yex/GrBARmk1CBWMXiw0B2waxmm5VhCLRUbRFNkRqSsmM0fIDcYhYzF5uTTJWop01bKkua9rfhrBiRqioWH78/affH37zbYqHndV623tU3Lx9XZeNdXX/zmvyuzAr7WZnNtHfltYv6thq0dVY286puB7e6aL0n38vLif7Tuwqe/J4vZXXeTme6zceDcTW7zcusreqdb4mnG9/TZZu3ue76Xf7P46hczG51bZr1103l5Ze8NKsG46luWs/35lVjvlaVtjvTlJTqV+V7j97VIAjkr2rZSfeVUaPbNi/vGrtprWfVvR4tzLqi1bWejPJWz8yqL1nRaN/rPu4Gs971/Z32vXG1sPMVDIe+N6smyz1tB4XOlgPbzMjNk52UZ3sk/P0ZLapsYj7v2Z94f28mea3H3Qah77WPc9tGtWjnC3scXvQj/TePXE9/yfP52+2xp4dw00OdTbL6QJPBssl/LrLCtGG+U+g7XZqvPfYNXjkPPnUcfOTaQzh07CF27iFw7CHZ9DDR49ycRbsXWU/7Yv9Y7J9Q5spv66oY3eppdp+bBsy3Vs2OzLrJsqnlFbT7f9fm+u3OweUVs7yczWU02vls566wOmnv87o154G3GX63xeAP72n/LnJg+3+Y7c011jMzqfPcC8e5D4b+2ze5nj7kugdx5PxvW352CL7kddOOXtxu87oqB3c6qwcPU60Le6NttP3mK5vOi6zVdqtqruusG4o38NaHdHT0kfjdHIm+4xAEzgdCuh4I4dxFuO3CLPaOW57SqHyl0e0Ns2mz8ddBXja6bntv/qHaH+PeNNhdPvJGGqj39SlP6TNyvC9FrtfFEfell9fIgVN4XFTjr/ZaMGOdZ/VyrFfef//6l+fvNTUqdftQ1V9XxcTEu2rrhakb7mqty1UVsWlFj1a9ZuVkOVWOg/q99xI+fFt8sRf/ObgXq/JntRt2n57+XwP+o2fA/37PgPunfT+iPPcz4pgjflryvd5V32Hpz7wgdk+kzZU3PHciHbvDq3PFPne02bKo3k+jX96RRqvG+2dpWzSZfX0cF/23wmRz830xLbO8ru1kdCfBsffE1P3gJBcrFw7Mn87G02OOzc/vODZd2+bIeKb4eDT38IluxnU+XzX5dzvSn6b58nntpzaf6b7ZFNvia5I3tqHBPCt10TeL6fNHkL6Zs3ceM3Hr577N7J1yZm+nTQzX//Xcl+1z6rjr6UDLwm7b6j9Ni971aqNBt+639SY3y+k68/iD84w/ODz+4CLjP23Yw8PDHpph35itsuIhe2xGzbR6WCfSy3N3WxLfLoo3CzI1fKMITPrvPfsvMNavIvzXnhB2Gymrerbc/73J+m0ZoAuTbJuGX9szsVNrmsZffVOjhgdrZSGd75cq+F73yzfCbHvh7N44/3bmUBPh8efUzksGdUKRL9S7ujz6ueKY87h7fD3rKRwdHSy7e/XdgiVg35jPFIxH3qEvEIzpWcafHh5/epnxJ2cZf3J4/Mllxh+fZfzx4fHHlxl/dJbxR4fHH11m/Oos41eHx68uM/7wLOMPD48/vMz45VnGLw+PX15m/AL+YATP3wCev/D4hacvPHzh2QuPXnjywoNX/CAvJD/fR57+PtL9x0ZKftg3bRd+z7b94VHWNHp2W+Tl3WCWjad5qc3V3DdVz1/h9r/sMhOYz3t/16xbM3rxjqtveOnxb6/k9397lf4QxRu7dmOXbuzKjV24ses2dtnGrto+i7aTizbp/tunSn3Qou2yJZt0+HH727//2Ne4OL7gUh+g4ErJBVeakAuuNCYXXGlELrhSRS640pBccKWSXHClglxwpQG54ErRP5pK0FmboLM2QWdtgs7aBJ21CTprE3TWJuisTdBZm6CzNkZnbYzO2hidtTE6a2N01sborI3RWRujszZGZ22MztoInbUROmsjdNZG6KyN0FkbobM2QmdthM7aCJ21ETprFTprFTprFTprFTprFTprFTprFTprFTprFTprFTprQ3TWhuisDdFZG6KzNkRnbYjO2hCdtSE6a0N01oborJXorJXorJXorJXorJXorJXorJXorJXorJXorJXorBXorBXorBXorBXorBXorBXorBXorBXorBXBjwDCsjlYNgbLpmDZECybgWUjsGwClg3AsvlXNv6Kpl/RdhiaDkPLYWg4DO2GodkwtBqGRsM+zbDTzTDnv2mqIse/xSpDd5Ys/pAs2YVRMue/b61i10Ph8JeM4o9iwZKrOXIxR67lyKUcuZIjF3LkOo5cxn1WcadXcbFz6ZC4lg6JcxepaxcOUn36UeBUMptKRlPJZCoZTCVzqWQslUylkqFUMpNKRlLJRCoZSCXzqGQclUyjkmFUMotKRlHJJCoZRCVzqGQMlUyhkiFUMoNKRlDJBCoZQCXzp2T8lEyfkuFTMntKRk/J5CkZPCVzp2TslEydkqFTMnNKRk7JxCkZOCXzpmTclEybkmFTMmtKRk3JpCkZNCVzpmTMlEyZkiFTMmNKRkzJhCkZMCXzpWS8lEyXkuFSMltKRkvJZCkZLCVzpWSslEyVkqFSMlNKRkrJRCkZKCXzpGSclEyTkmFSMktKRknJJCkZJCVzpGSMlEyRkiFSMkMKRkjBaBXYrAKTVWCxCgxWgb0qMFcF1qo+saqTsapw6CpJRUNHSSoMnLsIXLsQR2NVu21/T0qTW5NwSxJuRcItSLj1CLcc4VYj3GLksxY5vRZx5s8j4VoohM5dSNcu1PG1iPwYcCaXzeSimVwykwtmcrlMLpbJpTK5UCaXyeQimVwikwtkcnlMLo7JpTG5MCaXxeSimFwSkwticjlMLobJpTC5ECaXweQimFwCkwtgcvlLLn7JpS+58CWXveSil1zykgtecrlLLnbJpS650CWXueQil1zikgtccnlLLm7JpS25sCWXteSillzSkgtacjlLLmbJpSy5kCWXseQillzCkgtYcvlKLl7JpSu5cCWXreSilVyykgtWcrlKLlbJpSq5UCWXqeQilVyikgtUcnlKLk7JpSm5MCWXpeSilFySkgtScjlKLkbJpSi5ECWXocQilFjuCas9YbEnrPWEpZ6w0hMWesI6T5/M0+nMU7Tp4HZRfB3kZaPr1qzpAZLCN/ClQPQ1Hm8az8sveWnWDcZT3fTSTup56+uvjBrdtnl519hNaz2r7vVoYdYVZph6MspbPWtW+9c3huR4AUp9BI2SWpxQaxNqaUKtTKiFCbUuoZYl1Krksyg5vShJj8/s+COojVSzkSo2Ur1GqtZItRqpUiPVaaQqjVSjkSo0Un1Gqs5ItRmpMiPVZaSqjFSTkSoyUj1GqsZItRipEiPVYaQqjFSDkSowUv1Fqr5ItRep8iLVXaSqi1RzkSouUr1FqrZItRap0iLVWaQqi1RjkSosUn1Fqq5ItRWpsiLVVaSqilRTkSoqUj1FqqZItRSpkiLVUaQqilRDkSooUv1Eqp5ItROpciLVTaSqiVQzkSomUr1EqpZItRKpUiLVSaQqiVQjkSokUn1Eqo5ItRGpMiLVRaSqiFQTkSoiUj1EqoZItRCpEiLVQaQqiFQDESogQv/5JfRfk0B/ORb6uz7QH11C38RCHyyhOflJCznSQje+95DX2qo/16Ev/MQXN/514oe+eRawiybChS/Eenn7eeQHdll2y8I3zzxht2y2SbttYrtN3G2T+tIX0g/MsnmMDnwRdcvSLsc7y5vPzXi6duxqXw67z003vuzGYFf7shubXe3LcLmNtOMMV5+HdrnbLfs1X3Zt2tV+qLrlxC7bz810WC3RWo/FQs/rvLQS472um+XBVpFIVSjCJI2TUKqnp/8BQXEniA==
한번에 1개씩 하면 너무 느리니 배속걸고 병렬로 돌린다.
최종 값은 스크립트로 읽어온다.
제작 속도를 감안해서 대충 틱 수를 생산 횟수로 단위변환해주면
진짜로 딱 맞는 포물선이 나온다. 심지어 아까 예측했던 t=4.57x^2와 일치한다.
이제 이 모델을 써서 그대로 예측을 해보자.
재료의 스택 수가 100이므로
강철 상자 1개에 4.8k개의 아이템을 집어넣을 수 있다.
즉, 방치된 버퍼 하나가 평균적으로 벨트 105M개 갈갈이를 감당할 수 있다.
전설작 수율이 1%라면 1M 개의 전설 벨트를 뽑을 동안 공장이 멀쩡히 돌아간다는 뜻이다.
정 불안하면 봇 베이스로 굴린 뒤 노란상자 도배만 해줘도 웬만해선 안 터질 듯 싶다.
+ 계산 몇개 더
재활용기 레시피에서 정수부는 항상 고정된 값을 반환하고, 소수부만 확률적으로 동작한다. (위키피셜)
따라서 파칩 1개를 갈면 생산성과 무관하게 녹칩 5개, 1/2 확률로 적칩 1개가 나온다.
적칩 1개는 녹칩 -10개와 동등하므로 이를 1/2 확률로 녹칩 5개, 1/2 확률로 녹칩 -5개로 해석할 수 있다.
같은 이유로 버퍼의 크기가 100일 때 막히는 조건은 녹칩 100개 또는 녹칩 -1000개이다.
유효 범위가 [-a,b]로 비대칭적이기 때문에 통계량이 좀 달라지는데
- E[t] = ab/σ^2
- D > -a보다 D > b에 먼저 진입할 확률 p_+ = a/(a+b)
계산해보면
a = 1000
b = 100
σ^2 = 25^2 * 1/2 + 25^2 * 1/2 = 25
탈출 시간의 기댓값 E[t] = 4e3
빨칩 말고 녹칩 때문에 막힐 확률 p_+ = 91%
따라서 파칩 1개의 부하분은 mk1 벨트의 11.4배로 볼 수 있다.
이 경우에도 평균적인 수용 시간이 버퍼 크기의 제곱에 비례한다는 성질은 그대로 유지된다.
청칩과 적칩의 1스택 크기가 200이므로, 강철 상자 1개에 9.6k의 재료를 수용할 수 있다.
따라서 강철 상자는 청칩 4e3 * (9600/100)^2 = 37M개를 갈갈이할 동안 버틴다.
실측값 E[t] = 6160 ± 840 (버퍼 크기 100)
재료 3개에 비대칭 조건까지 섞이면 계산이 좀 많이 어려운 것 같다. 실측은 일단 전설작부터 해보고 나서 돌릴듯
3줄요약 까지 이해했어요
주딱이 청사진 텍스트 그대로 올리면 알바삭 위험 있다 카던데
ㅇㅎ
ㅇㅇ그럴 확률이 잇긴한데 겜하면서 크게 신경쓴적은 없는듯
강철 상자 하나로 웬만한건 해결되고 재료 가짓수 4가지씩 되는 애들은 한두번 버퍼이슈 생겻엇던 거 같음
예시라고는 하지만 왜 하필 품질작 대상이 벨트야 ㅋㅋㅋ
계산이 가장 단순해서
좋은 예시가 맞는지 모르겠네. 벨트는 재료를 1:1로 소모하는 제일 안전한 품목이고 파칩처럼 녹칩/빨칩이 20:2로 나오는 경우는 훨씬 빨리 막힐듯? 거기에 생산성 300퍼 받아서 실전에서도 많이 쓰는 업사이클링이고
버퍼가 충분히 크면 막힐 확률이 매우 낮다는 걸 머리로는 알지만 버퍼가 넘치는 경우 갈아없애주는 부분이 없으면 마음이 불편함...
갈아 줘야됨 내 공장은 지구가 멸망해서 사람이 한명도 안남더라도 자동으로 돌아가야함
@ㅇㅇ(117.111) ㄹㅇ
물건따라 다름 3단계 모듈같은 경우는 재료가 중구난방이라 버퍼 한두개로도 안됨
추가 계산 ㄱㅅㄱㅅ 생각만큼 많이 차이나지는 않네
미친놈미친놈미친놈
버퍼 가득채우면 남는거 버려야됨 대가리로는 가득차기 전에 겜 끝나는거 아는데 마음이 시킴 내가 비명횡사해도 공장은 돌아가야함