주흔작 관련 글만 몇번째인지 모르겠지만, 이번이 거의 마지막입니다.

제목은 어그로 끌려고 저렇게 지었고 내용물은 최적화 계산기입니다.

1. 개발 동기

저번 게시물 (http://www.inven.co.kr/board/maple/2304/12637) 에서 황망의 사용법을 다뤘습니다.

그리고 나서 코드를 검토하던 도중, 황망 가격에 0빼기를 시전한 것을 발견했습니다.

음......



미안하다!!!

그래도 아예 쓸모없는 글은 아니였습니다.

황망 가격을 500만 이하에서는 3작황망이 더 좋은 것으로 나타났습니다. 500 이하로 내려갈 때가 많죠.

하여간 그 외에도 주문서 확률과 요동치는 시세, 그리고 쌓이는 교불 등등... 고려할 요소가 매우 많았습니다.

이런 상태로는 더이상 그래프를 계산하는게 의미없다고 판단해, 최적의 전략을 계산하는 것을 우선으로 두었습니다.

그리고 저번의 (상태, 액션)으로 표현 하는 아이디어를 발전시켜, 매우 빠른 속도로 찾아낼 수 있게 되었습니다.

2. 사용법

(아케인무기 15% 기준, 피버 손재주 100 길드스킬, 이노와 순백은 주흔으로, 주흔 가격 2500, 황망50% 300만)

읽는 법

위 이미지와 같이 모든 주문서에 대한 확률, 가격을 입력하면 표 2개가 출력됩니다.

표 2개 중 상단은 황망 미사용, 하단은 황망 사용 상태의 표입니다.

표의 Y축은 성공 횟수, X축은 시도 횟수입니다. 혹은 (성공+실패) 횟수라고도 할 수 있겠네요.

사실 황망은 다 붙인 다음에 하기 때문에, 하단의 표는 8~9행 말고는 별 의미는 없습니다.

상단 표의 (0, 3)은 "이노"가 적혀있습니다. 즉, 첫 3회 시도가 다 실패하면 바로 미는게 이득인 것이죠.

그리고 (3, 8)에서 "황망"이 등장합니다. 3장 이상 붙으면 황망을 써보는게 이노보다 싸다는 것입니다.

가망이 없는 경우, 빠르게 컷하는게 비용이 더 절약된다는 점을 알 수 있습니다.

그리고 렙제가 높아 주흔 1회 시도당 가격이 높아질수록, 더 빠르게 컷해야 하는 경향을 보입니다.

3. 응용

카룻 상,하의 30%


(피버 손재주100 길드스킬, 주흔 2500, 황망50% 300만)

요약) 4장 이상 붙으면 황망, 황망 쓴 다음 5작이 안되면 이노.

카룻 뚝배기 30%


(조건 위와 동일)

요약) 7장 이상 붙으면 황망, 황망 이후 8작이 안되면 이노.

앱솔무기 15%


(조건 위와 동일)

요약) 평범한 4작, 컷하는 위치만 잘 보면 됨.

앱솔무기 15%, 교불황망


(조건 동일, 교불황망은 0메소로 취급)

(3, 8)이 이노 -> 황망으로 바뀐 것 빼고는 전부 동일.

황망이 0메소기 때문에 3작에서도 한번 더 걸어보는게 유효하다고 해석할 수 있습니다.

* 이 계산은 교불황망이 충분히(3개 이상) 많을 때만 유효함.

앱솔무기 15%, 교불이노


(조건 동일, 교불이노는 0메소로 취급)

이노로 미는데 부담이 없어지므로 4작보다 5작이 더 저렴하게 됩니다.

심지어, 5작에서 황망을 붙인 후에도 6작으로 넘어가는데 실패한다면 이노로 미는게 더 낫습니다.

이런건 5.5작이라고 불러야 할까요? 그리고 첫 업글이 실패하면 바로 밀어버리는 쿨함이 돋보입니다.

