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)
Exemple #9
0
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")
Exemple #10
0
        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