运筹优化学习20:C#调用Cpex入门指南

简介: 运筹优化学习20:C#调用Cpex入门指南

C#调用Cplex入门基础总结

1 创建模型实例

Cplex myCplexSolver = new Cplex();

这一步相当与创建了一个Cplex的一个对象,后面将使用这个对象进行变量定义、目标函数、约束及决策变量的界

2 创建目标函数

//使用默认参数,构建最大值问题的目标函数
IObjective myObjFunc = myCplexSolver.AddMaximize();
IObjective myObjFunc = myCplexSolver.AddMinimize();
//使用变量加系数的方式构建目标函数--批量添加模式
//函数参数为:INumExpr,由变量数组和系数数组相乘构建
IObjective myObjFunc = myCplexSolver.AddMinimize(myCplexSolver.Prod(DV,COFFS));

注释:

Cplex.Prod(INumExpr[], double[]);第一个参数是决策变量数组,第二个参数是决策变量的系数数组

//向模型中动态添加单个决策变量的方法
myCplexSolver.NumVar(myCplexSolver.Column(myObjFunc, coff), lb, ub, varName);
//参数解释:要向目标函数中添加的列,该列有目标函数对象和系数构成;下界,上界,变量名称

3 变量的定义

  • 定义变量的名字
  • 使用变量名字构建Cplex的数值变量
string[] varNames = new varNames[varsCnt];
INumExpr[] varNE = myCplexSolver.NumVarArray(varsCnt, lb, ub, vasNames);
//其中的lb可以是数组,也可以使数值;如果为数组则是每个变量有自己独有的界;若为数值,表示所有变量的界是相同的

4 添加约束

添加约束的方法按照行的形式和按照列的形式;

  1. 按照行的形式使用函数如下
//添加小于等于约束myCplexSolver.AddLe();
//有多个重载版本:
//--1 值 <= 表达式 [val <= expr]
IRange AddLe(Double, INumExpr);
//--2 表达式 <= 表达式 [e1 <= e2]
AddLe(INumExpr, INumExpr)
//--3 表达式 <= 值 [expr <= rhs]
IRange AddLe(INumExpr expr,double rhs)
//--4 值 <= 表达式,约束带名字
AddLe(Double, INumExpr, String)
//--5 表达式 <= 表达式,约束带名字 [e1 <= e2]
AddLe(INumExpr, INumExpr, String)
//添加大于等于约束myCplexSolver.AddGe();
//大于等于约束使用函数:myCplexSolver.AddGe();>= 同上,有5个重载版本
//等式约束使用函数:myCplexSolver.AddEq(); 同上,有五个重载版本
  1. 按列方式添加约束

image.png

5 模型求解与输出

//求解模型
myCplexSolver.Solve();
//导出模型:可导出如下格式:.sav, .mps, .Lp, .sav.Gz, .mps.Gz, .Lp.Gz, .Bz2
myCplexSolver.ExportModel("fileName.lp");
//输出解决方案文件:sol后缀
myCplexSolver.WriteSolutions("solmdp.sol");
//获取解的状态:返回值为Cplex.Status类型
myCplexSolver.GetStatus();
//得到变量的值
myCplexSolver.GetVaules();

6 LP、MPS模型文件解释与Cplex导入模型求解


为了实现不同求解器之间的模型通用,我们可以将Cplex的模型导入到Gurobi等求解器去求解,常用的是lp格式和MPS格式。

这节讲述两种文件的定义和一个读入外部模型的示例程序


6.1 LP文件的解释

20200209133752555.png

LP文件非常清晰明了,但貌似规划软件对 mps 文件支持的更好。其中需要注意的是

  • Bounds 里面若有 free 表示该变量无上下界
  • General 表示整数变量
  • Binary 表示二进制变量
  • \ 表示注释


6.2 MPS文件解释

上面问题的 MPS 文件内容为:


20200209133611734.png

下面详细解释这个 MPS 文件:


NAME: 表示这个优化模型的名字,后面可以不写内容


ROWS: 每一行,包括目标函数与约束条件


(1) N 表示自由行, obj是对目标函数的命名,可以任意取


(2) L 表示该行小于等于, c1是对改行的命名,可以任意取名


(3) G 表示该行大于等于


(4) E 表示该行等于


COLUMNS: 每一列,及对应的系数

(1) 下面的第一列要空

(2) 下面的第二列表示列的名字,其实就是求解变量

(3) 下面的第三列表示所在行的名字

(4) 下面的第四列表示所在行与列对应的系数

(5) 其中 MARK0000 ‘MARKER’ ‘INTORG’ , MARK0001 ‘MARKER’ ‘INTEND’ 分别表示整数变量的起止

(6) 第五列、第六列分别与第三列、第四列的含义相同。


RHS: 约束条件最右端的数字

(1) 下面的第一列要空

(2) 下面的第二列表示 rhs 名字,可以任取

(3) 下面的第三列表示所在行的名字

(4) 下面的第四列表示所在行对应的 RHS 值

(5) 第五列、第六列分别与第三列、第四列的含义相同。


Bounds: 表示各变量的上界或下界

(1) LO 表示下界

(2) UP 表示上界

(3) FX 表示该变量固定值

(4) FR 表示改变量的范围为 (−∞,∞)(-\infty,\infty)(−∞,∞)

(5) MI 表示下界为负无穷

(6) PL 表示上界为正无穷

MPS 变量默认的范围为 [0,∞)[0,\infty)[0,∞)


ENDDATA: 表示 MPS 文件结束


6.3 导入模型的代码

string modelName = "my.lp";
Cplex my = new Cplex();
my.ImportModel(modelName);
my.SetParam(Cplex.Param.RootAlgorithm, Cplex.Algorithm.Primal);
my.Solve();
if (my.GetStatus() == Cplex.Status.Optimal)
{
       System.Console.WriteLine("解的状态:" + my.GetStatus());
       System.Console.WriteLine(my.GetObjValue());
       my.WriteSolutions("solmdp.sol");           
}
   System.Console.WriteLine("解的状态:" + my.GetStatus());
   System.Console.WriteLine(my.GetObjValue());
   my.WriteSolutions("solmdp.sol");           
相关文章
|
1月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
2月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
77 7
|
2月前
|
C#
C#入门
C#入门
28 0
|
14天前
|
缓存 API C#
C# 一分钟浅谈:GraphQL 优化与性能提升
本文介绍了 GraphQL API 的常见性能问题及优化方法,包括解决 N+1 查询问题、避免过度取数据、合理使用缓存及优化解析器性能,提供了 C# 实现示例。
63 33
|
1月前
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
|
2月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
69 8
|
2月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
3月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
112 2
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
3月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
88 0
下一篇
DataWorks