Как зациклить лексикографический симплекс метод?

Я знаю, что существует лексикографическое правило для предотвращения зацикливания симплекс метода а также я знаю, что это правило нужно применять к лексикографически допустимой симплекс таблицы (это таблица, в которых первые ненулевые коэффициенты положительны). Но мне известно, что существует способ зациклить лексикографический симплекс метод, для этого нужно подобрать соответствующую лексикографически недопустимую симплекс таблицу.

Как подобрать эту таблицу? (также я знаю, что минимум такая таблица имеет размерность 3 (ограничения) на 7 (переменных)) Есть код:

import pandas as pd
import copy
import math


Bi = [1, 0, 0]
vectorC = [0, 0, 0, 2.2361, -2, 0, -4, -3.6180, -3.236, -3.6180, -0.764]
coeficients_Aij = [
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 0, 0.3090, -0.6180, -0.8090, -0.3820, 0.8090, 0.3820, 0.3090, 0.6180],
    [0, 0, 1, 1.4635, 0.3090, 1.4635, -0.8090, -0.9045, -0.8090, 0.4635, 0.309],
]

def lexicSymplexMethod(matrix_Aij):
Max_Xj = 0
Max_Yi = 0

if not(isTableValide(matrix_Aij)):
    print("There is no solution due to the unlimited function")
    return 1

while matrix_Aij[strNum][Max_Xj] >= 0:
    Max_Xj += 1
    if Max_Xj > xNum:
        print('FIND OPTIMAL SOLUTION')
        return [matrix_Aij, 2]
for Xj in range(Max_Xj, xNum + 1):
    flag = True
    c = 1
    if abs(matrix_Aij[strNum][Xj]) > abs(matrix_Aij[strNum][Max_Xj]) and matrix_Aij[strNum][Xj] != 0 and \
            matrix_Aij[strNum][Xj] < 0:
        while c <= len(matrix_Aij) - 2:
            if not (matrix_Aij[c][Xj] >= 0):
                flag = False
                break
            c = c + 1
        if flag:
            Max_Xj = Xj
#while matrix_Aij[Max_Yi][Max_Xj] <= 0:
while isclose(matrix_Aij[Max_Yi][Max_Xj], 0) or matrix_Aij[Max_Yi][Max_Xj] < 0:
    Max_Yi += 1
    if Max_Yi > strNum:
        print("There is no solution due to the unlimited function")
        return 1
for Yi in range(strNum + 1):
    if matrix_Aij[Yi][Max_Xj] <= 0:
        continue
    if matrix_Aij[Yi][Max_Xj] > 0 and abs(matrix_Aij[Yi][0] / matrix_Aij[Yi][Max_Xj]) < abs(
            matrix_Aij[Max_Yi][0] / matrix_Aij[Max_Yi][Max_Xj]):
        Max_Yi = Yi
    if matrix_Aij[Yi][Max_Xj] > 0 and abs(matrix_Aij[Yi][0] / matrix_Aij[Yi][Max_Xj]) == abs(
            matrix_Aij[Max_Yi][0] / matrix_Aij[Max_Yi][Max_Xj]):
        for i in range(1, strNum + 1):
            if matrix_Aij[Yi][Max_Xj] > 0 and abs(matrix_Aij[Yi][i] / matrix_Aij[Yi][Max_Xj]) == abs(
                    matrix_Aij[Max_Yi][i] / matrix_Aij[Max_Yi][Max_Xj]):
                pass
            if matrix_Aij[Yi][Max_Xj] > 0 and abs(matrix_Aij[Yi][i] / matrix_Aij[Yi][Max_Xj]) < abs(
                    matrix_Aij[Max_Yi][i] / matrix_Aij[Max_Yi][Max_Xj]):
                Max_Yi = Yi
                break
Copy_matrix_Aij = copy.deepcopy(matrix_Aij)
for Yi in range(strNum + 1):
    for Xj in range(xNum + 1):
        if Yi == Max_Yi:
            Copy_matrix_Aij[Yi][Xj] = matrix_Aij[Yi][Xj] / matrix_Aij[Max_Yi][Max_Xj]
        if Yi != Max_Yi:
            Copy_matrix_Aij[Yi][Xj] = matrix_Aij[Yi][Xj] - matrix_Aij[Max_Yi][Xj] * matrix_Aij[Yi][Max_Xj] / \
                                      matrix_Aij[Max_Yi][Max_Xj]
return Copy_matrix_Aij


iterated_Symplex_Table = copy.deepcopy(symplex_Table)
i = 0
while True:
    print(f"Iteration № {i}")
    i += 1
    outCurrent_Symplex_Table = pd.DataFrame(columns=spCol, data=iterated_Symplex_Table)
    print(outCurrent_Symplex_Table)
    print()
    print()
    print()
    iterated_Symplex_Table = lexicSymplexMethod(iterated_Symplex_Table)
    if iterated_Symplex_Table == 1:
        print("NO SOLUTION!!!")
        break
    if len(iterated_Symplex_Table) == 2 and iterated_Symplex_Table[1] == 2:
        print('FIND OPTIMAL SOLUTION')
        break

По сути нужно сделать так, чтобы этот код зациклился(подобрать соответствующие значения в массивы Bi, vectorC, coeficients_Aij)


Ответы (0 шт):