如何在C#中引入CPLEX的dll(CPLEX系列-教程一)

以前写在CSDN上的文章。转到博客园之后,打算把这个教程移过来,顺便完善后面的教程。主要是在Asp.Net+EF6里面使用cplex,完成一个最优生产计划的决策。当时在查找如何在C#中引用cplex时,找到的大多是cplex在VS中的环境配置,大都还是以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#的演示程序,可以用来学习。

附上一个较详细的官方教程

.dll引入项目

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位”

运行结果如图:

原文地址:https://www.cnblogs.com/O-xSan/p/10547093.html

时间: 2024-10-06 16:29:49

如何在C#中引入CPLEX的dll(CPLEX系列-教程一)的相关文章

如何在jsp中引入bootstrap

如何在jsp中引入bootstrap包: 1.首先在http://getbootstrap.com/上下载Bootstrap的最新版. 您会看到两个按钮: Download Bootstrap:下载 Bootstrap.点击该按钮,您可以下载 Bootstrap CSS.JavaScript 和字体的预编译的压缩版本.不包含文档和最初的源代码文件. Download Source:下载源代码.点击该按钮,您可以直接从 from 上得到最新的 Bootstrap LESS 和 JavaScript

如何在Html中引入外部页面

通常一个网站的head,foot,rightBar(右侧的条目)都是相同的,这部分内容可以通过引入的方式,否则一旦需要修改,就需要修改十个,二十个,乃至更多的页面,是一项既繁琐但又毫无意义的工作.借助于PHP或者JSP,使用include能够轻松解决此问题,但是如果脱离后端语言,从前端的角度,能不能解决这个问题呢? 1.借助于iframe 首先,最容易想到的应该是使用iframe,虽然html5废除了frame,但是依旧保留了iframe,我们仍可以继续使用,iframe有一个framebode

IOS开发问题录:如何在Swift中引入Head文件?

最近在学习IOS开发,从一个简单的登录开始,逐步解决了一个网络访问.获取控件值等问题,遇到了信息加密的问题. 做为IOS的入门者,信息加密需要解决如下几个问题: 1.IOS的MD5加密有没有固定函数,怎么使用这个函数.. 经过查资料,在Object-C中有内置的函数 2.如何引入Object-C的函数 首先添加头文件,在xode 7 项目上右键 -new File->IOS->Source->HeadFile->下一步设置命名,可以任意命名,在head.h中加入如下代码: #imp

如何在html中引入jsx文件

不使用webpack工具做react项目 1.引入react相关js文件 <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script> <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"><

如何在html 中引入其它html文件

这里给出 三种 html文件引入其它html文件的方法: 1.IFrame引入 <IFRAME NAME="content_frame" width=100% height=30 marginwidth=0 marginheight=0 SRC="import.htm" ></IFRAME> 你会看到一个外部引入的文件,但会发现有一个类似外框的东西将其包围,可使用<iframe name="content_frame"

如何在nuxt中引入scss

安装scss所需要的依赖: npm install css-loader node-sass postcss-loader sass-loader style-loader --save -dev 在assets文件夹下创建一个scss的入口文件,比如是main.scss,里面写上自己的自定义样式 在nuxt.config.js进行配置 然后在每个页面都可以用这个公共scss文件的样式了, 如果想在页面单独引用某一个scss文件的样式 下面这种方式是错误的: import '~/assets/a

【vue】如何在 Vue-cli 创建的项目中引入 iView

根据vue项目的搭建教程,以下记录如何在Vue-cli创建的项目中引入iView. 1)iView的安装,在项目下使用 npm 安装iView cnpm install  iview  --save 2)在 webpack 入口页面 main.js   (E:\managerSys\manager-sys\src\main.js)中 添加 如下配置: import iView from 'iview'; // 导入组件库import 'iview/dist/styles/iview.css';

【vue】如何在 Vue-cli 创建的项目中引入iView

根据vue项目的搭建教程,一下记录下如何在Vue-cli创建的项目中引入iView. 1)安装iView,在项目下 cnpm install  iview  --save 2 ) 在 webpack 入口页面 main.js (E:\managerSys\manager-sys\src\main.js)中配置 import iView from 'iview'; // 导入组件库import 'iview/dist/styles/iview.css'; // 导入样式 Vue.use(iView

如何在web.xml文件中引入其他的xml文件

最近在做一个Servlet+javaBean的项目,服务器用的是tomcat.因此,所有的页面都是servlet请求,而且很多,需要在web.xml文件中进行配置.导致web.xml文件特别大,而且这个系统以后会做大,并且会出现系统拆分,为了便于以后拆分,于是想到将web.xml文件中的servlet和servlet-mapping能够从web.xml脱离出来,用其他xml文件保存然后在web.xml文件中引入这些文件,就想类似引入struts.config一样.        在网上找了半天也