若还未在项目中添加cplex的引用,可以参阅上一篇文章。本文主要介绍利用C#求解线性规划的步骤,对线性规划模型进行数据填充的两种方法,以及一些cplex函数的功能和用法。包括以下几个步骤:

描述

先花时间理清问题。明确决策变量及其取值范围,目标函数,约束条件,已知的数据。后面代码的编写也是沿着这个思路,先理清问题后面的工作会更有效率。以如下问题为例:

先建立数学模型:
令:i产品在j机器上加工的小时数为xij
决策变量:x11,x12,x21,x22
目标函数:Min(z)=50x11+70x12+50x21+70x22
约束条件:
x12+x22<=112,
x11+x21<=104,
20x11+40x12=3200,
10x21+30x22=2000,
xij>=0(i=1,2;j=1,2)

模型

创建模型对象

//实例化一个空模型
Cplex cplexModel = new Cplex();

方法1:使用行方法填充模型

//生成决策变量并约束范围

 INumVar[][] deVar=new INumVar[1][];//交叉数组用于存储决策变量
double[]lb= {0.0, 0.0, 0.0,0.0}; //lb(low bound)与ub定义决策变量的上下界
double[]ub={double.MaxValue,double.MaxValue,double.MaxValue,double.MaxValue};
string []deVarName={"x11","x12","x21","x22"};//决策变量名
INumVar[]x=cplexModel.NumVarArray(4,lb,ub,deVarName);//生成决策变量
deVar[0]=x; //生成目标函数 double[]objCoef={50.0,70.0,50.0,70.0};//目标函数系数(object coefficient)
cplexModel.AddMinimize(cplexModel.ScalProd(x, objCoef));//数量相乘(scalar product) //生成约束条件
IRange[][] rng = new IRange[1][];//存放约束
rng[0] = new IRange[4];
//AddLe为<=,AddGe为>=,AddEq为=
rng[0][0] = cplexModel.AddLe(
cplexModel.Sum(cplexModel.Prod(1.0, x[3]),
cplexModel.Prod( 1.0, x[1])), 112.0, "c1");
rng[0][1] = cplexModel.AddLe(
cplexModel.Sum(cplexModel.Prod(1.0, x[0]),
cplexModel.Prod( 1.0, x[2])), 104.0, "c2");
rng[0][2] = cplexModel.AddEq(
cplexModel.Sum(cplexModel.Prod(20.0, x[0]),
cplexModel.Prod( 40.0, x[1])), 3200.0, "c3");
rng[0][3] = cplexModel.AddEq(
cplexModel.Sum(cplexModel.Prod(10.0, x[2]),
cplexModel.Prod( 30.0, x[3])), 2000.0, "c4");

方法2:使用列方法填充模型  

 IObjective obj =cplexModel.AddMinimize();//目标函数,此时是空的
//约束
IRange[][] rng=new IRange[1][];
rng[0]=new IRange[4];
rng[0][0] = cplexModel.AddRange(-double.MaxValue, 112.0, "c1");//<=112
rng[0][1] = cplexModel.AddRange(-double.MaxValue, 104.0, "c2");
rng[0][2] = cplexModel.AddRange(3200.0,3200.0, "c3");//=3200
rng[0][3] = cplexModel.AddRange(2000.0,2000.0, "c4");
//简化引用的书写
IRange r0 = rng[0][0];
IRange r1 = rng[0][1];
IRange r2 = rng[0][2];
IRange r3 = rng[0][3];
//决策变量
INumVar[][]deVar=new INumVar[1][];
deVar[0]=new INumVar[4];//4个决策变量
deVar[0][0] = cplexModel.NumVar(cplexModel.Column(obj, 50.0).And(
cplexModel.Column(r1, 1.0).And(
cplexModel.Column(r2, 20.0))),
0.0, double.MaxValue, "x11");//最后一行为取值和名称
deVar[0][1] = cplexModel.NumVar(cplexModel.Column(obj, 70.0).And(
cplexModel.Column(r0, 1.0).And(
cplexModel.Column(r2, 40.0))),
0.0, double.MaxValue, "x12");
deVar[0][2] = cplexModel.NumVar(cplexModel.Column(obj, 50.0).And(
cplexModel.Column(r1, 1.0).And(
cplexModel.Column(r3, 10.0))),
0.0, double.MaxValue, "x21");
deVar[0][3] = cplexModel.NumVar(cplexModel.Column(obj, 70.0).And(
cplexModel.Column(r0, 1.0).And(
cplexModel.Column(r3, 30.0))),
0.0, double.MaxValue, "x22");

