调用CPLEX求解优化问题的简化方法

2020-04-14 01:02

(个人总结的ILOG-CPLEX最简约的建模和使用方法,非常实用) 数学规划模型可描述极为复杂的实际问题。利用优化算法,应用程序能迅速找到这些问题模型的解决方案。 ILOG CPLEX 的速度非常快,可以解决现实世界中许多大规模的问题,并利用现在的应用系统快速提交可靠的解决方案。这一特点可以从它在全球各地的使用情况和能在极端苛刻条件下应用的现状得到完全证明。它能够处理有数百万个约束 (constraint) 和变量,而且一直刷新数学规划的最高性能记录。

ILOG CPLEX接受的优化问题的一般形式:

其中x中的决策变量可指定为连续类型(NumVarType.Float)或离散(整数)类型(NumVarType.Int);下界lb最小至零(即决策变量非负),上届最大至C#可处理的最大值(System.Double.MaxValue)。这里规定所有不等式约束的方向为“”。

调用CPLEX求解前需要给出: double[] c ——优化函数向量,数组长度为决策变量个数;这里要看看c能否为数组的数组,添加目标函数时能否按照数组的数组添加;

double[][]var ——其行数为决策变量的组数,其列数应为决策变量的个数; double[][] A_le —— 不等式约束矩阵,其列数应为决策变量的个数; double[] b_le —— 不等式约束界,数组长度与A_le的行数保持一致;

double[][] A_eq —— 等式约束矩阵,其列数应为决策变量的个数; double[] b_eq ——等式约束界,数组长度与A_eq的行数保持一致;

double[] lb ——决策变量的下界,数组长度与决策变量个数保持一致,若某个x[i]无下界则置为0;

double[] ub ——决策变量的上界,数组长度与决策变量个数保持一致,若某个x[i]无上界则置为System.Double.MaxValue;

double[] xt ——决策变量类型,数组长度与决策变量个数保持一致;xt[i] = NumVarType.Float表示连续变量,xt[i] = NumVarType.Int表示整数变量;若混合整数规划问题退化为线性规划问题(即所有xt[i] = NumVarType.Int)则可省略xt;

【注】为调用ILOG CPLEX,项目中需要添加引用——指定路径下的ILOG.CONCERT.DLL及ILOG.CPLEX.DLL,同时为调用求解器本身,需要加载CPLEX.DL L(可置于程序所在目录);此外需要使用命名空间ILOG.CONCERT及ILOG.CPLEX。以下假定已经为以上提到的所有数组均赋值,且数据一致性良好。需要说明的是若无不等式约束/等式约束,则勿将对应数组赋空(null);以等式约束不存在为例,请赋为: double[][] A_eq = { }; double[] b_eq = { };

若某变量x[i]无下界(程序限制非负),则lb[i] = 0.0;若x[i]无上界,则ub[i] = System.Double.MaxValue;

C#调用ILOG CPLEX求解的简化方法:

Cplex cplex = new Cplex();//建立问题模型

INumVar[][] var = new INumVar[1][];//用于求解后调用或查看结果 IRange[][] rng = new IRange[1][];//用于求解后调用或查看松弛程度

int n = lb.Length; //变量个数,亦可赋值为c.Length或ub.Length INumVar[] x = cplex.NumVarArray(n, lb, ub, xt);//添加决策变量 //若退化为纯线性规划则可省略xt,改写为

//INumVar[] x = cplex.NumVarArray(n, lb, ub);

var[0] = x;//加引用(指针变化),两个可以等同

cplex.AddMaximize(cplex.ScalProd(x, c));//添加优化目标 //若需要最小化目标则改为AddMinimize

//下面将定义约束

rng[0] = new IRange[A_le.Length + A_eq.Length]; //尝试添加约束的一种方法

for (int j = 0; j < A_le.Length; j++)//不等式约束 {

rng[0][j] = cplex.AddLe(cplex.ScalProd(x, A_le[j]), b_le[j]); }

for (int j = 0; j < A_eq.Length; j++)//等式约束 {

rng[0][j + A_le.Length] = cplex.AddEq(cplex.ScalProd(x, A_eq[j]), b_eq[j]); }

if (cplex.Solve())//以下列出求解成功后常用的成员 {

double[] result = cplex.GetValues(var[0]);//得到决策变量值

System.Console.WriteLine(\ + cplex.GetStatus());

//求解状态

System.Console.WriteLine(\ + cplex.ObjValue); //目标最优值 for (int j = 0; j < result.Length; j++) {

System.Console.WriteLine(\ + j + \ + result[j]); } }

cplex.End();


调用CPLEX求解优化问题的简化方法.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:运城市道路货物运输公司名录2018版1291家 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: