import numpy as np
def solve_with_optimal_strategy():
target = 5
# win_prob[i][j]: A가 i점, B가 j점일 때 A의 최종 승률
win_prob = np.zeros((target +1, target + 1))
# 기저 조건: 누군가 5점에 도달했을 때
for i in range(target):
win_prob[target][i] = 1.0 # A 승리
win_prob[i][target] = 0.0 # B 승리
# 1. 승률 최적화 (Value Iteration)
for _ in range(100):
new_win_prob = win_prob.copy()
for i in range(target):
for j in range(target):
# A가 이겼을 때 최적 선택
p_plus_A = win_prob[i+1][j]
p_minus_A = win_prob[i][max(0, j-1)] if j > 0 else -1
best_p_A = max(p_plus_A, p_minus_A)
# B가 이겼을 때 최적 선택 (B는 A의 승률을 최소화하려 함)
p_plus_B = win_prob[i][j+1]
p_minus_B = win_prob[max(0, i-1)][j] if i > 0 else 2
best_p_B = min(p_plus_B, p_minus_B)
new_win_prob[i][j] = 0.5 * best_p_A + 0.5 * best_p_B
if np.allclose(win_prob, new_win_prob):
break
win_prob = new_win_prob
# 2. 결정된 최적 전략하에서 평균 라운드 수(E) 계산
# E = 1 + 0.5 * E(next_state_if_A_wins) + 0.5 * E(next_state_if_B_wins)
states = [(i, j) for i in range(target) for j in range(target)]
n = len(states)
A_mat = np.eye(n)
b_vec = np.ones(n)
for idx, (i, j) in enumerate(states):
# A 승리 시 행동 결정
if win_prob[i+1][j] >= (win_prob[i][max(0, j-1)] if j > 0 else -1):
next_A = (i+1, j)
else:
next_A = (i, j-1)
# B 승리 시 행동 결정
if win_prob[i][j+1] <= (win_prob[max(0, i-1)][j] if i > 0 else 2):
next_B = (i, j+1)
else:
next_B = (max(0, i-1), j)
for next_state in [next_A, next_B]:
if next_state[0] < target and next_state[1] < target:
A_mat[idx, states.index(next_state)] -= 0.5
exp_rounds = np.linalg.solve(A_mat, b_vec)
return win_prob, exp_rounds[states.index((0, 0))]
win_p, avg_r = solve_with_optimal_strategy()
print(f"0:0 상태에서의 평균 라운드 수: {avg_r:.2f}")
내가 이글을 찾기위해 수학갤을 어슬렁 거리고 있었다면 믿어줄래?
그래서 뭐 조언 없냐
이거 글쓴이임
@나유타이외다 댓글봤다. 너의 코드 읽었다. 수리적 논리를 이해하기위해선 아주 긴 시간이 필요할것 같다. 그건 포기했다. llm에게 물어봤다. 너는 코드로 각각 매번 승률을 계산해서 최적의 판단을 내리는것을 구현했다. 그런데, 그 알고리즘은, 동점인 상황에서 이긴 주체가, 내 점수를 올리는게 아닌, 상대의 점수를 내리는 상황을 발생시킨다.
@나유타이외다 왜냐하면 너가 구현한 알고리즘으로 인해, 동점일때 승률이 딱 50대50이 되는게 아니라, 50.0000001 vs 49.99999999 이런 상황이 생기는데, 이때, 동점에서 내가 이겼는데 상대의 점수를 깍는것이 미세하게 승률이 높다고 판단하게되는 일이 발생한다.
@둥실라이드 아 맞네 동점일때 뭘 선택하는지 검증을 안해봤구나 내가
@둥실라이드 고맙소 드디어 궁금증이 해결되었소
@나유타이외다 직접짠 코드예요? 내가 모르는 수학이나 알고리즘이 잔득 쓰였던데... 혹시 전공이 뭐예요?
@둥실라이드 중졸인데여?
@나유타이외다 엑ㅋㅋㅋ 과고생인가요?
@둥실라이드 과고는 가려고 했는데 떨어졌음ㅋㅋ
@나유타이외다 그렇군요,, 어떤공부했어요? 아니면 어떤공부하고있어요?
@나유타이외다 아 그리고 ㅈㅅ 동점일때 저런 오류가 생기는게 아니라, 1점 뒤지는 사람이 이겼을때 상대의 점수를 깍는일이 발생함. 원래대로라면 내 점수를 올려야 하는데 ㅇㅇ 잘못썼음
@둥실라이드 그냥 예전에 자료구조 알고리즘 이런거 쬐끔 공부했습니다
@둥실라이드 한번 1e-13 임계값 설정해서 다시 돌려봐야겠네요
@나유타이외다 대단하네요 감사합니다 세상은 넓네요 저도 열심히 할게요!
@둥실라이드 아니에요 오류 이렇게 찾아주셔서 감사합니다 혹시 님은 어떤 일 하세요?
@나유타이외다 전 비전공잔데 수학을 좋아하고 최근에 프로그래밍을 시작했습니다 ㅎㅎ 산넘어 산이네요