Empty Environments

Some parameters must be set before the Gurobi environment is fully configured. For example, creating a Compute Server environment requires you to first indicate the name of the server. This can be done through the Gurobi license file (gurobi.lic), but we also provide a means of doing this through the programming language APIs. Specifically, you can do this using an empty environment.

The first step is to construct the empty environment. This is done using GRBemptyenv in C, or through one of the provided GRBEnv constructors in the object-oriented interfaces. You then set parameters on this environment using the standard parameter API. Finally, you start the environment, using the GRBstartenv in C, or using the env.start() method in the object-oriented interfaces. This routine will also populate any parameter (ComputeServer, TokenServer, ServerPassword, etc.) specified in your gurobi.lic file. This routine will also check the current working directory for a file named gurobi.env, and it will attempt to read parameter settings from this file if it exists. The file should be in PRM format (briefly, each line should contain a parameter name, followed by the desired value for that parameter).. After that, it will apply all parameter changes specified by the user prior to this call. Note that this might overwrite parameters set in the license file, or in the gurobi.env file, if present.

After all these changes are performed, the code will actually activate the environment, and make it ready to work with models.

In general, you should aim to create a single Gurobi environment in your program, even if you plan to work with multiple models. Reusing one environment is much more efficient than creating and destroying multiple environments. The one exception is if you are writing a multi-threaded program, since environments are not thread safe. In this case, you will need a separate environment for each of your threads.

To give a simple example, if you want your Python program to offload the optimization computation to a Compute Server named server1, you could say:

  env = Env(empty=True)
  env.setParam(GRB.Param.ComputeServer, "server1:61000")
  env.setParam(GRB.Param.ServerPassword, "passwd")
  model = read("misc07.mps", env)

An equivalent Java program would look like this:

  GRBEnv env = new GRBEnv(true);
  env.set(GRB.StringParam.ComputeServer, "server1:61000");
  env.set(GRB.StringParam.ServerPassword, "passwd");
  GRBModel model = new GRBModel(env, "misc07.mps");