GUROBI:在云/常规模式之间切换

时间:2015-11-30 08:10:09

标签: c# .net wcf windows-services gurobi

我们已将Gurobi WCF解决方案作为Windows服务托管。

                    if (useCloud)
                    {
                        this.logInfo("Environment GRB_LICENSE_FILE: " + System.Environment.GetEnvironmentVariable("GRB_LICENSE_FILE"));
                        return new GurobiProblemBuilder(this, new testSolver.solver.gurobi.Net.EnvironmentNet(this.settings.cloudLic, this.settings.cloudPwd));
                    }
                    else
                    {
                        this.logInfo("Environment GRB_LICENSE_FILE: " + System.Environment.GetEnvironmentVariable("GRB_LICENSE_FILE"));
                        return new GurobiProblemBuilder(this, new testSolver.solver.gurobi.Net.EnvironmentNet(null));             
                    }

在UI中,我们提供了转到云并由'useCloud'标志处理的选项。但问题是我们必须每次都重启服务以在云/非云选项之间切换。即使在正确设置环境变量之后,服务也无法透明地在云/非云之间切换。

于2015年12月1日添加

    public EnvironmentNet(string logFileOrNull)
    {
        environment = new GRBEnv(null);        
    }

    public EnvironmentNet(string computeServer, string password)
    {
        // http://www.gurobi.com/documentation/6.0/refman/cs_grbenv2.html
        int port = -1; // read from app.config            
        int priority =  0; // read from app.config
        double timeout = -1; // read from app.config

        environment = new GRBEnv(null, computeServer, port, password,    priority, timeout);                            
    }

实际上我们的GurobiProblemBuilder调用GRBEnv,然后它调用GRBEnv(null)或GRBEnv(null,computeServer,端口,密码,优先级,超时)版本取决于用户选择使用云或本地服务器。但我们仍然无法透彻地在计算服务器和本地服务器之间切换。这归结为Gurobi从GRB_LICENSE_FILE环境变量中获取许可证文件。有没有计划提供将GRB_LICENSE_FILE传递给Gurobi求解器的不同方法?

我们的解决方法: 我们的方法是在使用云时使用GRB_LICENSE_FILE = gurobi.lic.cloud。如果是非云GRB_LICENSE_FILE = gurobi.lic。我们可能需要使用常见的gurobi.lic文件并使用计算服务器或常规服务器进行覆盖。

1 个答案:

答案 0 :(得分:1)

System.Environment.GetEnvironmentVariable将返回当前流程(例如您的服务流程)的环境变量的当前值。进程环境变量仅在启动进程时从系统环境变量继承。因此,需要重启是预期的行为。

通常,如果要使用具有不同许可证文件的多个Gurobi实例,则需要启动单独的进程。在.NET情况下,仅在加载.NET程序集之前考虑对环境变量GRB_LICENSE_FILE的更改,通常是在您第一次创建GRBEnv对象时。

但是,在您的情况下,可能会有一个更简单的解决方案。您始终可以创建Gurobi Compute Server环境并使用您的云服务器(请参阅http://www.gurobi.com/documentation/6.5/refman/cs_grbenv2.html)。

GRBEnv(string logFileName,
       string computeserver,
       int port,
       string password,
       int priority,
       double timeout)

您不需要云许可证文件来创建Compute Server环境,因此只需使用本地许可证文件即可。在本地环境中创建模型以在本地计算机上解决模型,并在Compute Server环境中创建模型,以防您想要在云中解决模型。