Skip to content

Commit 45fabec

Browse files
ilansenDekker1
andauthored
Support combining different diversity measures and constraining them (#189)
* Add support for combining different diversity measures and constrainting them. * Fix formatting --------- Co-authored-by: Jip J. Dekker <[email protected]>
1 parent ff0b84f commit 45fabec

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

src/minizinc/helpers.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def _add_diversity_to_opt_model(
162162
def _add_diversity_to_div_model(
163163
inst: minizinc.Instance,
164164
vars: List[Dict[str, Any]],
165-
obj_sense: str,
165+
div_anns: Dict[str, Any],
166166
gap: Union[int, float],
167167
sols: Dict[str, Any],
168168
):
@@ -190,15 +190,38 @@ def _add_diversity_to_div_model(
190190
f"array [1..{len(prevsol)}] of var {varprevtype}: dist_{varname} :: output = [{distfun}({varname}, {varprevname}[sol,{dotdots}]) | sol in 1..{len(prevsol)}];\n"
191191
)
192192

193+
# Add minimum distance to the diversity distance measurement in the model code
194+
if var["lb"] != "infinity":
195+
inst.add_string(
196+
f"constraint forall(sol in 1..{len(prevsol)})( dist_{varname}[sol] >= {var['lb']});"
197+
)
198+
199+
# Add maximum distance to the diversity distance measurement in the model code
200+
if var["ub"] != "infinity":
201+
inst.add_string(
202+
f"constraint forall(sol in 1..{len(prevsol)})( dist_{varname}[sol] <= {var['ub']});"
203+
)
204+
205+
obj_sense = div_anns["objective"]["sense"]
206+
aggregator = (
207+
div_anns["aggregator"] if div_anns["aggregator"] != "" else "sum"
208+
)
209+
combinator = (
210+
div_anns["combinator"] if div_anns["combinator"] != "" else "sum"
211+
)
212+
193213
# Add the bound on the objective.
194214
if obj_sense == "-1":
195215
inst.add_string(f"constraint div_orig_objective <= {gap};\n")
196216
elif obj_sense == "1":
197217
inst.add_string(f"constraint div_orig_objective >= {gap};\n")
198218

199219
# Add new objective: maximize diversity.
200-
dist_sum = "+".join([f'sum(dist_{var["name"]})' for var in vars])
201-
inst.add_string(f"solve maximize {dist_sum};\n")
220+
div_combinator = ", ".join(
221+
[f'{var["coef"]} * dist_{var["name"]}[sol]' for var in vars]
222+
)
223+
dist_total = f"{aggregator}([{combinator}([{div_combinator}]) | sol in 1..{len(prevsol)}])"
224+
inst.add_string(f"solve maximize {dist_total};\n")
202225

203226
return inst
204227

src/minizinc/instance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ async def diverse_solutions(
394394
child = _add_diversity_to_div_model(
395395
child,
396396
variables,
397-
obj_anns["sense"],
397+
div_anns,
398398
max_gap,
399399
prev_solutions,
400400
)

0 commit comments

Comments
 (0)