Python中的约束整数优化

时间:2015-05-28 10:04:41

标签: python optimization integer scipy

我希望最小化一个函数,它将3x8矩阵的非负整数作为输入。每行指定一个变量,而每列指定系统中的某个时间点。请参阅下面的CSV格式的输入。

   ,Time0,Time1,Time2
U_i,0,0,0
U_o,0,0,0
C_i,0,0,0
C_o,0,0,0
T_i,0,0,0
T_o,0,0,0
D_i,0,0,0
D_o,0,0,0

每列的约束是:

C_i + T_i >= U_i
C_o + T_o >= U_o
D_i <= 15
D_o <= 15
D_i = 0 if C_i == 0
D_o = 0 if C_o == 0

跨行的总体约束为C_i + C_o + T_i + T_o = 5。我看过scipy.optimize,但找不到处理整数的正确方法。有人可以给我一个提示或MWE如何做到这一点?

1 个答案:

答案 0 :(得分:1)

对于较小的问题,AMPL网站有一个免费工具:http://www.ampl.com/TRYAMPL/startup.html。 要上传的模型文件(* .mod)将是:

set T;

var U_i {T} >= 0 integer;
var U_o {T} >= 0 integer;
var C_i {T} >= 0 integer;
var C_o {T} >= 0 integer;
var T_i {T} >= 0 integer;
var T_o {T} >= 0 integer;
var D_i {T} >= 0 integer;
var D_o {T} >= 0 integer;

minimize obj: sum {t in T} (U_i[t] + U_o[t] + C_i[t] + C_o[t] + T_i[t] + T_o[t] + D_i[t] + D_o[t]);
subject to C1 {t in T}: C_i[t] + T_i[t] >= U_i[t];
subject to C2 {t in T}: C_o[t] + T_o[t] >= U_o[t];
subject to C3 {t in T}: D_i[t] <= 15;
subject to C4 {t in T}: D_o[t] <= 15;
subject to C5 {t in T}: D_i[t] <= C_i[t] / 1000;
subject to C6 {t in T}: D_o[t] <= C_o[t] / 1000;
subject to C7 {t in T}: C_i[t] + C_o[t] + T_i[t] + T_o[t] = 5;

数据文件(* .dat):

set T := 1 2 3;

由于你没有指定一个目标函数,我放入了一个线性假人。 上传两个文件后,您可以选择一个解算器;我认为不幸的是它们都不是整数求解器,但有些是非线性的。 这样你就可以找到一个下界的,可行的整数解,你可以通过一些舍入启发式(不是​​必要的整数最优)得到它。

或者:Excel求解器?