Skip to content

Instantly share code, notes, and snippets.

@bennokr
Created March 25, 2022 11:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bennokr/880e18310cfb7db095a96d41ea34a893 to your computer and use it in GitHub Desktop.
Save bennokr/880e18310cfb7db095a96d41ea34a893 to your computer and use it in GitHub Desktop.
Partition non-overlapping item clusters
from mip import *
import string, collections
a = string.ascii_uppercase
item_clusters, cluster_size = {}, collections.Counter()
for ci,c in enumerate([a[:6],a[:3],a[3:6],a[6:10],a[10:12]]):
for i in c:
name = 'c'+str(ci)
cluster_size[name] += 1
item_clusters.setdefault(i, set()).add( name )
print(item_clusters, cluster_size)
m = Model(sense=MAXIMIZE, solver_name=CBC)
cvars = {cname: m.add_var(var_type=INTEGER, name=cname) for cname in cluster_size}
coef_x = {}
m.objective = xsum(size * cvars[cname] for cname, size in cluster_size.items())
for i, clusters in item_clusters.items():
m += xsum([cvars[cname]*int(cname in clusters) for cname in cluster_size]) == 1, "C"+i
status = m.optimize()
if status == OptimizationStatus.OPTIMAL:
print('optimal solution cost {} found'.format(m.objective_value))
elif status == OptimizationStatus.FEASIBLE:
print('sol.cost {} found, best possible: {}'.format(m.objective_value, m.objective_bound))
elif status == OptimizationStatus.NO_SOLUTION_FOUND:
print('no feasible solution found, lower bound is: {}'.format(m.objective_bound))
if status == OptimizationStatus.OPTIMAL or status == OptimizationStatus.FEASIBLE:
print('solution:')
for v in m.vars:
print('{} : {}'.format(v.name, v.x))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment