From d07a76ce5d52d4bbf3f95c5489dc73199222b5d5 Mon Sep 17 00:00:00 2001 From: raj_mathe Date: Wed, 15 Jun 2022 09:17:16 +0200 Subject: [PATCH] =?UTF-8?q?master=20>=20master:=20code=20py=20-=20f=C3=BCg?= =?UTF-8?q?te=20option=20hinzu,=20um=20auch=200-costs=20anzuzeigen=20-=20A?= =?UTF-8?q?bdunkeln=20in=20Summen=20jetzt=20nicht=20bei=20Werten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/python/assets/config.yaml | 2 ++ code/python/models/config-schema.yaml | 21 +++++++++++++--- .../src/algorithms/rucksack/algorithms.py | 4 +-- .../python/src/algorithms/rucksack/display.py | 25 ++++++++++++++++--- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/code/python/assets/config.yaml b/code/python/assets/config.yaml index aafb719..f137272 100644 --- a/code/python/assets/config.yaml +++ b/code/python/assets/config.yaml @@ -30,3 +30,5 @@ options: - TREE rucksack: verbose: true + show: + - ALL-WEIGHTS diff --git a/code/python/models/config-schema.yaml b/code/python/models/config-schema.yaml index dfca22f..2f72242 100644 --- a/code/python/models/config-schema.yaml +++ b/code/python/models/config-schema.yaml @@ -53,7 +53,7 @@ components: - tsp - tarjan - hirschberg - - rucksack-branch-and-bound + - rucksack properties: log-level: $ref: '#/components/schemas/EnumLogLevel' @@ -117,12 +117,16 @@ components: default: [] rucksack: type: object - required: - - verbose + required: [] properties: verbose: type: boolean default: false + show: + type: array + items: + $ref: '#/components/schemas/EnumRucksackShow' + default: [] # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Enum LogLevel # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -148,8 +152,17 @@ components: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EnumHirschbergShow: description: |- - Enumeration of verbosity options for Hirschberg + Enumeration of display options for Hirschberg type: string enum: - TREE - ATOMS + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Enum Rucksack - display options + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + EnumRucksackShow: + description: |- + Enumeration of display options for the Rucksack problem + type: string + enum: + - ALL-WEIGHTS diff --git a/code/python/src/algorithms/rucksack/algorithms.py b/code/python/src/algorithms/rucksack/algorithms.py index 4342ee9..5074925 100644 --- a/code/python/src/algorithms/rucksack/algorithms.py +++ b/code/python/src/algorithms/rucksack/algorithms.py @@ -83,7 +83,7 @@ def rucksack_greedy_algorithm( # verbose output hier behandeln (irrelevant für Algorithmus): if verbose: - repr_rucksack = display_rucksack(items=items[rucksack], costs=costs[rucksack], values=values[rucksack], choice=np.asarray(choice)[rucksack]); + repr_rucksack = display_rucksack(items=items, costs=costs, values=values, choice=choice); print('\x1b[1mEingeschätzte Lösung\x1b[0m'); print(''); print(f'Mask: [{", ".join(map(str, soln.choice))}]'); @@ -173,7 +173,7 @@ def rucksack_branch_and_bound_algorithm( # verbose output hier behandeln (irrelevant für Algorithmus): if verbose: repr = display_branch_and_bound(values=values, steps=logged_steps); - repr_rucksack = display_rucksack(items=items[rucksack], costs=costs[rucksack], values=values[rucksack], choice=np.asarray(mask.choice)[rucksack]); + repr_rucksack = display_rucksack(items=items, costs=costs, values=values, choice=mask.choice); print(repr); print(''); print('\x1b[1mLösung\x1b[0m'); diff --git a/code/python/src/algorithms/rucksack/display.py b/code/python/src/algorithms/rucksack/display.py index 413bee4..3a175eb 100644 --- a/code/python/src/algorithms/rucksack/display.py +++ b/code/python/src/algorithms/rucksack/display.py @@ -9,6 +9,8 @@ from src.thirdparty.code import *; from src.thirdparty.maths import *; from src.thirdparty.types import *; +from src.setup import config; +from models.generated.config import *; from src.models.stacks import *; from src.models.rucksack import *; @@ -62,9 +64,17 @@ def display_rucksack( items: np.ndarray, costs: np.ndarray, values: np.ndarray, - choice: np.ndarray, + choice: List[Fraction], ) -> str: + show_options = config.OPTIONS.rucksack.show; render = lambda r: f'{r:g}'; + choice = np.asarray(choice); + rucksack = np.where(choice > 0); + if not(EnumRucksackShow.all_weights in show_options): + items = items[rucksack]; + costs = costs[rucksack]; + values = values[rucksack]; + choice = choice[rucksack]; table = pd.DataFrame({ 'items': items.tolist() + ['----', '∑'], 'nr': list(map(str, choice)) @@ -132,15 +142,22 @@ def display_sum( indexes: List[int] = [], as_maximum: bool = True, ) -> str: + show_options = config.OPTIONS.rucksack.show; + show_all_weights = (EnumRucksackShow.all_weights in show_options); + def render(x: Tuple[bool, Fraction, float]): b, u, value = x; - expr = f'\x1b[91m{value:g}\x1b[0m' if b else f'\x1b[2m{value:g}\x1b[0m'; - return expr if u == 1 else f'\x1b[4;2m{u}\x1b[0m\x1b[2m·\x1b[0m{expr}'; + expr = f'\x1b[91m{value:g}\x1b[0m' if b else f'\x1b[0m{value:g}\x1b[0m'; + if not show_all_weights and u == 1: + return expr; + return f'\x1b[2m{u}\x1b[0m\x1b[2m·\x1b[0m{expr}'; parts = [ (i in indexes, u, x) for i, (u, x) in enumerate(zip(choice, values)) ]; if not (order is None): parts = [ parts[j] for j in order ]; - parts = list(filter(lambda x: x[1] > 0, parts)); + if not show_all_weights: + parts = list(filter(lambda x: x[1] > 0, parts)); + value = sum([ u*x for _, u, x in parts ]); expr = '\x1b[2m+\x1b[0m'.join(map(render, parts));