如果仅仅想掌握技巧但对computeIIS()背后原理不感兴趣的童鞋可以直接跳过本节。
如果我们稍微好奇一下,怎么用算法来判断出一个优化问题是否有可行解,即computeIIS()这个函数背后的算法是什么。其实这个问题并不陌生,如果对线性规划学习稍微深入一点的童鞋,一定学过一个Farkas lemma 。Farkas lemma的具体形式如下所示:
简单来说,命题1和命题2 有且只能有一个是成立的。若命题1成立,则命题2一定不成立,若命题2成立,则命题1一定不成立。
Farkas lemma的作用就是 可以让命题1和命题2互相转化,如果我要证明命题1成立 我可以去证明命题2不成立,反之亦然。看到这里大家大致已经能猜到了,computeIIS()背后的原理一定是 Farkas lemma,具体内容可参考文献[1]。
所以最后我想说的是初学 Farkas lemma,虽然我能看懂整个推导过程,但是我不知道为啥要证明这个引理,这个引理到底有什么用?直到当你积累大量的经验后,你方才能领悟到 Farkas lemma的妙处。
参考文献:
[1] John Gleeson, Jennifer Ryan, (1990) Identifying Minimally Infeasible Subsystems of Inequalities. ORSA Journal on Computing, 2(1):61-63.
[2] How does Gurobi compute the IIS for infeasible models?
[3] 维基百科 Farkas lemma
用 cplex 或 gurobi 构建数学规划模型时,要是求解变量或约束条件比较多,刚开始总是不成功的,经常会遇到模型非可行的情况。一般是由于约束条件输入错误导致的,但是具体哪一个约束条件呢?一个一个核实太麻烦了。
发现 cplex 或者 gurobi 都提供了寻找非可行原因的一些类和方法。
自学Gurobi的时候发现国内缺乏相对应的教程,大多止于浅层的gurobi安装和搭载,稍微深入点也只是最基础的模型建立:add variable, update, add constraint, set objective, optimize 和基本的读写。 甚至缺乏对于结果的解读。
Google到的内容比 百度 多的多。
最好的资料当然是官网的 http://www.gurobi.com/d...
gurobi与python应用2指南见refman,或者google进gurobi官网借助翻译软件为中文1.定义变量2.约束部分
指南见refman,或者google进gurobi官网借助翻译软件为中文
1.定义变量
常见的定义变量是:
m.addvars()
// An highlighted block
addVars ( *indices, lb=0.0, ub=float(’inf’), obj=0.0, vtype=GRB.CONTINUOUS,
name="" );
默认下界为0。
当下界比0
python +gurobipy数学建模
最近帮人做了一个混合整数线性规划case,使用了gurobipy优化库。学术版官网可以直接申请licence,三个月有效然后可以继续申请。总比要收费的cplex好点哈哈。但是还是遇到了一些坑,现在把整个问题与解决方案,代码,遇到的坑都记录一下。
对比cplex,gurobipy更适合复现一个优化问题,因为gurobipy不用把优化问题写成矩阵相乘的标准形式而是直接堆公式就行。
比如二次规划,不用写成:
XTQX + A*X的形式而是直接可以循环定义目标函数