Solving Factorio Quality
Factorio 품질 생산 계산하기
Factorio: Space Age의 품질 생산과 재활용 과정을 행렬과 선형 방정식으로 모델링하고, 장기 생산량을 정확히 계산하는 방법을 설명합니다. 저자는 계산을 자동화한 웹 도구와 소스 코드도 공개했습니다.
- 주제
AI 요약
Factorio: Space Age에서는 아이템과 제작법마다 일반(Normal)부터 전설(Legendary)까지 다섯 품질 등급이 생깁니다. 품질 모듈은 제작이나 재활용 과정에서 등급이 오를 확률을 높이고, 재활용기(Recycler)는 아이템을 파괴하면서 대개 재료의 25%를 돌려줍니다. 이 글은 품질 상승과 재활용을 반복하는 생산 라인의 장기 평균 처리량을 계산하는 방법을 설명합니다.
품질 변화를 행렬로 표현하기
각 품질 등급의 아이템 비율을 다섯 항목 벡터로 나타냅니다. 제작·채굴·제련처럼 품질 확률이 달라지는 과정은 벡터에 전이 행렬(transition matrix)을 곱하는 연산으로 표현합니다. 여러 공정을 거친 뒤의 품질 분포는 행렬을 차례로 곱해 구합니다. 품질 변화 확률이 0인 경우에는 등급이 바뀌지 않으므로 단위 행렬을 사용합니다.
이 표현을 쓰면 품질 모듈을 장착한 기계에서 만들어지는 결과뿐 아니라, 등급별로 물건을 걸러 내는 과정도 행렬 연산으로 나타낼 수 있습니다. 예컨대 희귀(Rare) 이상만 추출하고 나머지를 재활용하는 루프를 모델에 넣을 수 있습니다.
무한 반복 대신 장기 평균을 계산하기
재활용 루프를 한 아이템이 몇 번이나 돌지 직접 세면 가능한 반복 횟수가 끝없이 이어집니다. 저자는 개별 아이템의 경로 대신 충분히 긴 시간 동안 각 품질 등급에서 오가는 아이템의 평균 처리량을 계산합니다. 시스템이 동적 평형에 도달하면 유입량과 각 공정의 전환량 사이에 선형 방정식이 성립합니다. 이를 정리하면 가우스 소거법(Gaussian elimination)으로 해를 구할 수 있습니다.
이 방식으로 재활용기가 아이템을 스스로 되돌려주는 ‘세척(Washing)’과, 제작한 제품을 다시 재활용하는 ‘업사이클링(Upcycling)’을 분석합니다. 저자의 예시에서 건설 로봇을 업사이클링하면 전설 등급 로봇을 분당 거의 2대 생산하며, 재료 묶음은 분당 약 309개 소비합니다. 재료 묶음은 비행 로봇 프레임 1개와 전자 회로 2개에 해당합니다. 반면 아이템을 자기 자신으로 재활용하는 방식은 전설 등급을 얻기까지 일반 등급 아이템을 많이 소모합니다.
소행성 재처리와 생산 전략
Space Age의 우주 플랫폼에서는 금속성·탄소질·산화질 소행성 덩어리를 재처리합니다. 저자는 세 종류와 다섯 품질 등급을 조합해 15개 상태를 만들고, 15×15 행렬로 전환 과정을 계산합니다. 소행성 재처리는 입력을 파괴하는 비율이 재활용보다 낮아, 특정 종류의 전설 등급 덩어리만 추출하는 전략이 단순 세척보다 수율이 높다고 설명합니다. 다만 글은 Factorio 2.1 실험 버전에서 ‘Space Casino’ 전략이 더는 가능하지 않다는 댓글도 함께 소개합니다.
반복 연구로 올리는 생산성 보너스에는 +300% 상한이 있습니다. 이 상한은 제작 후 재활용할 때 시작한 재료보다 더 많은 재료가 되돌아오는 상황을 막습니다. 생산성 보너스를 최대치로 맞추면 기계와 모듈을 많이 투입해야 하지만, 재료 손실 없이 일반 등급 제품을 전설 등급으로 바꾸는 계산 결과도 제시합니다.
정확한 계산과 웹 도구
저자는 처음에 Rust와 nalgebra로 계산 라이브러리를 만들었습니다. 부동소수점 근삿값 대신 정확한 유리수 계산을 택했고, 15×15 행렬에서도 오버플로 검사 기능을 켠 i128 정수면 충분했다고 설명합니다. 이후 웹에서 쓰기 편하도록 TypeScript로 다시 구현했습니다. BigInt와 유리수 라이브러리를 사용하고, VanJS와 Vite로 인터페이스를 만들었습니다. 결과물인 factoqual은 품질 업사이클러를 계획하는 계산기이며 소스 코드는 Codeberg에 공개돼 있습니다.
Hacker News 반응
- @hangrybear666 — 전설 등급 아이템을 대량 생산하려면 이렇게 체계적이고 과학적인 접근이 꼭 필요합니다. 저는 재활용 루프를 직접 조작하며 전설 등급 메카 아머를 만들었는데, 그 과정에서 철과 구리를 수백만 개나 낭비했습니다. VRAM이 0GB인 내장 GPU를 쓰는 Linux 개발용 노트북에서도 60FPS로 돌아가서 더 큰 규모로 확장하진 못했지만, 게임 전체가 최적화에 빠져드는 열병 같은 꿈이고 정말 좋습니다.
- @fabian2k — 세척과 업사이클링의 차이가 엄청납니다. 제 경험과도 맞아떨어지고, 그 차이를 수치로 확인할 수 있어 좋습니다. 더 좋은 품질 모듈의 효과가 얼마나 큰지도 수치로 볼 수 있네요. 처음에는 효과가 선형적이지 않아서 과소평가하기 쉽습니다. 글에서 말한 Space Casino는 현재 실험 버전인 Factorio 2.1에서는 더는 불가능합니다. 곧 정식 출시될 것 같은데, Factorio 실험 버전은 다른 게임의 정식 버전만큼이나 안정적이거나 더 안정적이곤 합니다.
- @kabakabakaba — Space Casino가 없어져서 정말 기쁩니다. 터무니없이 효율이 좋아서 게임의 재미를 망칩니다.
- @DanielHB — 조립기 하나에서 제조법을 바꿔 가며 대부분의 아이템을 최고 품질로 만드는 설계를 만들었습니다. 기본 재료를 넣으면 전설 등급으로 제품을 만듭니다. 원하는 아이템마다 약간의 설정이 필요하고, 유체가 두 종류 이상 필요한 공정에는 쓸 수 없습니다. 기본 설계는 파란 회로를 만듭니다. 제조법을 바꾸면 생산성 보너스가 적용될 진행 상황이 사라져서 실용성이 떨어지는 아이템도 많고, 공간도 많이 차지합니다. 그래도 작동하는 모습을 보면 흥미롭습니다.
- @tobytylam — 수식 모드에서 설명 문구를 더 보기 좋게 쓰려면 LaTeX의 \text{}를 사용할 수 있습니다. 예를 들어 $T_\text{products}=...$처럼 쓰면 됩니다.
- @slightlygrilled — Factorio의 난수 생성(RNG)을 악용해 원하는 결과를 항상 얻는 방법을 다룬 흥미로운 글도 있습니다. 정말 대단합니다.
- @Good4boothee — 여기에서 다뤄졌습니다. 솔직히 제목만 보고 같은 글이 다시 올라온 줄 알았습니다.
원문: exyr.org / 번역·요약: Trawling