From 9a1dfb4c92004a25fa73dc8ece86ba5732fc285b Mon Sep 17 00:00:00 2001 From: tobiglaser <76131623+tobiglaser@users.noreply.github.com> Date: Tue, 2 May 2023 00:46:27 +0200 Subject: [PATCH] dynamic working --- Blatt2/Knapsack.py | 82 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 17 deletions(-) diff --git a/Blatt2/Knapsack.py b/Blatt2/Knapsack.py index 2ec75b6..8a160de 100644 --- a/Blatt2/Knapsack.py +++ b/Blatt2/Knapsack.py @@ -1,8 +1,8 @@ import numpy as np #config: -solve_brute_force = True -solve_dynamic = False +solve_brute_force = False +solve_dynamic = True # item: # name weight value @@ -10,17 +10,64 @@ weight = 1 value = 2 def dynamic(items: list, capacity: int) -> list: + print("Dynamic:") + #Array anlegen num_items = len(items) - array = np.zeros(shape=(num_items+1, capacity), dtype=int) + array = np.zeros(shape=(num_items+1, capacity+1), dtype=int) + + #erstes item + for i in range(items[0][weight], capacity+1): + array[1][i] = items[0][value] + + # für jedes weitere item for row, item in enumerate(items, start=1): - help_row = np.array[num_items] - for j, column in range(item[weight], capacity+1): - if item[1] >= j: - prev_weight = array[row-1] - if prev_weight + item[weight] <= column: - help_row[column] = prev_weight + item[weight] - - pass #! + #erstes item wurde schon hinzugefügt + if row == 1: + continue + #erstelle eine Hilfszeile + help_row = array[row-1].copy() + #für jede Spalte + for index in range(len(help_row)): + #füge den item wert hinzu + help_row[index] += item[value] + #vergleiche die hilfszeile (verschoben um weight) mit der vorherigen Zeile + #und trage den besten wert weiter + for column in range(len(help_row)): + if column < item[weight]: + array[row][column] = array[row-1][column] + if column >= item[weight]: + array[row][column] = max(help_row[column-item[weight]], array[row-1][column]) + + print(array) + + #backtracking + loaded_items = [] + row = num_items + column = capacity + best_value = array[row, column] + print("best value", best_value) + while(column > 0): + while(array[row-1, column] == best_value): + row -= 1 + if (row <= 0): + break + item = items[row-1] + loaded_items.append(item) + row -= 1 + column -= item[weight] + best_value -= item[value] + + + #ausgabe + loaded_items.reverse() + end_weight = 0 + end_value = 0 + for item in loaded_items: + print(item[0]) + end_weight += item[weight] + end_value += item[value] + print('Gewicht: ', end_weight) + print('Wert: ', end_value) def traverse(items: list, max_weight: int, bits: list, level: int, depth: int, best_value, best_bits: list) -> list: @@ -57,7 +104,7 @@ def traverse(items: list, max_weight: int, bits: list, level: int, depth: int, b bits[level] = 0 # traversiere rechts - #bits[level] = 0 + #bits[level] = 0 traverse(items=items, max_weight=max_weight, bits=bits, @@ -67,6 +114,7 @@ def traverse(items: list, max_weight: int, bits: list, level: int, depth: int, b best_bits=best_bits) def brute(items: list, capacity: int) -> list: + print("Brute Force:") mybits = [] best_bits = [] for i in range(len(items)): @@ -85,12 +133,12 @@ def brute(items: list, capacity: int) -> list: best_bits=best_bits) print(best_bits) - gewicht = 0 + weight = 0 for i, item in enumerate(items): if best_bits[0][i]: - gewicht += item[1] + weight += item[1] print(item[0]) - print('Gewicht: ', gewicht) + print('Gewicht: ', weight) print('Wert: ', best_value[0]) def parse_data_file(path: str) -> list: @@ -125,5 +173,5 @@ if __name__ == "__main__": if solve_dynamic: items = get_items("Blatt2/knapsack01.data") dynamic(items, 10000) - - \ No newline at end of file + #items = get_items() + #dynamic(items, 500) -- GitLab