以前写在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