PuLP:将LpVariable或LpAffineExpression转换为整数

时间:2017-03-14 09:01:31

标签: python casting linear-programming pulp coin-or-cbc

在我的优化问题中,我有一个条件,即特定组中的项目数量(LpInteger)可能不会超过项目总数的百分比。为此,我编写了以下代码:

total = lpSum([num[i].varValue for i in ind])
for d in length:
    # get list of items that satisfy the conditional
    items_length_d = list(compress(items,[work[i]==work_group[d] for i in items])) 
    # use that list to calculate the amount of items in the group (an item can occur multiple times) 
    amount[d] = lpSum([num[dl] for dl in items_length_d])
    max_d[d] = total*perc_max[d] + 1 
    min_d[d] = total*perc_min[d] - 1 
    prob += max_d[d] >= amount[d]
    prob += min_d[d] <= amount[d] 

这种方法的问题是我的最大值和最小值变为浮点数(LpContinuous)。这反过来又产生了解决方案infeasible

如何确保每个max_d和min_d值都是整数?最好,我还想在舍入min_d时舍入max_d。

修改

我通过将infeasible更改为total = lpSum([num[i].varValue for i in ind])来解决total = lpSum([num[i] for i in ind])解决方案的问题。但是,最小值和最大值仍然是浮点数。如果有人知道如何将这些转换为整数,那么答案仍然会非常受欢迎。

1 个答案:

答案 0 :(得分:3)

你似乎误解了构造和解决线性规划问题是如何工作的。

应该设置整个问题,然后解决并提取解决方案值。

设置问题时,您无法获取变量的LpVariable.varValue。

因此,对于小数约束,如果我们将组定义为i / in G,然后将总数定义为i / in T

我们得到的地方f是所需的分数

如果重新排列这个等式。

所以在您的代码中

prob += perc_max[d] * lpSum([num[i] for i in ind]) <= lpSum([num[dl] for dl in items_length_d])