better bundle constraint
This commit is contained in:
@ -25,13 +25,17 @@ def build_constraints(solver_run, problem, items):
|
|||||||
* items[item.id]
|
* items[item.id]
|
||||||
for item in solver_run.items]) <= round(total_form_items * (max / 100)), f'{attribute.id} - {attribute.value} - max'
|
for item in solver_run.items]) <= round(total_form_items * (max / 100)), f'{attribute.id} - {attribute.value} - max'
|
||||||
elif attribute.type == 'bundle':
|
elif attribute.type == 'bundle':
|
||||||
# TODO: account for many different bundle types, since the id condition in L33 could yield duplicates
|
# # TODO: account for many different bundle types, since the id condition in L33 could yield duplicates
|
||||||
total_bundles = randint(constraint.minimum, constraint.maximum)
|
total_bundles = randint(constraint.minimum, constraint.maximum)
|
||||||
selected_bundles = sample(solver_run.bundles, total_bundles)
|
selected_bundles = sample(solver_run.bundles, total_bundles)
|
||||||
|
|
||||||
for bundle in selected_bundles:
|
for bundle in selected_bundles:
|
||||||
problem += lpSum([items[item.id] for item in solver_run.items if getattr(item, bundle.type, None) == bundle.id]) == bundle.count, f'Bundle constraint for {bundle.type} ({bundle.id})'
|
con = dict(zip([item.id for item in solver_run.items],
|
||||||
|
[(getattr(item, bundle.type, False) == bundle.id)
|
||||||
|
for item in solver_run.items]))
|
||||||
|
problem += lpSum([con[item.id]
|
||||||
|
* items[item.id]
|
||||||
|
for item in solver_run.items]) == bundle.count, f'Bundle constraint for {bundle.type} ({bundle.id})'
|
||||||
|
|
||||||
return problem
|
return problem
|
||||||
except ValueError as error:
|
except ValueError as error:
|
||||||
|
Reference in New Issue
Block a user