热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

 

 

运行结果如图:


推荐阅读
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文是关于C#类型系统、值类型和引用类型的概念性笔记。介绍了C#1系统类型的三个特性,静态类型的含义,显式类型和隐式类型的区别。还讨论了类、结构、数组类型、枚举、委托类型和接口类型属于哪一种类型。同时纠正了关于结构、引用类型和对象传递的错误表述。最后提到了C#4中使用动态类型的关键字。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 作者表示自己最近工作非常忙碌,无法抽出时间写作。他计划在未来的几天内写关于namespace与C#的名字解析以及数据库内容转化为excel文件下载的知识。 ... [详细]
  • 本文介绍了在C#中SByte类型的GetHashCode方法,该方法用于获取当前SByte实例的HashCode。给出了该方法的语法和返回值,并提供了一个示例程序演示了该方法的使用。 ... [详细]
author-avatar
miss文女1977
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有