diff --git a/documents/references.md b/documents/references.md index 3dff948ba786ac59b2d611e24fff0eb0155c55a9..4585f73f1d779b6d9f3d5c3da4368f2fea842ebf 100644 --- a/documents/references.md +++ b/documents/references.md @@ -20,6 +20,9 @@ Used to move to the "Script's Directory", regardless of where the script was lau ### Reading/Parsing JSON File with Python <https://linuxconfig.org/how-to-parse-data-from-json-into-python> +## Padding Console Output in Python +<https://stackoverflow.com/a/5676884> + ## Older Relevant References References linked in previous assignments. diff --git a/resources/interface.py b/resources/interface.py index 8ac7fda5e2b8bd61583c3f8bfa430c8c91f116e5..c0b1e7e7ae1de155328c87fe88d16998cb99f718 100644 --- a/resources/interface.py +++ b/resources/interface.py @@ -43,7 +43,7 @@ class UserInterface(): self.display_program_values() elif user_input == '3': self.solve_knapsack_problem() - elif user_input == '4': + elif user_input == '0': self._run_program_bool_ = False logger.info('Exiting Program') else: @@ -59,7 +59,7 @@ class UserInterface(): logger.info(' 1) Set program values.') logger.info(' 2) Display current program values.') logger.info(' 3) Solve Knapsack Problem with current program values.') - logger.info(' 4) Exit program.') + logger.info(' 0) Exit program.') #region Program Values Menu @@ -86,7 +86,7 @@ class UserInterface(): self.add_to_item_set() elif user_input == '5': self.clear_item_set() - elif user_input == '6': + elif user_input == '0': stay_in_menu = False else: logger.info('Unrecognized user input. Please try again.') @@ -103,7 +103,7 @@ class UserInterface(): logger.info(' 3) Set "Item Set" by JSON import.') logger.info(' 4) Add value to "Item Set" manually.') logger.info(' 5) Clear entire "Item Set".') - logger.info(' 6) Back') + logger.info(' 0) Back') def set_max_weight(self): """ @@ -207,10 +207,12 @@ class UserInterface(): Solves knapsack with current problems and displays result to user. """ try: - self._knapsack_algorithm.display_max_weight() - self._knapsack_algorithm.display_item_set() + # Calculate results. results = self._knapsack_algorithm.calculate_fractional_knapsack() - logger.info('Optimal backpack contents, by weight of each item to take:') - logger.info(results) + + # Print program values and results. + logger.info('') + self._knapsack_algorithm.display_max_weight() + self._knapsack_algorithm.display_item_set(results) except ValueError as err: logger.info(err) diff --git a/resources/knapsack.py b/resources/knapsack.py index e2669e0fa6a75da9d297b0886b648816863136de..1553d0b3a997f42a9ae63e01e8e4d25eb41152aa 100644 --- a/resources/knapsack.py +++ b/resources/knapsack.py @@ -155,11 +155,59 @@ class FractionalKnapsackAlgorithm(): self._max_weight_ = 0 self._weight_populated_ = False - def display_item_set(self): + def display_item_set(self, result_array=None): """ Prints current item set with logging. + :param result_array: Optional array of results. """ - logger.info('Current Item Set: {0}'.format(self._item_set_)) + if len(self._item_set_) > 0: + # Handle for item set having values. + logger.info('Current Item Set:') + + # Print top bar of table. + if result_array is None: + logger.info('================================================================') + logger.info('| Item # | Total Benefit | Total Amount | Value Per One Weight |') + logger.info('================================================================') + else: + logger.info('===============================================================================') + logger.info('| Item # | Total Benefit | Total Amount | Value Per One Weight | Amount Taken |') + logger.info('===============================================================================') + + # Print table contents. + for index in range(len(self._item_set_)): + + item_benefit = self._item_set_[index]['benefit'] + item_cost = self._item_set_[index]['cost'] + if item_cost != 0: + item_ratio = item_benefit / item_cost + else: + item_ratio = item_benefit + + if result_array is None: + logger.info('| {0:>6} | {1:>13} | {2:>12} | {3:>20} |'.format( + index + 1, + item_benefit, + item_cost, + item_ratio, + )) + else: + logger.info('| {0:>6} | {1:>13} | {2:>12} | {3:>20} | {4:>12} |'.format( + index + 1, + item_benefit, + item_cost, + item_ratio, + result_array[index], + )) + + # Print bottom bar of table. + if result_array is None: + logger.info('================================================================') + else: + logger.info('===============================================================================') + else: + # Handle for item set being empty. + logger.info('Current Item Set: []') def display_max_weight(self): """