지난 밤에 토막글로 언급했던 계산기의 소스코드를 대강 훑어봤습니다.
@minaraishi 님이 제작한 계산기(https://designedfor.sakura.ne.jp/nikuma-n/)에서 주된 문제점은 판정 차이에 따른 점수 변동을 전혀 고려하지 않았다는 점이었고, 이때문에 사실상 퍼펙트 기반 스코어 특기의 고평가, 판정강화 특기 및 SIS 트릭의 미적용이 일어나고, 최종적으로 실질적인 편성에서는 오차가 제법 일어났습니다. 거기에 더해 SIS에 의한 상호 가산효과를 고려하지 않은 채 카드를 추려내고, 이후에 최적의 SIS를 추가하는 방식이었기 때문에 SIS의 상호 가산효과에 따른 작은 변동도 무시되었구요. 후자의 오차는 상당히 작아서 스코어 UR을 투입하는 단계에서는 무시해도 상관없지만, 전자는 차이가 꽤나 났습니다.
레딧의 Hentyclopedia 님이 제작한 계산기(https://llsifteambuilder.herokuapp.com/build_team/en)는 디테일한 부분을 좀 더 신경썼지만, 아이디어는 유사합니다. 각 카드의 특기와 수치화, 슬롯 수에 따른 최적의 SIS배치를 기준으로 카드를 서열화하고, 레어도를 기준으로 사용 가능한 센터 스킬의 종류를 추려내고, 각 센터 스킬과 해당 카드를 기준으로 일정 수(about에선 12장이라고 언급하고 있지만, 소스코드를 살펴보면 15장)의 후보를 추출, 그 안에서 적절한 연산을 통해 가장 높은 점수를 낼 수 있도록 9장의 카드를 추려냅니다. 소지한 SIS 수에 따라 부족분을 점수 감소가 적도록 하향 조정하면서 장착하고 이를 통해 점수를 산출, 가능한 센터 스킬들에 대해 모두 이런 연산을 반복하고, 가장 점수가 높은 결과를 출력합니다. 그리고 편성된 9장을 기준으로 각 종류별 게스트에 대해 추가적으로 점수를 계산하고 가장 높은 결과를 출력합니다.
일반적으로는 딱히 문제가 없고, 오차가 발생하더라도 상당히 미미하기 때문에 대부분의 경우에는 충분합니다. 판정강화에 따른 퍼펙트 기반 스킬의 상승효과라든지, 판정강화 특기가 일정량 이상 편성되었을 때 SIS 트릭의 사용 가능성에 대해서도 배제하지 않고 제대로 처리하고 있습니다. 사용자의 99%는 최적의 편성 혹은 오차가 나도 랭킹 순위를 크게 바꾸지는 못하는 정도 안에서 매우 좋은 편성을 해줍니다.
그러나 한 가지 오차가 크게 벌어지는 경우가 있는데, 극단적인 트릭 편성이 일반적인 베일, 크로스, 아우라 기반 편성보다 훨씬 우위에 서는 경우에는 이런 편성을 제대로 잡아내지 못한다는 점입니다. 예를 들어 모두 4슬롯인 속성값 4900대 스코어 SR 9장, 4800대의 판정 SR 9장이 있다고 한다면, 전부 트릭을 장착하고 판정강화 SR 만을 쓰거나, 1~2장의 카드만 스코어 SR로 교체하는 것이 결과적으로 가장 높은 점수를 냅니다. 그러나 이와 같은 알고리즘을 사용하면 판정강화 카드는 후보에 들어가지 못하게 되고, 자연히 트릭 기반 편성보다는 베일 기반 편성을 우선하게 되어서, 최종적으로 툴이 출력해주는 편성은 스코어 SR 9장에 베일 9개를 장착하는 것이 됩니다.
어쩌면 고려할 필요가 작다고 판단한 것일 수도 있는데, 요즘 스코어링 트렌드는 스코어 UR에 특기 레벨을 몰아주는 것으로 흐르고 있고, SIS 트릭을 강력하게 사용하기 위해서는 점수 특기 대신 판정강화 특기를 넣거나, 점수 특기에 비해 투입 경험치 대비 결과물이 훨씬 못한 판정강화 카드에 특기 경험치를 투입해야 하기 때문입니다.
이를 고려하고 해결하려고 하더라도 이 경우만을 생각해서 SIS 트릭 편성을 위한 후보의 수를 늘리게 되면 연산량이 기하급수적으로 증가한다는 점이 발목을 잡습니다. 제가 SIS 자동편성 기능을 넣으려고 하다가도 매번 내려 놓았던 이유가 이것인데, 트릭 편성을 위해서는 최종 결정된 9장이 아니라, 후보까지 전부 포함해서 SIS 최적 편성을 각 경우별로 따지고, 조합에 따른 재계산을 해야 하기 때문에, 연산량이 엄청나게 늘어납니다. 센터 스킬의 결정, SIS 장착방식의 결정에서 경우의 수를 모두 대입하는 방법을 사용해서 연산량이 늘어나 있는데, 또다시 적게는 수 배에서 많게는 수 제곱으로 늘어나게 되면, 편성 버튼 눌러놓고 라면 하나 끓여 먹고 와도 계산이 끝나 있을 지 장담할 수 없게 됩니다. 이에 대해서는 정확도를 다소 포기하더라도 효율을 높이는 방향으로 알고리즘을 개선해야겠지만, 연산량이 크게 늘어나는 것을 피할 수는 없습니다.
사실 절대다수의 사용자는 그걸 따질 필요가 없는 카드 풀을 가지고 있고, 굳이 고려하지 않아도 일반적인 카드 풀에서는 최적 편성 대비 점수 감소폭이 크지 않으며, 고려하는 것이 좋은 상황이라 하더라도 카드 강화에 신경쓰고 있다면 조만간 그 상황을 벗어나게 되기 때문에, 이 부분은 무시하고 툴을 더 가볍고 편리하게 만드는 편이 맞는 것 같기도 합니다.
그 외에 추가적으로 드는 생각은, 스크린 샷을 통해 카드 목록을 작성하는 기능을 넣어서 카드 입력을 단순화하는게 체감효과가 가장 클 것 같은데, 프로그래밍 내려놓은 지 꽤 되어서, 작성 가능한 건 공대생 기초교양 수준의 C, C++ 정도 뿐이라 답이 없네요. 이참에 자바랑 안드로이드 프로그래밍을 처음부터 다시 공부를 좀 해야 하나 싶기도 하고 그렇습니다.
(IP보기클릭)115.160.***.***
(IP보기클릭)124.5.***.***