Factorio 품질 문제 풀기
요약
본 기사는 게임 Factorio의 품질 향상 및 재활용 순환 공정을 전이 행렬과 선형 방정식을 이용해 모델링하는 방법을 제시합니다. 핵심은 개별 아이템의 순환 횟수 대신 현재 품질 등급별 처리량을 추적하여, 무한 반복 공정을 동적 평형 문제로 접근하는 것입니다. 이를 통해 기존 도구로는 계산하기 어려웠던 복잡한 업사이클링 수율을 정확하게 예측할 수 있는 웹 도구 factoqual을 공개했습니다.
핵심 포인트
- 품질 순환 공정 분석에 전이 행렬과 선형 방정식을 활용합니다.
- 개별 아이템 횟수 대신 품질 등급별 처리량 추적이 핵심입니다.
- 웹 도구 factoqual은 정확한 해를 구하기 위해 TypeScript와 유리수 연산을 사용했습니다.
- 복잡한 업사이클링 수율 계산을 통해 공장 설비 계획의 난제를 해결합니다.
- Factorio의 품질 향상과 재활용 순환을
전이 행렬과 선형 방정식으로 모델링하면, 장기 평균 생산량과 필요한 설비 처리량을 계산할 수 있음 - 핵심은 개별 아이템이 순환한 횟수 대신
현재 품질 등급별 처리량을 추적하는 것으로, 무한히 반복될 수 있는 공정을 동적 평형의Ax = b
문제로 바꿈 - 재활용만 반복하는 방식과 제작을 결합한 방식은 수율이 크게 다르며, 일부 아이템은
**생산성 보너스 +300%**에서 자원 손실 없이 일반 제품을 전설 제품으로 전환할 수 있음 - 소행성 재처리는 종류 3개와 품질 5개를 결합한
15차원 모델로 계산하며, 특정 조건에서 전설 소행성 한 종류의 수율이 신규 투입량의 약 1.4%에 달함 - 이 계산을 수행하는 웹 도구
factoqual을 공개했으며, TypeScript와 유리수 연산으로 반복 근사 대신 정확한 해를 구함
품질 모듈과 재활용이 만드는 순환 공정
-
Factorio는 자원을 채취하고 점점 복잡한 물품을 제작하는 게임으로, 캐릭터의 수작업보다
기계와 물류를 통한 자동화에 초점을 맞춤- 기계의 제한된 모듈 슬롯에 속도 모듈을 넣으면 에너지 소비를 늘려 속도를 높이고, 생산성 모듈을 넣으면 속도와 에너지를 대가로 같은 재료에서 더 많은 제품을 얻음 -
2024년 출시된
Space Age확장팩은 모든 아이템과 제작법에 일반, 고급, 희귀, 특급, 전설의 5개 품질 등급을 추가함- 품질이 높아지면 아이템에 따라 제작 기계의 속도나 생산성 모듈의 생산성 등이 향상됨 -
같은 품질의 재료로 해당 품질의 제품을 직접 만들 수 있지만, 품질 등급을 올리려면 품질 모듈이 필요함
-
품질 모듈은 품질이 한 단계 이상 상승할 확률 (q)를 결정하며, 첫 상승 이후에는 추가 단계마다
10% 확률이 적용됨- 슬롯 4개인 기계의 최대 품질 상승 확률은 24.8%이며, 일반에서 전설로 한 번에 올라갈 확률은 0.0248%임 -
대부분 결정적이던 게임에 무작위성이 들어오는 것을 싫어하는 플레이어도 있지만, 충분히 반복하면 큰 수의 법칙에 따라 확률을 생산 비율로 다룰 수 있음
-
여러 제작 단계를 거쳐도 고품질 제품을 얻는 과정에서는 원치 않는 저품질 제품이 많이 생김
재활용기는 아이템을 파괴하고 대체로 재료의 25%를 돌려주므로, 저장 공간이 가득 차 공장이 멈추는 것을 피할 수 있음- 품질 모듈을 장착한 제작기와 재활용기를 순환시키는 업사이클링은 더 많은 재료를 소비해 원하는 품질에 도달하는 방식임
기존 공장 계획 도구로 어려운 문제
-
게임 밖에서 기록과 계산을 하는 플레이 방식은 드물지 않음
-
Blue Prince는 게임 내 메모 도구 없이 방대한 기록을 요구하며, 공장 게임에서는 대형 스프레드시트나 Factoriolab 같은 전용 도구로 생산 사슬을 모델링함
-
계획 없이 부족한 설비를 추가하는 방식도 가능하지만,
기계 수, 예상 수율, 병목을 미리 계산하려면 품질 업사이클링의 순환 구조가 난제가 됨- 단순한 추측으로도, 기존 도구로도 이 순환을 계산하기 어려움
품질 변화를 전이 행렬로 표현하기
각 아이템의 품질 분포를
5성분 행벡터로 나타내면, 제품 분포는 재료 분포에 전이 행렬을 곱해 구할 수 있음- 특정 품질의 제품이 나올 확률은 같은 등급 또는 더 낮은 등급의 재료에서 해당 품질로 도달할 확률을 합한 값임
-
품질 확률표와 개별 방정식의 계수 배치가 달라 보이는 것은 제품 등급을 세로로 나열했기 때문이며, 행벡터를 쓰면 표와 같은 배치를 사용할 수 있음
품질 전이 행렬은 다음과 같으며, 품질 상승 확률이 0이면 단위행렬 (I_5)가 됨[ \text{products}=\text{ingredients},T_{\text{quality}}(q) ]
[ T_{\text{quality}}(q)= \begin{pmatrix} 1-q&9q/10&9q/100&9q/1000&q/1000\ 0&1-q&9q/10&9q/100&q/100\ 0&0&1-q&9q/10&q/10\ 0&0&0&1-q&q\ 0&0&0&0&1 \end{pmatrix} ]
여러 공정은
행렬의 연속 곱셈으로 계산함- 생산성 보너스 없이 철광석 채굴의 품질 확률 7.5%, 철판 제련 5%, 파이프 제작 10%를 차례로 적용함
- 일반 등급에서 시작한 최종 파이프의 품질 분포는 약 ((0.790875,\ 0.174263,\ 0.029678,\ 0.004467,\ 0.000719))임
‘도박’: 재활용 없이 고품질을 노리기
-
모든 곳에 품질 모듈을 넣어 모든 등급을 동시에 취급할 수도 있지만, 여기서는 작고 독립적인 시스템을 계산함
**도박(Gambling)**은 일반 재료로 품질 모듈을 사용해 제작하고 아무것도 재활용하지 않는 가장 간단하고 효율이 낮은 방식임- 재활용기를 해금하기 전에도 가능하지만, 초기 우주선용 고급/희귀 소행성 수집기 십여 개를 얻으려고 수백 개를 제작하는 등 제한적인 용도에 적합함 -
일반 제품을 다른 곳에서 소비할 수 있으면 더 유용함. 지상에 일반 태양 전지판 수천 개를 설치한다면, 저장 공간이 차기 전에 우주선용 고품질 전지판을 더 많이 얻을 수 있음
-
순환이 없는 단일 공정이므로
예상 품질 분포는 (T_{\text{quality}}(q))의 첫 번째 행과 같음
‘세척’: 재활용만 반복하는 순환
**세척(Washing)**은 재활용 시 재료가 아니라 같은 아이템이 돌아오는 물품을 대상으로 함- 광석처럼 제작법이 없거나 제련/화학 공정처럼 되돌릴 수 없는 경우, 재활용기는 25% 확률로 같은 아이템을 반환하고 나머지는 파괴함
-
품질 모듈을 넣고 반복하면 아이템은 결국 파괴되거나 목표 품질에 도달함
-
품질별 추출과 잔류를
필터 행렬로 나타냄- 희귀 이상을 추출한다면 잔류 필터 (K)의 대각 성분은 ((1,1,0,0,0)), 추출 필터 (E)는 ((0,0,1,1,1))이며 (E=I_5-K)임 -
재활용의 75% 파괴 확률은 벡터에 (1/4)을 곱해 반영하고, 한 차례 순환은 (L=K\frac14T_{\text{quality}}(q))로 표현함
-
아이템은 즉시 추출될 수도, 한 번 또는 여러 번 순환한 뒤 추출될 수도 있어 최종 결과가
무한급수가 됨- 단일 투입 아이템의 품질 분포를 (f)라 하면 추출 분포는 (f\left(\sum_{i=0}^{\infty}L^i\right)E)임 -
각 항이 지수적으로 작아져 수렴하므로 반복 근사도 가능하지만, 평형 방정식을 이용하면 정확한 해를 구할 수 있음
장기 평균 처리량으로 바꾸기
-
필요한 정보는 과거 순환 횟수가 아니라
현재 품질 등급뿐이므로, 단일 아이템의 확률 대신 충분히 긴 기간의 평균 처리량을 계산함 - 신규 투입량 (f), 재활용 반환량, 분배기 통과량 (s), 추출량, 재활용 투입량을 각각 5성분 벡터로 둠 -
분배기에는 신규 투입과 재활용 반환이 합쳐지고, 그 흐름이 추출과 재활용으로 나뉨
-
평형에서 (s=f+sL)이므로
선형 방정식(s(I_5-L)=f)를 얻음 - 표준적인 열벡터 형식에 맞춰 전치하면 (A=(I_5-L)^T,\ x=s^T,\ b=f^T)인 (Ax=b)가 됨 -
가우스 소거법으로 풀고 필터를 적용하면 재활용기 수 산정에 필요한 처리량과 전체 수율을 구할 수 있음
-
필요한 정보는 과거 순환 횟수가 아니라
광석 투입량과 재활용 처리량 계산 예
- 초당 광석 100개를 품질 분포 ((90,9,0.9,0.09,0.01))로 투입하고, 재활용 품질 확률 10%에서 희귀 이상을 추출하는 조건임
- 재활용 투입량은 초당 일반 약 116.1291개, 고급 약 14.9844개임
- 추출량은 초당 희귀 약 1.4985개, 특급 0.1499개, 전설 0.0167개로, 분당 약
90개, 9개, 1개에 해당함 - 일반 아이템만 투입하고 품질 확률 24.8%로 전설만 추출하면, 신규 투입 1개당 전설 산출량은 약 0.000366716개임 - 전설 1개당 일반 입력을 평균
2,726.91개소비하며, 필요한 재활용 처리 용량은 신규 투입 속도의 (4/3)보다 조금 작음
‘업사이클링’: 제작과 재활용 결합하기
**업사이클링(Upcycling)**은 재활용이 재료를 돌려주는 제품에 제작기와 재활용기를 연결하는 방식임- 여러 재료와 수량을 ‘제작 1회분 재료 묶음’으로 묶어 계산함
-
건설 로봇 제작에서 초당 전자 회로 4개와 비행 로봇 프레임 2개를 소비하면, 초당 재료 묶음 2개로 취급함
-
재료와 제품은 시스템의 서로 다른 부분에 존재하므로 각각
5성분 벡터로 계산할 수 있고, 10차원으로 확장할 필요는 없음- 외부에서 임의 품질의 재료와 제품을 모두 투입할 수 있으며, 원하는 품질의 재료와 제품을 각각 추출할 수도 있음 -
고품질 재료가 제품보다 유용하거나, 특정 제품의 순환이 다른 방법보다 재료 품질을 높이는 데 효율적일 수 있음
생산성 보너스와 품질 확률을 별도로 반영함- 제작 전이는 (T_c=(1+p)T_{\text{quality}}(q_c)), 재활용 전이는 (T_r=\frac14T_{\text{quality}}(q_r))임
-
제작과 재활용의 품질 확률은 모듈 구성이나 슬롯 수에 따라 다를 수 있음
-
재료와 제품 각각에 신규 투입량, 총량, 추출량, 다음 공정 투입량을 두고, 제작 산출과 재활용 반환으로 두 흐름을 연결함
-
재료 잔류 필터를 (K_I), 제품 잔류 필터를 (K_P)라 하고 (C=K_IT_c,\ R=K_PT_r)로 두면, 총 제품 흐름 (P)는
**(P=f_P+(f_I+PR)C)**를 만족함- 따라서 ((I_5-RC)^TP^T=(f_P+f_IC)^T)를 풀면 됨 -
구한 총 제품 흐름을 원래 평형식에 대입해 제작량, 재활용량, 재료와 제품 추출량을 모두 계산함
건설 로봇 생산 예
-
일반 재료만 투입하고, 재료는 추출하지 않으며 전설 제품만 추출하는 조건을 사용함
-
생산성 보너스는 0%, 제작과 재활용의 품질 확률은 모두
**24.8%**임 - 재료 1묶음당 전설 제품 수율은 약 0.006464개임 -
일반 제품의 제작 속도
분당 360개가 병목이므로 전체 흐름을 이에 맞춰 조정함 - 분당 제작량은 일반부터 전설 순서로 약 ((360,\ 35.18,\ 12.17,\ 3.44,\ 0.66))개임 -
분당 재활용량은 약 ((270.72,\ 106.81,\ 25.04,\ 6.89,\ 0))개임
-
신규 재료 약 309묶음, 즉 프레임 309개와 회로 618개를 분당 소비해
전설 건설 로봇 약 1.99개를 생산함
생산성 +300%에서의 무손실 전환
-
Space Age의 일부 아이템은 반복 연구로 생산성을 높일 수 있지만, 제작 후 재활용으로 원래보다 많은 재료를 얻지 못하도록
**보너스 상한 +300%**가 적용됨 - 연구 비용이 지수적으로 증가하므로 생산성 모듈도 사용해 상한에 도달하고, 제작기에는 품질 모듈을 넣지 않는 조건을 가정함 -
일반 제품만 신규 투입하고 제작 품질 확률 0%, 재활용 품질 확률 24.8%에서 전설만 추출하면
일반 제품 1개당 전설 제품 1개를 얻음 - 중간 품질 등급들의 처리량이 서로 같아지는 결과도 나타남 -
자원 손실은 없지만, 의미 있는 처리량을 확보하려면 많은 기계와 모듈이 필요함
-
Space Age의 일부 아이템은 반복 연구로 생산성을 높일 수 있지만, 제작 후 재활용으로 원래보다 많은 재료를 얻지 못하도록
‘우주 카지노’: 소행성 재처리 순환
-
Space Age의 우주 플랫폼은 소행성 덩어리를 수집하고 분쇄해 자원을 얻는 작은 공장임
-
자원은 우주선의 연료와 탄약으로 쓰거나, 우주에서 생산한 제품을 행성으로 보내는 데 사용할 수 있음
-
금속질, 탄소질, 산화물의
3종 소행성은 산출 자원과 태양계 내 출현 비율이 다름 -
‘우주 카지노’는 소행성 재처리에 품질 모듈을 적용해 반복하는 방식임
-
한 번 재처리하면 같은 종류가 나올 확률은 40%, 나머지 두 종류는 각각 20%이며, 20%는 사라짐
-
전설 덩어리를 분쇄하면 다른 전설 아이템 제작에 쓸 수 있는 일부 기본 자원을 전설 품질로 얻음
종류 3개 × 품질 5개를 15성분 벡터로 표현하고, 5×5 행렬 9개로 구성한 블록 행렬을 사용함- 종류 변환은 대각 블록 (0.4I_5), 나머지 블록 (0.2I_5)로 구성함
-
품질 변환은 대각 블록에 (T_{\text{quality}}(q))를 배치하고, 종류별 추출 조건도 별도 필터 블록으로 구성함
-
순환 행렬을 (L=K_{15}T_{\text{reprocessing}}^{15}T_{\text{quality}}^{15}(q))로 두면, 세척과 마찬가지로 ((I_{15}-L)^T\text{total}^T=\text{fresh}^T)를 풀면 됨
-
분쇄기는 모듈 슬롯이 2개여서 최대 품질 확률이
**12.4%**이며, 수집기에는 슬롯이 없어 신규 덩어리는 항상 일반 품질임- Nauvis 궤도의 신규 투입 비율을 금속질 (3/6), 탄소질 (2/6), 산화물 (1/6)로 놓고 전설 산화물만 추출하면, 총 신규 투입 1개당 약 0.01398개를 얻음 -
품질이 올라갈수록 소행성 종류의 분포는 빠르게
각각 1/3에 가까워지고, 일반 입력의 종류별 비율은 순환 중 전설 덩어리의 분포에 거의 영향을 주지 않음- 전설 한 종류의 수율은 약 (1/71.5), 즉
**1.4%**로 순수 재활용의 약 (1/2726)보다 높음 - 재처리는 입력의 20%만 파괴하지만 재활용은 75%를 파괴하기 때문임 -
전설 한 종류의 수율은 약 (1/71.5), 즉
다른 순환 전략에도 적용하는 계산법
-
The LDS Shuffle처럼 앞선 분류에 맞지 않는 품질 전략도 있으며, 순환 때문에 계산이 어려우면 같은 방법을 적용할 수 있음
-
여러 아이템 종류의
처리량을 벡터로 나타냄 - 제작과 재활용 같은 선형 변환을 행렬 곱으로 나타냄 -
동적 평형을 행렬 방정식으로 나타냄
-
필요하면
가우스 소거법으로 방정식을 풂 -
여러 아이템 종류의
정확한 계산을 수행하는 웹 도구 구현
- 초기 구현은 Rust와 nalgebra를 사용했지만, 선형 방정식 풀이 기능은 사실상
를 요구함f32
또는f64
-
부동소수점은 실용적으로 충분하지만 각 계산 단계에서 오차가 생길 수 있음
-
행렬 크기와 연산 횟수가 작고 고정적이어서 속도 최적화보다 정확한 계산을 선택함
-
연산이 덧셈, 뺄셈, 곱셈, 나눗셈뿐이므로 입력이 유리수이면 결과도
유리수임- num_rational로 정수 쌍을 이용한 정확한 연산을 구현함 -
오버플로 검사를 켠
i128
이면 15×15 행렬에 충분했고, 5×5에는i64
로도 충분했음
-
매개변수를 바꾸려고 소스 코드를 편집하는 대신
브라우저 GUI를 제공하기로 함- Rust를 WebAssembly로 컴파일할 수 있지만, Rust와 WebAssembly만으로 GUI를 만들기에는 도구가 아직 충분히 좋지 않았음 -
JavaScript/TypeScript GUI와 WebAssembly를 연결하면 많은 매개변수 때문에 연결해야 할 API 범위가 커짐
-
결국 전체를
TypeScript로 재작성함- 내장 BigInt, Factoriolab의 공개 rational 라이브러리, 직접 만든 범용 행렬 라이브러리를 사용함 -
React를 새로 배우는 대신 VanJS로 반응형 UI를 구성하고, Vite로 TypeScript 처리와 저장 시 새로고침을 지원하는 개발 서버를 운영하며, Grebedoc으로 정적 파일을 호스팅함
-
factoqual은 품질 업사이클링 공장을 계획하는
대화형 계산기이며, 소스 코드도 공개되어 있음 - 기존 품질 계산에는 반복 근사 방식이 있었으며,
평형 방정식으로 정확한 해를 구하는 방식이 새로운 접근인지는 확정되지 않았음
AI 자동 생성 콘텐츠
본 콘텐츠는 RSS: GeekNews (한국어)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기