def test_game_not_square_saddle(): not_square_saddle = [[1, 2, 3], [1, 1, 1]] # Прямоугольная и седловая точка p = [1 / 2, 1 / 2] q = [1, 0, 0] price = 1 p1, q1, price1 = nash_equilibrium(not_square_saddle) for k in range(2): assert frc(q1[k]).limit_denominator(1000) == frc( q[k]).limit_denominator(1000) assert frc(p1[k]).limit_denominator(1000) == frc( p[k]).limit_denominator(1000) assert frc(q1[2]).limit_denominator(1000) == frc( q[2]).limit_denominator(1000) assert frc(price1).limit_denominator(1000) == frc(price).limit_denominator( 1000)
def test_game_not_square_not_saddle2(): not_square_not_saddle = [[-1, 2], [-2, 4], [3, 1]] # Прямоугольная и не седловая точка p = [0, 1 / 4, 3 / 4] q = [3 / 8, 5 / 8] price = 7 / 4 p1, q1, price1 = nash_equilibrium(not_square_not_saddle) for k in range(2): assert frc(q1[k]).limit_denominator(1000) == frc( q[k]).limit_denominator(1000) assert frc(p1[k]).limit_denominator(1000) == frc( p[k]).limit_denominator(1000) assert frc(p1[2]).limit_denominator(1000) == frc( p[2]).limit_denominator(1000) assert frc(price1).limit_denominator(1000) == frc(price).limit_denominator( 1000)
def test_game_not_square_not_saddle(): not_square_not_saddle = [[-1, -2, 3], [2, 4, 1]] # Прямоугольная и не седловая точка p = [1 / 5, 4 / 5] q = [2 / 5, 0, 3 / 5] price = 7 / 5 p1, q1, price1 = nash_equilibrium(not_square_not_saddle) for k in range(2): assert frc(q1[k]).limit_denominator(1000) == frc( q[k]).limit_denominator(1000) assert frc(p1[k]).limit_denominator(1000) == frc( p[k]).limit_denominator(1000) assert frc(q1[2]).limit_denominator(1000) == frc( q[2]).limit_denominator(1000) assert frc(price1).limit_denominator(1000) == frc(price).limit_denominator( 1000)
def test_game_saddle2(): saddle2_test = [[2, 2], [2, 2]] # Седловая точка 2 p = [1 / 2, 1 / 2] q = [1 / 2, 1 / 2] price = 2 p1, q1, price1 = nash_equilibrium(saddle2_test) for k in range(2): assert frc(q1[k]).limit_denominator(1000) == frc( q[k]).limit_denominator(1000) assert frc(p1[k]).limit_denominator(1000) == frc( p[k]).limit_denominator(1000) assert frc(price1).limit_denominator(1000) == frc(price).limit_denominator( 1000)
def test_game_saddle(): saddle_test = [[1, 2], [3, 4]] # Седловая точка 1 p = [0, 1] q = [1, 0] price = 3 p1, q1, price1 = nash_equilibrium(saddle_test) for k in range(2): assert frc(q1[k]).limit_denominator(1000) == frc( q[k]).limit_denominator(1000) assert frc(p1[k]).limit_denominator(1000) == frc( p[k]).limit_denominator(1000) assert frc(price1).limit_denominator(1000) == frc(price).limit_denominator( 1000)
def test_game_fake(): fake_test = [[3, 1], [1, 3]] # Тест Миши p = [1 / 2, 1 / 2] q = [1 / 2, 1 / 2] price = 2 p1, q1, price1 = nash_equilibrium(fake_test) for k in range(2): assert frc(q1[k]).limit_denominator(1000) == frc( q[k]).limit_denominator(1000) assert frc(p1[k]).limit_denominator(1000) == frc( p[k]).limit_denominator(1000) assert frc(price1).limit_denominator(1000) == frc(price).limit_denominator( 1000)
def test_game_internet(): internet_ex = [[3, 6, 1, 4], [5, 2, 4, 2], [1, 4, 3, 5], [4, 3, 4, -1]] # Тест из интернета p = [1 / 8, 25 / 52, 19 / 52, 3 / 104] q = [1 / 8, 37 / 104, 23 / 52, 1 / 13] price = 3.2596153846153846 p1, q1, price1 = nash_equilibrium(internet_ex) for k in range(4): assert frc(q1[k]).limit_denominator(1000) == frc( q[k]).limit_denominator(1000) assert frc(p1[k]).limit_denominator(1000) == frc( p[k]).limit_denominator(1000) assert frc(price1).limit_denominator(1000) == frc(price).limit_denominator( 1000)
def test_game_task(): task_test_matrix = [[4, 0, 6, 2, 2, 1], [3, 8, 4, 10, 4, 4], [1, 2, 6, 5, 0, 0], [6, 6, 4, 4, 10, 3], [10, 4, 6, 4, 0, 9], [10, 7, 0, 7, 9, 8]] # Тест из задания прака p = [0, 4 / 31, 3 / 31, 27 / 62, 21 / 62, 0] q = [0, 0, 257 / 372, 9 / 62, 55 / 372, 1 / 62] price = 151 / 31 p1, q1, price1 = nash_equilibrium(task_test_matrix) for k in range(6): assert frc(q1[k]).limit_denominator(1000) == frc( q[k]).limit_denominator(1000) assert frc(p1[k]).limit_denominator(1000) == frc( p[k]).limit_denominator(1000) assert frc(price1).limit_denominator(1000) == frc(price).limit_denominator( 1000)
def correct_output(a, s1, s2, price): r, c = a.shape # Размеры матрицы ldconst = 1000 # Максимальное значение в знаменателе ssize = max( s1.size, s2.size) # Наибольшая длина (при прямоугольной игровой матрице) l_s = np.ones(ssize, dtype='int') l_a = np.ones(c, dtype='int') if s1.size < s2.size: for i in range(s1.size): if len(str(frc(s1[i]).limit_denominator(ldconst))) > len( str(frc(s2[i]).limit_denominator(ldconst))): l_s[i] = len(str(frc(s1[i]).limit_denominator(ldconst))) else: l_s[i] = len(str(frc(s2[i]).limit_denominator(ldconst))) for i in range(s1.size, s2.size): l_s[i] = len(str(frc(s2[i]).limit_denominator(ldconst))) elif s1.size > s2.size: for i in range(s2.size): if len(str(frc(s1[i]).limit_denominator(ldconst))) > len( str(frc(s2[i]).limit_denominator(ldconst))): l_s[i] = len(str(frc(s1[i]).limit_denominator(ldconst))) else: l_s[i] = len(str(frc(s2[i]).limit_denominator(ldconst))) for i in range(s2.size, s1.size): l_s[i] = len(str(frc(s1[i]).limit_denominator(ldconst))) else: for i in range(ssize): if len(str(frc(s1[i]).limit_denominator(ldconst))) > len( str(frc(s2[i]).limit_denominator(ldconst))): l_s[i] = len(str(frc(s1[i]).limit_denominator(ldconst))) else: l_s[i] = len(str(frc(s2[i]).limit_denominator(ldconst))) for j in range(c): for i in range(r): if len(str(a[i][j])) > l_a[j]: l_a[j] = len(str(a[i][j])) for i in range(r): print(end=" | ") for j in range(c): print(str(a[i][j]).rjust(l_a[j]), end=" | ") print() print("\n Price оf the game: ", frc(price).limit_denominator(ldconst)) print("\n | p || ", end="") for i in range(0, r): print(str(frc(s1[i]).limit_denominator(ldconst)).rjust(l_s[i]), end=" | ") print("\n | q || ", end="") for i in range(0, c): print(str(frc(s2[i]).limit_denominator(ldconst)).rjust(l_s[i]), end=" | ") print("\n\n")
print("Saddle point: ", min) p, q, price = fixed_solution(mtr, mins, maxs, min) else: # Иначе (не) "симплекс" print("No saddle point") p, q, price = mixed_solution(mtr) correct_output(mtr, p, q, price) # Красивый вывод spectre_vizual(p) # Визуализация p spectre_vizual(q) # Визуализация q return p, q, price # Настройки, чтобы вывод был аккуратным np.set_printoptions( precision=6, suppress=True, formatter={'all': lambda x: str(frc(x).limit_denominator())}) # Ручные тесты для отладки akr = [[3, 6, 1, 4], [5, 2, 4, 2], [1, 4, 3, 5], [4, 3, 4, -1]] # Тест из интернета task_test_matrix = [[4, 0, 6, 2, 2, 1], [3, 8, 4, 10, 4, 4], [1, 2, 6, 5, 0, 0], [6, 6, 4, 4, 10, 3], [10, 4, 6, 4, 0, 9], [10, 7, 0, 7, 9, 8]] # Тест из задания прака fake_test = [[3, 1], [1, 3]] # Тест Миши saddle_test = [[1, 2], [3, 4]] # Седловая точка 1 saddle2_test = [[2, 2], [2, 2]] # Седловая точка 2