求解模型并展示  

if (cplexModel.Solve())
{
int nvars = cplexModel.GetValues(deVar[0]).Length;
for (int j = 0; j < nvars; ++j)
{
cplexModel.Output().WriteLine("Variable " + j +": Value = " + cplexModel.GetValues(deVar[0])[j] );
}
}

导出模型  

cplexModel.ExportModel("lpex1.lp");

文件在“你的项目\bin\debug”显示如下图:

  

完整代码和求解结果

using ILOG.Concert;
using ILOG.CPLEX;
using System; public class LPex1
{
public static void Main(string[] args)
{
try
{
//实例化一个空模型
Cplex cplexModel = new Cplex();
//生成决策变量并赋值
INumVar[][] deVar = new INumVar[1][];
double[] lb = { 0.0, 0.0, 0.0, 0.0 };
double[] ub = { double.MaxValue, double.MaxValue, double.MaxValue, double.MaxValue };
string[] deVarName = { "x11", "x12", "x21", "x22" };
INumVar[] x = cplexModel.NumVarArray(4, lb, ub, deVarName);
deVar[0] = x;
//目标函数
double[] objCoef = { 50.0, 70.0, 50.0, 70.0 };//目标函数系数(object coefficient)
cplexModel.AddMinimize(cplexModel.ScalProd(x, objCoef));
//约束条件
IRange[][] rng = new IRange[1][];
rng[0] = new IRange[4];
rng[0][0] = cplexModel.AddLe(cplexModel.Sum(cplexModel.Prod(1.0, x[3]),
cplexModel.Prod(1.0, x[1])), 112, "c1");
rng[0][1] = cplexModel.AddLe(cplexModel.Sum(cplexModel.Prod(1.0, x[0]),
cplexModel.Prod(1.0, x[2])), 104.0, "c2");
rng[0][2] = cplexModel.AddEq(cplexModel.Sum(cplexModel.Prod(20.0, x[0]),
cplexModel.Prod(40.0, x[1])), 3200.0, "c3");
rng[0][3] = cplexModel.AddEq(cplexModel.Sum(cplexModel.Prod(10.0, x[2]),
cplexModel.Prod(30.0, x[3])), 2000.0, "c4");
cplexModel.ExportModel("lpex1.lp"); if (cplexModel.Solve())
{
int nvars = cplexModel.GetValues(deVar[0]).Length;
for (int j = 0; j < nvars; ++j)
{
cplexModel.Output().WriteLine("Variable " + j +": Value = " + cplexModel.GetValues(deVar[0])[j] );
}
}
cplexModel.End();
}
catch (ILOG.Concert.Exception e)
{
System.Console.WriteLine("Concert exception '" + e + "' caught");
}
Console.ReadKey();
}
}

决策变量较多时,请使用循环。本文重在入门和对cplex库中一些概念的理解。  

