How can I analyse multiple outputs of a model, and compare the results?
進行中I have this model:
I would like to run multiple models, changing alfa1, alfa2 and Beta values that are basically lists containing constant term. I would like to performa a sort of sensitivity analysis on these parameters.
Thanks

-
正式なコメント
This post is more than three years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum, or try Gurobot, our chatbot interface offering instant, expert-level support. -
Hi Alessandro,
you would need to use some of Gurobi's APIs to encode the model which you pasted. Then, you could use a loop to change the values of alfa1, alfa2 and Beta in your objective function and optimize; afterward, you could store the solutions under the selected alfa1, alfa2 and Beta values in a dictionary or another data structure.
Since I don't know which Gurobi API you use, I can't give you more guidance here. If you are unfamiliar with Gurobi APIs, here is an excellent introduction to Gurobi with Python. You can also have a look here.
Best regards
Jonasz0 -
Thank you Jonasz,
I am using Python, I've already encoded the model but I don't know how to store the solutions in a dictionary or in another data structure. Once I used this command:
model.write('out.sol')
I don't know how to create dictionary or dataframes out of it.
Thanks.
0 -
Hi Alessandro,
thanks for the clarification. Assuming your Gurobi model is properly defined as model, there are several approaches you could try:
1. If you need only optimal values for your sensitivity analysis, you would need to initialize an empty dict before your optimizations start, say:
solutions = {}Then, after each optimization run, you could store the optimal value by:
solution[(alfa1, alfa2, Beta)] = model.getObjective().getValue()
2. If you need information about each variable, you can initialize the solutions dict as above and then, after each optimization run:
solution[(alfa1, alfa2, Beta)] = {v.VarName: v.X for v in model.getVars()}3. You can also use
model.write(f'out_{alfa1}_{alfa2}_{Beta}.sol')after each optimization run to store the solutions separately for each set of parameters.
Happy Easter!
Jonasz1 -
Hi Jonasz! Thank you for these info.
More specifically, if alfa=[0,5,10,15], alfa2=[0,5,10,15] and beta=[1,1.1,1.5], I would like just to run every possible combination and compare the outputs. ( for example just comparing the objective function value between different combinations: let's say alfa1= 5 alfa2= 10 and beta=1.5 with alfa1=0, alfa2=10, and beta=1.
Using model.getObjective().getValue() I will have just the optimal values for minimizing the function, but that is not my case.
Thanks!
0 -
Hi Alessandro,
I am uncertain as to how to help you further here.
If you need to check all the combinations, you can use three for loops, for example in the following fashion:
alfas1 = [0,5,10,15]
alfas2 = [0,5,10,15]
betas = [1,1.1,1.5]
for alfa1 in alfas1:
for alfa2 in alfas2:
for beta in betas:
# ...Moreover, in the previous post, I gave you three ideas for storing the output of the models for comparison. I would need more information to better understand what is the "output" you need. I will then gladly help you further.
Best regards
Jonasz0 -
Hi Jonasz. Yes with 3 loops I can obtain all the combinations. I think is the right way of doing.
But I would like to store somewhere (for every single model in the for cycle), the .sol file ( that have decision variables with optimal values). If there is not a way to store the .sol file, I need to store separately decision variables and their values?

This is an example of .sol file of my model. x is one of the three decision variables, and has 3 indices. i,j,k
i represent the origin(O), j the destination (D) and k the hub (FROM). Since I need to analyse these indices for my analysis I cannot use the getAttr('X') because it gives me this: ( in this way I cannot recognize the indices)
[5, 82, 159, 236, 313, 390, 467, 544, 636, 713, 775, 852, 929, 1006, 1085, 1182, 1329, 1483, 1637, 1791, 1868, 1945, 2022, 2099, 2176, 2253, 2330, 2407, 2561, 2715, 2792, 2869, 2946, 3023, 3100, 3177, 3254, 3331, 3408, 3485, 3562, 3646, 3716, 3793, 3877, 3954, 4031, 4108, 4185, 4262, 4339, 4416, 4493, 4647, 4724, 4805, 4882, 4964, 5041, 5118, 5195, 5272, 5349, 5426, 5503, 5580, 5657, 5734, 5811, 5888, 5965, 6042, 6119, 6196, 6273, 6350, 6427, 6504, 6581, 6658, 6735, 6812, 6889, 6966, 7043, 7120, 7197, 7274, 7351, 7428, 7505, 7582, 7659, 7736, 7813, 7890, 7967, 8044, 8121, 8198, 8275, 8352, 8429, 8506, 8660, 8814, 8968, 9045, 9122, 9199, 9276, 9353, 9430, 9584, 9738, 9892, 10046, 10200, 10277, 10354, 10431, 10508, 10585, 10662, 10816, 10893, 10970, 11124, 11201, 11278, 11509, 11663, 11740, 11817, 11863, 11865, 11878, 11885, 11889, 11894, 11951, 11953, 11955, 11957, 11967, 11969, 11994, 12046, 12048, 12050, 12058, 12060, 12062, 12064, 12066, 12074, 12078, 12082, 12083, 12085]
0 -
Hi Alessandro,
take a look at my post from 16.04 above. I suggest there how to write separate .sol file for each of your optimization runs. For your convenience, I will paste it again.
The following line of code after each
model.write(f'out_{alfa1}_{alfa2}_{Beta}.sol')will output a separate sol file for each set of parameters. Its name will suggest which parameters were used for that particular solution.
Hope this helps!
Best regards
Jonasz0 -
Hi Jonasz!
I need another help, would be really kind from you..
I need to add an INTEGER DECISION VARIABLE called p=[2,4,5...10], with integer values. More specifically, I am referring to the p present in the image in the third constraint of the model. After introducing in the objective function (hierarchically or blended idk) something ike : min p*10000 I want my model to decide which value should p assume. How I can add this variable? I know there is m.addVar(vtype=GRB.INTEGER) but I don't know how to specify the values..
And as I said before I would like to bind this choice in the objective function with the value in the third constraint.
Thanks,
Alessandro
0 -
Hi Alessandro,
is the set p continuous, or does it contain all the integers between 2 and 10?
If yes, you can just set the appropriate bounds:
p = m.addVar(vtype=GRB.INTEGER, lb=2, ub=10)
If not, you will need to make a small trick, which I described here.
Best regards
Jonasz0
投稿コメントは受け付けていません。
コメント
10件のコメント