Как зациклить лексикографический симплекс метод?
Я знаю, что существует лексикографическое правило для предотвращения зацикливания симплекс метода а также я знаю, что это правило нужно применять к лексикографически допустимой симплекс таблицы (это таблица, в которых первые ненулевые коэффициенты положительны). Но мне известно, что существует способ зациклить лексикографический симплекс метод, для этого нужно подобрать соответствующую лексикографически недопустимую симплекс таблицу.
Как подобрать эту таблицу? (также я знаю, что минимум такая таблица имеет размерность 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)