在VS2017中配置CPLEX环境(C#为例)

最近因为要做管理信息系统的实验,所以需要用到CPLEX。本人对于C#稍微了解的多一些,但查找了网上的博客,大都是关于C++如何配置。并且觉得稍微有些复杂,所以想写这篇博客供大家参考。

关于下载

我下载的版本是cplex studio12.8.0,可以去官网注册账号并下载试用版或者教育版。其他下载途径自行百度。

安装

下载之后,新建一个文件夹以备安装使用。可以不用安装在C盘当中,安装后的文件夹如图所示:
在这里插入图片描述
在这些文件夹当中,包含有C#、java、matlab、python等的教程(英文版),以及提供的样例。以C#为例:
教程位于~\cplex\dotnet.html当中。
样例在~\cplex\examples\x64_windows_vs2017\stat_mda当中。
双击打开其中的examples.cs.net.sln文件,其中有很多C#的演示程序,可以用来学习。
附上一个较详细的官方教程

环境配置

  1. 打开VS2017,新建一个C#控制台应用程序,用来做配置效果的测试。
  2. 点击“项目”-“添加引用”(或者直接在解决方案“引用”上,右键添加引用)
  3. 浏览文件夹,找到你的安装位置。打开“~\cplex\bin\x64_win64”目录,选择其中的这两个添加入你的项目当中:
    在这里插入图片描述
  4. 可以从样例代码中复制一个做测试,比如:
using ILOG.Concert;
using ILOG.CPLEX;
public class Blend
   {
       internal static int _nbElements = 3;
       internal static int _nbRaw = 2;
       internal static int _nbScrap = 2;
       internal static int _nbIngot = 1;
       internal static double _alloy = 71.0;

       internal static double[] _cm = { 22.0, 10.0, 13.0 };
       internal static double[] _cr = { 6.0, 5.0 };
       internal static double[] _cs = { 7.0, 8.0 };
       internal static double[] _ci = { 9.0 };
       internal static double[] _p = { 0.05, 0.30, 0.60 };
       internal static double[] _P = { 0.10, 0.40, 0.80 };

       internal static double[][] _PRaw = {new double[] {0.20, 0.01},
                                      new double[] {0.05, 0.00},
                                      new double[] {0.05, 0.30}};
       internal static double[][] _PScrap = {new double[] {0.00, 0.01},
                                        new double[] {0.60, 0.00},
                                        new double[] {0.40, 0.70}};
       internal static double[][] _PIngot = {new double[] {0.10},
                                        new double[] {0.45},
                                        new double[] {0.45}};


       public static void Main(string[] args)
       {
           try
           {
               Cplex cplex = new Cplex();

               INumVar[] m = cplex.NumVarArray(_nbElements, 0.0, System.Double.MaxValue);
               INumVar[] r = cplex.NumVarArray(_nbRaw, 0.0, System.Double.MaxValue);
               INumVar[] s = cplex.NumVarArray(_nbScrap, 0.0, System.Double.MaxValue);
               INumVar[] i = cplex.NumVarArray(_nbIngot, 0.0, System.Double.MaxValue);
               INumVar[] e = new INumVar[_nbElements];

               // Objective Function: Minimize Cost
               cplex.AddMinimize(cplex.Sum(cplex.ScalProd(_cm, m),
                                           cplex.ScalProd(_cr, r),
                                           cplex.ScalProd(_cs, s),
                                           cplex.ScalProd(_ci, i)));

               // Min and max quantity of each element in alloy
               for (int j = 0; j < _nbElements; j++)
               {
                   e[j] = cplex.NumVar(_p[j] * _alloy, _P[j] * _alloy);
               }

               // Constraint: produce requested quantity of alloy
               cplex.AddEq(cplex.Sum(e), _alloy);

               // Constraints: Satisfy element quantity requirements for alloy
               for (int j = 0; j < _nbElements; j++)
               {
                   cplex.AddEq(e[j],
                               cplex.Sum(m[j],
                                         cplex.ScalProd(_PRaw[j], r),
                                         cplex.ScalProd(_PScrap[j], s),
                                         cplex.ScalProd(_PIngot[j], i)));
               }

               if (cplex.Solve())
               {
                   if (cplex.GetStatus().Equals(Cplex.Status.Infeasible))
                   {
                       System.Console.WriteLine("No Solution");
                       return;
                   }

                   double[] mVals = cplex.GetValues(m);
                   double[] rVals = cplex.GetValues(r);
                   double[] sVals = cplex.GetValues(s);
                   double[] iVals = cplex.GetValues(i);
                   double[] eVals = cplex.GetValues(e);

                   // Print results
                   System.Console.WriteLine("Solution status = " + cplex.GetStatus());
                   System.Console.WriteLine("Cost:" + cplex.ObjValue);

                   System.Console.WriteLine("Pure metal:");
                   for (int j = 0; j < _nbElements; j++)
                       System.Console.WriteLine("(" + j + ") " + mVals[j]);

                   System.Console.WriteLine("Raw material:");
                   for (int j = 0; j < _nbRaw; j++)
                       System.Console.WriteLine("(" + j + ") " + rVals[j]);

                   System.Console.WriteLine("Scrap:");
                   for (int j = 0; j < _nbScrap; j++)
                       System.Console.WriteLine("(" + j + ") " + sVals[j]);

                   System.Console.WriteLine("Ingots : ");
                   for (int j = 0; j < _nbIngot; j++)
                       System.Console.WriteLine("(" + j + ") " + iVals[j]);

                   System.Console.WriteLine("Elements:");
                   for (int j = 0; j < _nbElements; j++)
                       System.Console.WriteLine("(" + j + ") " + eVals[j]);
               }
               cplex.End();
           }
           catch (ILOG.Concert.Exception exc)
           {
               System.Console.WriteLine("Concert exception '" + exc + "' caught");
           }
           System.Console.ReadKey();
       }
   }

看了其他教程中,说要将解决方案启动配置为Release,但后面试了一下选为Debug也可以正常使用。若是shell窗体一闪消失,可以在末尾加一句Console.ReadKey();
5.若是出现以下错误,选择“项目”-你的“项目属性”-“生成”,取消“首选32位”在这里插入图片描述

在这里插入图片描述
附上运行结果:

在这里插入图片描述
以上!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值