PuLP_LPARRAY: PuLP x NumPy,天作之合
它只是 PuLP 的底层实现:LpVariable、LpAffineExpression 和 LpConstraint 完成了繁重的工作。为您的线性变量集提供 numpy 的所有功能:广播、重塑和索引技巧应有尽有。再也不用看到 for 循环或索引变量了。特殊支持函数允许有效地线性化有用的操作,如 min/max、abs、clip-to-binary、布尔运算符等。广泛支持 axis 关键字。
网站: https://github.com/qdbp/pulp-lparray
例子:
让我们解决一个无约束的超级数独谜题。超级数独是一个数独,其附加要求是所有具有方格坐标 (x, y) 的数字对于所有 (x, y) 都必须是唯一的:
from lparray import lparray
# name R, C, r, c, n lb ub type
X = lparray.create_anon("Board", (3, 3, 3, 3, 9), 0, 1, pp.LpBinary)
prob = pp.LpProblem("SuperSudoku", pp.LpMinimize)
(X.sum(axis=-1) == 1).constrain(prob, "OneDigitPerCell")
(X.sum(axis=(1, 3)) == 1).constrain(prob, "MaxOnePerRow")
(X.sum(axis=(0, 2)) == 1).constrain(prob, "MaxOnePerCol")
(X.sum(axis=(2, 3)) == 1).constrain(prob, "MaxOnePerBox")
(X.sum(axis=(0, 1)) == 1).constrain(prob, "MaxOnePerXY")
prob.solve()
board = X.values.argmax(axis=-1)
print(board)