我已经成功地使用整数线性编程来解决以下问题(加上一些硬/软约束)来解决插槽填充问题。
def opt(A, max=float('inf'),
min=0):
"""Find the optimal solution
M, N = len(A), len(A[0])
# Create problem:
prob = pulp.LpProblem("optimiser", pulp.LpMaximize)
# Create variables:
x = pulp.LpVariable.dicts("x", itertools.product(range(M), range(N)),
cat=pulp.LpBinary)
# Constraints
具体来说,我具有一系列ID(M),以及一系列相关的产品(N),尽管最初将多个IDS附加到产品上,但在过程结束时只能将其分配给一个ID。到目前为止,我已经能够做到这一点。
ID Product
1 100
1 200
1 300
2 100
2 200
3 100
4 500
4 200
5 600
6 600
这些被转换为二进制矩阵,以便分配最多6个可用插槽(由软件约束控制的最小最大值),它可以作为基本的优化器正常工作,但是我需要添加一些额外的规则。
例如,我想将权重添加到某些产品(它们各自具有分配的分数作为单独的变量),并且我需要优先考虑将得分最高的产品优先添加到广告位中。
ID Product Score
1 100 5
1 200 5
1 300 2
2 100 5
2 200 5
3 100 5
4 500 1
4 200 5
6 600 4
6 600 4
因此,我想优先考虑那些得分为5的产品,然后将其首先分配给ID。一旦所有这些都放入,则下一个降序得分,依此类推。
所以
我非常感谢您的帮助。