PuLP:每组仅使用一个项目
PuLP: Using only one item per group
我有一个具有以下值的 Pandas 数据框:
Name Age City Points
1 John 24 CHI 35
2 Mary 18 NY 25
.
.
80 Steve 30 CHI 32
我正在尝试组成一个 5 人小组,使积分总和最大化。我想有两个限制条件:年龄和城市。最大年龄必须在110岁以下,并且不能有两个人来自同一个城市。
目前我有一个最大化点数并考虑年龄限制的脚本:
x = pulp.LpVariable.dicts("x", df.index, cat='Integer', lowBound=0)
mod = pulp.LpProblem("prog", pulp.LpMaximize)
objvals_p = {idx: (df['Points'][idx]) for idx in df.index}
mod += sum([x[idx]*objvals_p[idx] for idx in df.index])
objvals_a = {idx: (df['Age'][idx]) for idx in df.index}
mod += pulp.lpSum([x[idx]*objvals_a[idx] for idx in df.index]) < 110
但是我不知道如何将城市限制添加到我的脚本中。
对我有什么建议吗?
谢谢!
你可以这样做:
for city in df['City'].unique():
sub_idx = df[df['City']==city].index
mod += pulp.lpSum([x[idx] for idx in sub_idx]) <= 1
对于DataFrame中的每个城市,这个总和超过了DataFrame的一个子集(由sub_idx索引)并且这个总和应该小于或等于1,因为来自同一个城市的2个人不能在团队。
要使这个(和您的其他约束)生效,您需要更改决策变量的定义。它应该是二进制的;完整性不够。
x = pulp.LpVariable.dicts("x", df.index, 0, 1, pulp.LpInteger)
我有一个具有以下值的 Pandas 数据框:
Name Age City Points
1 John 24 CHI 35
2 Mary 18 NY 25
.
.
80 Steve 30 CHI 32
我正在尝试组成一个 5 人小组,使积分总和最大化。我想有两个限制条件:年龄和城市。最大年龄必须在110岁以下,并且不能有两个人来自同一个城市。
目前我有一个最大化点数并考虑年龄限制的脚本:
x = pulp.LpVariable.dicts("x", df.index, cat='Integer', lowBound=0)
mod = pulp.LpProblem("prog", pulp.LpMaximize)
objvals_p = {idx: (df['Points'][idx]) for idx in df.index}
mod += sum([x[idx]*objvals_p[idx] for idx in df.index])
objvals_a = {idx: (df['Age'][idx]) for idx in df.index}
mod += pulp.lpSum([x[idx]*objvals_a[idx] for idx in df.index]) < 110
但是我不知道如何将城市限制添加到我的脚本中。
对我有什么建议吗?
谢谢!
你可以这样做:
for city in df['City'].unique():
sub_idx = df[df['City']==city].index
mod += pulp.lpSum([x[idx] for idx in sub_idx]) <= 1
对于DataFrame中的每个城市,这个总和超过了DataFrame的一个子集(由sub_idx索引)并且这个总和应该小于或等于1,因为来自同一个城市的2个人不能在团队。
要使这个(和您的其他约束)生效,您需要更改决策变量的定义。它应该是二进制的;完整性不够。
x = pulp.LpVariable.dicts("x", df.index, 0, 1, pulp.LpInteger)