Zeno
Zeno

Reputation: 65

Gurobi and Python: how to query a dictionary using optimal variable solutions

I'm using Python and Gurobi and I'm having difficulty on how to optimal variable solutions to query a dictionary.

my_dict = {(i, j) : func(Z) for i in I for j in J}

my_dict results to be like this:

{(15687, 'B'): [[7, 0, 0, 0], [0, 7, 0, 0], [0, 0, 7, 0], [0, 0, 0, 7]],
  ...
 (18906, 'C'): [[4, 0, 0, 3], [3, 0, 0, 3], [4, 0, 0, 0], [3, 0, 0, 0]}

Moreover I have a binary variable x[i, j, z] and an assignment constraint:

assignment = m.addConstrs((quicksum(x[i, j, z] 
                                   for z in range(len(my_dict[i, j]))) == 1 
                                   for i in I for j in J), "assignment")

Supposing I obtain as optimal solution variables

x[15687,'B',0] 1.000000
x[18906,'C',2] 1.000000

Is there a way to retrieve the sublist of my_dict corresponding to the "z" index? (For instance, if my solution is x[18906,'C',2] 1.000000 then z = 2 and I want to obtain the sublist [4, 0, 0, 0])

Upvotes: 0

Views: 358

Answers (1)

sascha
sascha

Reputation: 33532

Your code is not really a nice minimal example to work with, so it's hard to post valid code.

The general problem does not look that tough.

If your original dict looks like:

{(15687, 'B'): [[7, 0, 0, 0], [0, 7, 0, 0], [0, 0, 7, 0], [0, 0, 0, 7]],
  ...
 (18906, 'C'): [[4, 0, 0, 3], [3, 0, 0, 3], [4, 0, 0, 0], [3, 0, 0, 0]}

and your solution is my_dict_opt, probably something like this should do (python3):

import numpy as np   # easy fp-math comparison

sublists = []
for key, val in my_dict.items():
    n_vars = len(val)  # my assumption
    for i in range(n_vars):
        if np.isclose(my_dict_opt[key + tuple([i])].X, 1.0):  # depends on your dict if .X is needed
            sublists.append(my_dict[key][i])

Because of the dicts, the order of elements in sublists is not defined and this should only be a prototype as it's not really clear to me how those dicts are in use for you.

Upvotes: 1

Related Questions