* 실제로 이렇게 작을 한다면 소모되는 이노 개수가 어마어마할 것입니다. 교불이노가 20장은 있어야 하겠네요.

4. 결론

그동안 다른 강화 요소 (스타포스, 환불, 큐브)에 비해 주흔에 관해서는 정확한 정보가 부족했습니다.

큐브와 같이 확률이 비공개인것도 아닌데 신기한 일이죠. 가장 오래된 강화 방식인데.

제가 쓴 글들을 통해 더 많은 유저들에게 주흔작에 관한 정확한 정보가 공유되었으면 합니다.

개인적으로, 황망&주흔 해보고 실패하면 이노로 밀어버리는 것을 .5작으로 부르는게 좋다고 생각합니다.

ex)
Q. 카룻 상하의 30퍼작 어떻게 해요?
A. 4.5작 하세요. 자세한건 계산기 써보고.

이런 용어를 통해 더 소통이 원활해지면 정확한 정보가 더 빠르게 확산될 수 있겠죠.

부록. 간단한 작동 원리



완작 상태에서 시작해서, (0, 0)까지 거슬러 올라가며 "완작까지 남은 비용"을 계산한다.

업그레이드 시도시 - (i, j) = (업글확률) * (i+1, j+1) + (1-업글확률) * (i, j+1) + (업글가격)

순백 시도시 - (i, j) = (i, j-1) + (순백가격)/(순백확률)

여기서 생기는 문제가, 순백은 왼쪽 셀을 참조하고 업글은 오른쪽 셀을 참조해서 순환참조가 발생하는 것이다.

이를 해결하기 위해, (i, j+1)항에 순백 식을 대입해서 정리하면

업그레이드 시도(우측에 순백) - (i, j) = (i+1, j+1) + ((1-업글확률)/(업글확률)) * (순백가격)/(순백확률) + (업글가격)/(업글확률)

이렇게 정리가 되므로 순환참조를 없앨 수 있다.

또 하나의 순환참조는 이노센트에서 발생한다.

이노센트 시도시 - (i, j) = (0, 0) + (이노가격)/(이노확률)

(i, j)의 값 또한 (0, 0)에 영향을 미치므로 루프가 생길 수 밖에 없다.

이를 해결하기 위해서는



(0, 0)에서 시작한 작이 이노센트로 귀결될 확률을 따로 계산한다.

그렇다면 (0, 0) = (1-이노센트로 갈 확률)*(0, 0) + (이노센트로 가지 않을 때 기대값)

(0, 0) = (이노센트로 가지 않을 때 기대값) / (1 - 이노센트로 갈 확률)

단순하게 말하자면 이노 1장도 안쓰고 작했을때 드는 비용을, 그게 가능할 확률로 나눈다는 것이다.



그렇게 해서 앞의 2개의 표를 모두 이용해 최종 결과를 얻을 수 있다.

(0, 0)에 적힌 70253.69(= 약 7억)가 우리가 원하는 값이다. 

모든 상태에 대한 액션이 정해지면, 평균 비용을 계산하는 데 수백번의 연산으로 끝내는 알고리즘을 만들어냈다.

기존 시뮬레이션으로는 거의 수백억 번의 연산으로 부정확한 값을 뽑던게 크게 개선된 것이다.

이로써 가능한 대부분의 액션 테이블을 계산해볼 수 있으므로, 전부 돌려보고 최소값을 찾으면 목표를 달성한다.

---

이번에는 세줄 요약 필요없겠죠?

최종 목표는 최적화 표를 먼저 뽑고, 거기서 그래프를 뽑아내는 것인데 언제 가능해질지는 모르겠습니다.

당분간 그래프는 어디까지나 근사치로 참고하는 정도로만 쓰는게 좋아보입니다.

140제 이상 부위별, 주문서별 주흔 소모 개수를 제보 받습니다.

이상하게도 그게 정리된 글이 보이지 않아 매우 불편합니다. UI를 개선하기 위해 도움 부탁드립니다.

긴 글 읽어주셔서 고맙습니다.