master > master: code py - korrigierte Darstellung für fractional-Fall
This commit is contained in:
parent
92f038d4dd
commit
7b2950fc7a
@ -57,25 +57,25 @@ def rucksack_greedy_algorithm(
|
|||||||
# führe greedy aus:
|
# führe greedy aus:
|
||||||
n = len(costs);
|
n = len(costs);
|
||||||
cost_total = 0;
|
cost_total = 0;
|
||||||
vector = [ Fraction(0) for _ in range(n) ];
|
choice = [ Fraction(0) for _ in range(n) ];
|
||||||
for i in order:
|
for i in order:
|
||||||
# füge Item i hinzu, solange das Gesamtgewicht noch <= Schranke
|
# füge Item i hinzu, solange das Gesamtgewicht noch <= Schranke
|
||||||
if cost_total + costs[i] <= max_cost:
|
if cost_total + costs[i] <= max_cost:
|
||||||
cost_total += costs[i];
|
cost_total += costs[i];
|
||||||
vector[i] = Fraction(1);
|
choice[i] = Fraction(1);
|
||||||
# falls Bruchteile erlaubt sind, füge einen Bruchteil des i. Items hinzu und abbrechen
|
# falls Bruchteile erlaubt sind, füge einen Bruchteil des i. Items hinzu und abbrechen
|
||||||
elif fractional:
|
elif fractional:
|
||||||
vector[i] = Fraction(Fraction(max_cost - cost_total)/Fraction(costs[i]), _normalize=False);
|
choice[i] = Fraction(Fraction(max_cost - cost_total)/Fraction(costs[i]), _normalize=False);
|
||||||
break;
|
break;
|
||||||
# ansonsten weiter machen:
|
# ansonsten weiter machen:
|
||||||
else:
|
else:
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
# Aspekte der Lösung speichern:
|
# Aspekte der Lösung speichern:
|
||||||
rucksack = [i for i, v in enumerate(vector) if v > 0]; # Indexes von Items im Rucksack
|
rucksack = [i for i, v in enumerate(choice) if v > 0]; # Indexes von Items im Rucksack
|
||||||
soln = Solution(
|
soln = Solution(
|
||||||
order = order,
|
order = order,
|
||||||
choice = vector,
|
choice = choice,
|
||||||
items = items[rucksack].tolist(),
|
items = items[rucksack].tolist(),
|
||||||
costs = costs[rucksack].tolist(),
|
costs = costs[rucksack].tolist(),
|
||||||
values = values[rucksack].tolist(),
|
values = values[rucksack].tolist(),
|
||||||
@ -83,7 +83,7 @@ def rucksack_greedy_algorithm(
|
|||||||
|
|
||||||
# verbose output hier behandeln (irrelevant für Algorithmus):
|
# verbose output hier behandeln (irrelevant für Algorithmus):
|
||||||
if verbose:
|
if verbose:
|
||||||
repr_rucksack = display_rucksack(items=items[rucksack], costs=costs[rucksack], values=values[rucksack]);
|
repr_rucksack = display_rucksack(items=items[rucksack], costs=costs[rucksack], values=values[rucksack], choice=np.asarray(choice)[rucksack]);
|
||||||
print('\x1b[1mEingeschätzte Lösung\x1b[0m');
|
print('\x1b[1mEingeschätzte Lösung\x1b[0m');
|
||||||
print('');
|
print('');
|
||||||
print(f'Mask: [{", ".join(map(str, soln.choice))}]');
|
print(f'Mask: [{", ".join(map(str, soln.choice))}]');
|
||||||
@ -122,10 +122,10 @@ def rucksack_branch_and_bound_algorithm(
|
|||||||
print('');
|
print('');
|
||||||
|
|
||||||
logged_steps = [];
|
logged_steps = [];
|
||||||
vector = empty_mask(n=len(costs));
|
mask = empty_mask(n=len(costs));
|
||||||
lb_estimate = np.inf;
|
lb_estimate = np.inf;
|
||||||
S = Stack();
|
S = Stack();
|
||||||
S.push(vector);
|
S.push(mask);
|
||||||
while not S.empty():
|
while not S.empty():
|
||||||
lb, choice, order_, pad = estimate_lower_bound(mask=S.top(), max_cost=max_cost, costs=costs, values=values, items=items);
|
lb, choice, order_, pad = estimate_lower_bound(mask=S.top(), max_cost=max_cost, costs=costs, values=values, items=items);
|
||||||
if verbose:
|
if verbose:
|
||||||
@ -139,7 +139,7 @@ def rucksack_branch_and_bound_algorithm(
|
|||||||
# falls A als einelementige Menge betrachtet werden kann, ersetze unbekannte Werte:
|
# falls A als einelementige Menge betrachtet werden kann, ersetze unbekannte Werte:
|
||||||
if pad != MaskValue.UNSET:
|
if pad != MaskValue.UNSET:
|
||||||
A = A.pad(pad);
|
A = A.pad(pad);
|
||||||
vector = A;
|
mask = A;
|
||||||
# Branch sonst
|
# Branch sonst
|
||||||
else:
|
else:
|
||||||
B, C = A.split();
|
B, C = A.split();
|
||||||
@ -149,10 +149,10 @@ def rucksack_branch_and_bound_algorithm(
|
|||||||
S.push(C);
|
S.push(C);
|
||||||
|
|
||||||
# Aspekte der Lösung speichern
|
# Aspekte der Lösung speichern
|
||||||
rucksack = vector.indexes_one; # Indexes von Items im Rucksack
|
rucksack = mask.indexes_one; # Indexes von Items im Rucksack
|
||||||
soln = Solution(
|
soln = Solution(
|
||||||
order = order,
|
order = order,
|
||||||
choice = vector.choice,
|
choice = mask.choice,
|
||||||
items = items[rucksack].tolist(),
|
items = items[rucksack].tolist(),
|
||||||
values = values[rucksack].tolist(),
|
values = values[rucksack].tolist(),
|
||||||
costs = costs[rucksack].tolist(),
|
costs = costs[rucksack].tolist(),
|
||||||
@ -161,7 +161,7 @@ def rucksack_branch_and_bound_algorithm(
|
|||||||
# verbose output hier behandeln (irrelevant für Algorithmus):
|
# verbose output hier behandeln (irrelevant für Algorithmus):
|
||||||
if verbose:
|
if verbose:
|
||||||
repr = display_branch_and_bound(values=values, steps=logged_steps);
|
repr = display_branch_and_bound(values=values, steps=logged_steps);
|
||||||
repr_rucksack = display_rucksack(items=items[rucksack], costs=costs[rucksack], values=values[rucksack]);
|
repr_rucksack = display_rucksack(items=items[rucksack], costs=costs[rucksack], values=values[rucksack], choice=np.asarray(mask.choice)[rucksack]);
|
||||||
print('\x1b[1mLösung\x1b[0m');
|
print('\x1b[1mLösung\x1b[0m');
|
||||||
print('');
|
print('');
|
||||||
print(repr);
|
print(repr);
|
||||||
@ -201,7 +201,7 @@ def estimate_lower_bound(
|
|||||||
mit Greedy-Algorithmus »lösen«,
|
mit Greedy-Algorithmus »lösen«,
|
||||||
um schnell eine gute Einschätzung zu bestimmen.
|
um schnell eine gute Einschätzung zu bestimmen.
|
||||||
|
|
||||||
NOTE: Diese Funktion wird `g(vector)` im Skript bezeichnet.
|
NOTE: Diese Funktion wird `g(mask)` im Skript bezeichnet.
|
||||||
'''
|
'''
|
||||||
indexes_one = mask.indexes_one;
|
indexes_one = mask.indexes_one;
|
||||||
indexes_unset = mask.indexes_unset;
|
indexes_unset = mask.indexes_unset;
|
||||||
|
@ -62,18 +62,20 @@ def display_rucksack(
|
|||||||
items: np.ndarray,
|
items: np.ndarray,
|
||||||
costs: np.ndarray,
|
costs: np.ndarray,
|
||||||
values: np.ndarray,
|
values: np.ndarray,
|
||||||
|
choice: np.ndarray,
|
||||||
) -> str:
|
) -> str:
|
||||||
render = lambda r: f'{r:g}';
|
render = lambda r: f'{r:g}';
|
||||||
table = pd.DataFrame({
|
table = pd.DataFrame({
|
||||||
'items': items.tolist() + ['----', '∑'],
|
'items': items.tolist() + ['----', '∑'],
|
||||||
'costs': list(map(render, costs)) + ['', f'\x1b[92;1m{sum(costs):g}\x1b[0m'],
|
'nr': list(map(str, choice)) + ['----', f'{float(sum(choice)):g}'],
|
||||||
'values': list(map(render, values)) + ['', f'\x1b[92;1m{sum(values):g}\x1b[0m'],
|
'costs': list(map(render, costs)) + ['----', f'\x1b[92;1m{sum(choice*costs):g}\x1b[0m'],
|
||||||
|
'values': list(map(render, values)) + ['----', f'\x1b[92;1m{sum(choice*values):g}\x1b[0m'],
|
||||||
});
|
});
|
||||||
repr = tabulate(
|
repr = tabulate(
|
||||||
table,
|
table,
|
||||||
headers=['item', 'cost', 'value'],
|
headers=['item', 'nr', 'cost', 'value'],
|
||||||
showindex=False,
|
showindex=False,
|
||||||
colalign=('left', 'center', 'center'),
|
colalign=('left', 'center', 'center', 'center'),
|
||||||
tablefmt='rst'
|
tablefmt='rst'
|
||||||
);
|
);
|
||||||
return repr;
|
return repr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user