如何在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位”
运行结果如图:
上一篇: 我二姨以为你得了白内障
下一篇: 蚝是啥?有什么营养价值呢