1. 程式人生 > >如何在C#中引入CPLEX的dll(CPLEX系列-教程一)

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

++ cep target array release raw req console 6.0

以前寫在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#中引入CPLEX的dll(CPLEX系列-教程一)