C#中使用Gurobi进行规划求解

目录

1 C#中的Gurobi的配置

1.1 添加引用

1.2 将编译环境配置为64位

2 官方代码测试及结果


1 C#中的Gurobi的配置

1.1 添加引用

  • 新建C#应用程序
  • 添加Gurobi的dll引用,方法为找到gurobi的安装目录的bin目录下找到

img

  • 在cs文件中引用 Gurobi

img

1.2 将编译环境配置为64位

img

2 官方代码测试及结果

官方的C#示例存放在gurobi安装路径的:examples\C#中,本次演示的示例是workforce1_cs.cs

workforce1_cs.cs

/* Copyright 2019, Gurobi Optimization, LLC */



 



/* Assign workers to shifts; each worker may or may not be available on a



   particular day. If the problem cannot be solved, use IIS to find a set of



   conflicting constraints. Note that there may be additional conflicts



   besides what is reported via IIS. */



 



using System;



using Gurobi;



 



class workforce1_cs



{



    static void Main()



    {



        try



        {



 



            // Sample data



            // Sets of days and workers



            string[] Shifts =



                new string[] { "Mon1", "Tue2", "Wed3", "Thu4", "Fri5", "Sat6",



              "Sun7", "Mon8", "Tue9", "Wed10", "Thu11", "Fri12", "Sat13",



              "Sun14" };



            string[] Workers =



                new string[] { "Amy", "Bob", "Cathy", "Dan", "Ed", "Fred", "Gu" };



 



            int nShifts = Shifts.Length;



            int nWorkers = Workers.Length;



 



            // Number of workers required for each shift



            double[] shiftRequirements =



                new double[] { 3, 2, 4, 4, 5, 6, 5, 2, 2, 3, 4, 6, 7, 5 };



 



            // Amount each worker is paid to work one shift



            double[] pay = new double[] { 10, 12, 10, 8, 8, 9, 11 };



 



            // Worker availability: 0 if the worker is unavailable for a shift



            double[,] availability =



                new double[,] { { 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1 },



              { 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 },



              { 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 },



              { 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 },



              { 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1 },



              { 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1 },



              { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };



 



            // Model



            GRBEnv env = new GRBEnv();



            GRBModel model = new GRBModel(env);



 



            model.ModelName = "assignment";



 



            // Assignment variables: x[w][s] == 1 if worker w is assigned



            // to shift s. Since an assignment model always produces integer



            // solutions, we use continuous variables and solve as an LP.



            GRBVar[,] x = new GRBVar[nWorkers, nShifts];



            for (int w = 0; w < nWorkers; ++w)



            {



                for (int s = 0; s < nShifts; ++s)



                {



                    x[w, s] =



                        model.AddVar(0, availability[w, s], pay[w], GRB.CONTINUOUS,



                                     Workers[w] + "." + Shifts[s]);



                }



            }



 



            // The objective is to minimize the total pay costs



            model.ModelSense = GRB.MINIMIZE;



 



            // Constraint: assign exactly shiftRequirements[s] workers



            // to each shift s



            for (int s = 0; s < nShifts; ++s)



            {



                GRBLinExpr lhs = 0.0;



                for (int w = 0; w < nWorkers; ++w)



                    lhs.AddTerm(1.0, x[w, s]);



                model.AddConstr(lhs == shiftRequirements[s], Shifts[s]);



            }



 



            // Optimize



            model.Optimize();



            int status = model.Status;



            if (status == GRB.Status.UNBOUNDED)



            {



                Console.WriteLine("The model cannot be solved "



                    + "because it is unbounded");



                return;



            }



            if (status == GRB.Status.OPTIMAL)



            {



                Console.WriteLine("The optimal objective is " + model.ObjVal);



                return;



            }



            if ((status != GRB.Status.INF_OR_UNBD) &&



                (status != GRB.Status.INFEASIBLE))



            {



                Console.WriteLine("Optimization was stopped with status " + status);



                return;



            }



 



            // Do IIS



            Console.WriteLine("The model is infeasible; computing IIS");



            model.ComputeIIS();



            Console.WriteLine("\nThe following constraint(s) "



                + "cannot be satisfied:");



            foreach (GRBConstr c in model.GetConstrs())



            {



                if (c.IISConstr == 1)



                {



                    Console.WriteLine(c.ConstrName);



                }



            }



 



            // Dispose of model and env



            model.Dispose();



            env.Dispose();



 



        }



        catch (GRBException e)



        {



            Console.WriteLine("Error code: " + e.ErrorCode + ". " +



                e.Message);



        }



    }



}

示例结果:

img

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值