Untitled
unknown
python
3 years ago
4.6 kB
8
Indexable
class simplex():
def __init__(self, tableau, basic_var, integer=False):
self.tableau = tableau
self.basic_var = basic_var
self.integer = integer
self.solution = []
self.z = 0
self.optimal = False
self.unbounded = False
self.infeasible = False
def print_solution(self):
if self.solution != None:
print('The tableau has an optimal solution x = {}\nThe optimal value is z = {}'.format(self.solution, self.z))
elif self.unbounded:
print('The tableau is unbounded')
elif self.infeasible:
print('The tableau is infeasible')
#parameters: tableau, index t of the row, index h of the column
def pivot_operation(self, t, h):
'''
Performs the pivot operations of the cell represented by the input values for row t and column h
'''
tableau = self.tableau
#shape of the tableau
m = tableau.shape[0]
n = tableau.shape[1]
pivot = tableau[t][h]
#divide the pivot row by the pivot element
for i in range(n):
tableau[t][i] /= pivot
#update all the other rows
save = pivot
for i in range(m):
if i != t and tableau[i][h] != 0:
save = tableau[i][h]
for j in range(n):
tableau[i][j] -= save*tableau[t][j]
def dual_simplex_method(self, verbose=0):
'''
Solve the model using the dual simplex method in tableau form.
Parameters:
- verbose: integer value to obtain the followig informations
- 1 print the intermediate tableau
- 2 show the pivot operations made
'''
tableau = self.tableau
beta = self.basic_var
#print the starting tableau
if verbose:
print('TABLEAU:\n{}\n'.format(tableau))
iteration_count = 0
#number of rows in the tableau
m = tableau.shape[0]
#number of columns in the tableau
n = tableau.shape[1]
#final cases
infeasible = False
optimal = False
while optimal == False and infeasible == False:
iteration_count+=1
#get the vector of costs
b_vector = [tableau[b][0] for b in range(1, m)]
#verify if all the costs are >= 0, thus the tableau is in optimal form
if all(b >= 0 for b in b_vector):
optimal = True
break
else:
#index of basic variable that will leave the basis
t = 1
#find the first negative variable with b < 0
for i in range(1, m):
if i != 0 and tableau[i][0] < 0:
t = i
break
if all(tableau[t][i] >= 0 for i in range(1, n)):
infeasible = True
break
else:
#choose the variable that will enter the basis
min = 100000
h = 1
for i in range(1, n):
if tableau[t][i] < 0 and tableau[0][i] / abs(tableau[t][i]) < min:
min = tableau[0][i] / abs(tableau[t][i])
h = i
if verbose == 2:
print('Pivot operation on the cell(iteration_count: {1}): {0}\n'.format((t, h),iteration_count))
#pivot operation
self.pivot_operation(t, h)
#update the vector beta, containing the indices of the basis variables
beta[t-1] = h
#Print the intermediate tableau
if verbose:
#print('TABLEAU:\n{}\n'.format(tableau))
plt.figure(figsize = (75,5))
hmp(tableau)
plt.show()
if optimal:
#solution
x = [0]*(n - 1)
for i, b in enumerate(beta):
x[b-1] = tableau[i+1][0]
self.optimal = True
self.solution = x
self.z = -tableau[0][0]
#print('The tableau has an optimal solution x = ', x)
elif infeasible:
self.infeasible = True
#print('The tableau is infeasible')
Editor is loading...