diff --git a/resources/simplex/base.py b/resources/simplex/base.py index a6973feb386f5cedfef839da48c653b15b0f84c0..c44768b34723a76405d840cfe50c52d77ea0e099 100644 --- a/resources/simplex/base.py +++ b/resources/simplex/base.py @@ -50,7 +50,7 @@ class SimplexBase(): """ Class to run simplex algorithm. """ - def __init__(self, *args, **kwargs): + def __init__(self, *args, debug=False, **kwargs): self._matrix_a = None self._vector_b = None self._vector_c = None @@ -59,9 +59,9 @@ class SimplexBase(): self._n_array = None self._description = None - self._run_simplex = RunSimplex(self) - self._initialize = Initialize(self) - self._pivot = Pivot(self) + self._run_simplex = RunSimplex(self, debug=debug) + self._initialize = Initialize(self, debug=debug) + self._pivot = Pivot(self, debug=debug) #region Simplex Read in and Setup diff --git a/resources/simplex/initialize.py b/resources/simplex/initialize.py index d79fc8edfe2e83fa2624f9f1c8fc694e8132396a..577ee84f650a13a96327054b7479976fcc606905 100644 --- a/resources/simplex/initialize.py +++ b/resources/simplex/initialize.py @@ -20,7 +20,9 @@ logger = init_logging.get_logger(__name__) class Initialize(): - def __init__(self, parent, *args, **kwargs): + def __init__(self, parent, *args, debug=False, **kwargs): + self._debug = debug + # Get calling parent. We use this to pull parent data on __call__. self._parent = parent @@ -78,6 +80,16 @@ class Initialize(): b_array = copy.deepcopy(self._basic_var_indexes) n_array = copy.deepcopy(self._nonbasic_var_indexes) + # Optional debugging printout. + if self._debug: + logger.info('') + logger.info('Starting Initialize._correct_simplex()') + logger.info(' n_array: {0}'.format(n_array)) + logger.info(' b_array: {0}'.format(b_array)) + logger.info(' matrix_a: {0}'.format(matrix_a)) + logger.info(' vector_b: {0}'.format(vector_b)) + logger.info(' obj_constant_index: {0}'.format(obj_const_index)) + # Add a "new" constraint variable. This will be set to 1 for all constants and -1 for obj func. for row_index in range(len(matrix_a)): matrix_a[row_index].append(1) diff --git a/resources/simplex/pivot.py b/resources/simplex/pivot.py index 1db73da4f89f6817f54d26c6796e46ac45c034d2..875cf7e93ba111ead8eb63e61e4725152a2f4c74 100644 --- a/resources/simplex/pivot.py +++ b/resources/simplex/pivot.py @@ -20,7 +20,9 @@ logger = init_logging.get_logger(__name__) class Pivot(): - def __init__(self, parent, *args, **kwargs): + def __init__(self, parent, *args, debug=False, **kwargs): + self._debug = debug + # Get calling parent. We use this to pull parent data on __call__. self._parent = parent @@ -115,6 +117,16 @@ class Pivot(): :param old_basic: Tuple of (row, col) index values for old basic variable. :param new_basic: Tuple of (row, col) index values of the new basic variable. """ + # Optional debugging printout. + if self._debug: + logger.info('') + logger.info('Starting Pivot._calculate_new_basic()') + logger.info(' n_array: {0}'.format(n_array)) + logger.info(' matrix_a: {0}'.format(matrix_a)) + logger.info(' vector_b: {0}'.format(vector_b)) + logger.info(' old_basic: {0}'.format(old_basic)) + logger.info(' new_basic: {0}'.format(new_basic)) + # Calculate our new constraint constant. vector_b[new_basic[0]] = self._vector_b[new_basic[0]] / self._matrix_a[old_basic[0]][new_basic[1]] @@ -152,6 +164,16 @@ class Pivot(): :param old_basic: Tuple of (row, col) index values for old basic variable. :param new_basic: Tuple of (row, col) index values of the new basic variable. """ + # Optional debugging printout. + if self._debug: + logger.info('') + logger.info('Starting Pivot._compute_coefficients()') + logger.info(' n_array: {0}'.format(n_array)) + logger.info(' matrix_a: {0}'.format(matrix_a)) + logger.info(' vector_b: {0}'.format(vector_b)) + logger.info(' old_basic: {0}'.format(old_basic)) + logger.info(' new_basic: {0}'.format(new_basic)) + # Loop through all basic indexes (minus the one we're removing). Adjust coefficients in matrix. for row_index in range(len(vector_b)): @@ -180,6 +202,16 @@ class Pivot(): :param old_basic: Tuple of (row, col) index values for old basic variable. :param new_basic: Tuple of (row, col) index values of the new basic variable. """ + # Optional debugging printout. + if self._debug: + logger.info('') + logger.info('Starting Pivot._update_objective()') + logger.info(' n_array: {0}'.format(n_array)) + logger.info(' vector_c: {0}'.format(vector_c)) + logger.info(' obj_const_index: {0}'.format(obj_const_index)) + logger.info(' old_basic: {0}'.format(old_basic)) + logger.info(' new_basic: {0}'.format(new_basic)) + # Update objective constant. vector_c[self._obj_constant_index] = self._vector_c[self._obj_constant_index] - (self._vector_b[new_basic[0]] * self._vector_c[new_basic[1]]) @@ -201,6 +233,15 @@ class Pivot(): :param old_basic: Tuple of (row, col) index values for old basic variable. :param new_basic: Tuple of (row, col) index values of the new basic variable. """ + # Optional debugging printout. + if self._debug: + logger.info('') + logger.info('Starting Pivot._update_objective()') + logger.info(' n_array: {0}'.format(n_array)) + logger.info(' b_array: {0}'.format(b_array)) + logger.info(' old_basic: {0}'.format(old_basic)) + logger.info(' new_basic: {0}'.format(new_basic)) + # Remove new basic variable from set of nonbasics. n_array.remove(new_basic[1]) diff --git a/resources/simplex/run_simplex.py b/resources/simplex/run_simplex.py index 7378f43c9cd4a90a720d26dbc5da2443f2ed85d5..04bd42ca141e4570d5cdae259a27b869cde546e8 100644 --- a/resources/simplex/run_simplex.py +++ b/resources/simplex/run_simplex.py @@ -20,7 +20,9 @@ logger = init_logging.get_logger(__name__) class RunSimplex(): - def __init__(self, parent, *args, **kwargs): + def __init__(self, parent, *args, debug=False, **kwargs): + self._debug = debug + # Get calling parent. We use this to pull parent data on __call__. self._parent = parent @@ -33,10 +35,10 @@ class RunSimplex(): self._nonbasic_var_indexes = None def __call__(self, *args, **kwargs): - # Run pivot function. - return self._simplex() + # Run simplex logic loop until optimized. + return self._optimization_loop() - def _simplex(self): + def _optimization_loop(self): # Run "Initialize-Simplex" function before we do any work. self._parent.initialize() @@ -54,6 +56,16 @@ class RunSimplex(): basic_var_indexes = self._parent._b_array nonbasic_var_indexes = self._parent._n_array + # Optional debugging printout. + if self._debug: + logger.info('') + logger.info('Starting RunSimplex._optimization_loop()') + logger.info(' n_array: {0}'.format(nonbasic_var_indexes)) + logger.info(' b_array: {0}'.format(basic_var_indexes)) + logger.info(' matrix_a: {0}'.format(matrix_a)) + logger.info(' vector_b: {0}'.format(vector_b)) + logger.info(' obj_constant_index: {0}'.format(obj_constant_index)) + # Check that we actually can still optimize values. for col_index in range(len(vector_b)): # Check if value is greater than 0. @@ -102,6 +114,15 @@ class RunSimplex(): vector_c = self._parent._vector_c basic_var_indexes = self._parent._b_array + # Optional debugging printout. + if self._debug: + logger.info('') + logger.info('Starting RunSimplex._optimization_on_index()') + logger.info(' col_index: {0}'.format(col_index)) + logger.info(' b_array: {0}'.format(basic_var_indexes)) + logger.info(' matrix_a: {0}'.format(matrix_a)) + logger.info(' vector_b: {0}'.format(vector_b)) + logger.info('Attempting to pivot on index {0}: {1}'.format(col_index, vector_c[col_index])) # Loop through all rows, finding best one to pivot on.