C#使用cplex求解简单线性规划问题(Cplex系列-教程二)的更多相关文章

  1. 装箱问题的CPLEX求解

    装箱问题(Bin Packing Problem) 装箱问题即搬家公司问题.一个搬家公司有无限多的箱子,每个箱子的承重上限为W,当搬家公司进入一个房间时,所有物品都必须被装入箱子,每个物品的重量为wi ...

  2. 【CPLEX教程03】java调用cplex求解一个TSP问题模型

    00 前言 前面我们已经搭建好cplex的java环境了,相信大家已经跃跃欲试,想动手写几个模型了.今天就来拿一个TSP的问题模型来给大家演示一下吧~ CPLEX系列教程可以关注我们的公众号哦!获取更 ...

  3. 基于Simple Image Statistics(简单图像统计,SIS)的图像二值化算法。

    这是个简单的算法,是全局二值算法的一种,算法执行速度快. 算法过程简单描述如下: 对于每一个像素,做如下处理 1.计算当前像素水平和垂直方向的梯度. (two gradients are calcul ...

  4. 超简单的JNI——NDK开发教程

    不好意思各位,我按照网上一些教程进行JNI开发,折腾了半天也没成功,最后自己瞎搞搞定了,其实超简单的,网上的教程应该过时了,最新版的AS就包含了NDK编译的功能,完全不用手动javah,各种包名路径的 ...

  5. 简单详细的OD破解教程

    2007-08-04 15:46作者:CCDebuger注:昨天在网上见到了这篇文章,但缺少插图,从另外一篇文章中也看到了类似的的教程文章,里面的插图质量实在不敢恭维.在一个论坛中正好下载了文章中所介 ...

  6. PHP简单的长文章分页教程 附源码

    PHP简单的长文章分页教程 附源码.本文将content.txt里的内容分割成3页,这样浏览起来用户体验很好. 根据分页参数ipage,获取对应文章内容 include('page.class.php ...

  7. RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World(转载)

    RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World 一.简介 RabbitMQ是一个消息的代理器,用于接收和发送消息,你可以这样想,他就是一个邮局,当您把需要寄送的邮件投递到 ...

  8. Python基础笔记系列十二:requests模块的简单应用

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! httpbin httpbin这个网站能测试 HTTP 请求和响应的各种信 ...

  9. Unreal Engine 4 系列教程 Part 5:制作简单游戏

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

随机推荐

  1. js简单校验form表单

    /** * 数据简单校验 */ function checkData (formId) { var check = true; var emailReg = new RegExp("^[a- ...

  2. 【校招面试 之 C/C++】第3题 为什么要内存对齐?以及内存对齐的方式

    1.为什么要进行内存对? 参考:https://blog.csdn.net/a369000753/article/details/51188915 所谓内存对齐,是为了让内存存取更有效率而采用的一种编 ...

  3. html&css精华总结

    1.标题标签 h标签 2.段落标签 p 3.换行 br 4.空格   5.大于号,小于号 > < 6.双引号 " 7.版权符号 © 8.注册符 ® --------------- ...

  4. discuz回贴通知插件实现-显示用户状态设置

    一.完善用户是否开启回贴通知 回贴通知插件建立模块时,指定了核心文件post_set.inc.php   1.创立好数据库 建立独立数据表(不建议直接修改原有的discuz数据库,防止discuz升级 ...

  5. c#/vb调用c编写的标准dll

    准备: 首先打开vc++ 6.0新建工程,选择Win32 Dynamic Link-Library,命名为stdLibrary 新建library.cpp文件,内容如下 #include <st ...

  6. yaf框架安装配置

    YAF中文文档:http://www.laruence.com/manual/index.html 1 YAF框架是用C开发的,属于PHP的扩展框架: 2 YAF的性能相对于源生PHP,性能只降低不到 ...

  7. Codeforces 677C. Coloring Trees dp

    C. Coloring Trees time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  8. 用Vue-cli生成vue+webpack的项目模板怎么设置为vue1.0版本?

    用Vue-cli生成vue+webpack的项目模板 $ npm install -g vue-cli $ vue init webpack my-project $ cd my-project $ ...

  9. Jmeter参数化HTTP request中Send Files With The Request的文件路径和文件名

  10. cocos2d接安卓facebook插件(已测cocos-x 3.7 3.8版本)

    1  控制台创建新工程: a 控制台 进入cocos2d文件夹下面,如cocos2d-x-3.7.1,执行setup.py,未设置NDK SDK ANT 路径的设置路径,需要改路径的 explore ...