diff --git a/app/services/loft_service.py b/app/services/loft_service.py index 74edc20..0e0db85 100644 --- a/app/services/loft_service.py +++ b/app/services/loft_service.py @@ -62,24 +62,35 @@ class LoftService(Base): problem = LpProblem("ata-form-generate", LpMinimize) # constraints - problem += lpSum([used[i]*items[i] - for i in items]) == self.solver_run.total_form_items - + problem += lpSum([items[item.id] + for item in self.solver_run.items]) == self.solver_run.total_form_items, 'Total form items' + + for constraint in self.solver_run.constraints: + con = dict(zip([item.id for item in self.solver_run.items], + [item.attribute_exists(constraint.reference_attribute.id, constraint.reference_attribute.value) + for item in self.solver_run.items])) + problem += lpSum([con[item.id] + * items[item.id] + for item in self.solver_run.items]) >= round(self.solver_run.total_form_items * (constraint.minimum / 100)), f'{constraint.reference_attribute.id} - {constraint.reference_attribute.value} - min' + problem += lpSum([con[item.id] + * items[item.id] + for item in self.solver_run.items]) <= round(self.solver_run.total_form_items * (constraint.maximum / 100)), f'{constraint.reference_attribute.id} - {constraint.reference_attribute.value} - max' + # multi-objective functions and constraints for target in self.solver_run.objective_function.tif_targets: tif = lpSum([item.iif(self.solver_run, target.theta)*items[item.id] for item in self.solver_run.items]) problem += lpSum([item.iif(self.solver_run, target.theta)*items[item.id] - for item in self.solver_run.items]) <= target.value + for item in self.solver_run.items]) <= target.value, f'min tif theta ({target.theta}) target value {target.value}' problem_objection_functions.append(tif) for target in self.solver_run.objective_function.tcc_targets: tcc = lpSum([item.irf(self.solver_run, target.theta)*items[item.id] for item in self.solver_run.items]) problem += lpSum([item.irf(self.solver_run, target.theta)*items[item.id] - for item in self.solver_run.items]) <= target.value + for item in self.solver_run.items]) <= target.value, f'min tcc theta ({target.theta}) target value {target.value}' problem_objection_functions.append(tcc) - + # solve problem problem.sequentialSolve(problem_objection_functions)