tm553
tm553

Reputation: 97

Reading results of gurobi optimisation ("results.sol") in new python script

I am trying to run a rolling horizon optimisation where I have multiple optimisation scripts, each generating their own results. Instead of printing results to screen at every interval, I want to write each of the results using model.write("results.sol") - and then read them back into a results processing script (separate python script).

I have tried using read("results.sol") using Python, but the file format is not recognised. Is there any way that you can read/process the .sol file format that Gurobi outputs? It would seem bizarre if you cannot read the .sol file at some later point and generate plots etc.

Maybe I have missed something blindingly obvious.

Upvotes: 0

Views: 2776

Answers (1)

sascha
sascha

Reputation: 33532

Hard to answer without seeing your code as we have to guess what you are doing.

But well...

When you use

model.write("out.sol")

Gurobi will use it's own format to write it (and what is written is inferred from the file-suffix).

This can easily be read by:

model.read("out.sol")

If you used

x = read("out.sol")

you are using python's basic IO-tools and of course python won't interpret that file in respect to the format. Furthermore reading like that is text-mode (and maybe binary is required; not sure).

General rule: if you wrote the solution using a class-method of class model, then read using a class-method of class model too.

The usage above is normally used to reinstate some state of your model (e.g. MIP-start). If you want to plot it, you will have to do further work. In this case, using python's IO tools might be a good idea and you should respect the format described here. This could be read as csv or manually (and opposed to my remark earlier: it is text-mode; not binary).

So assuming the example from the link is in file gur.sol:

import csv
with open('gur.sol', newline='\n') as csvfile:
    reader = csv.reader((line.replace('  ', ' ') for line in csvfile), delimiter=' ')
    next(reader)  # skip header
    sol = {}
    for var, value in reader:
        sol[var] = float(value)
    print(sol)

Output:

{'z': 0.2, 'x': 1.0, 'y': 0.5}

Remarks:

  • Code is ugly because python's csv module has some limitations
    • Delimiter is two-spaces in this format and we need to hack the code to read it (as only one character is allowed in this function)
  • Code might be tailored to python 3 (what i'm using; probably the next() method will be different in py2)
  • pandas would be much much better for this purpose (huge tool with a very good csv_reader)

Upvotes: 2

Related Questions