Python / Pulp - 首先选择每组中的一项

时间:2017-01-13 13:50:15

标签: python linear-programming pulp

我有一个如下所示的数据框:

City      Country      Time      Points
---------------------------------------
London    UK            31         20
Paris     France        42         12
Sydney    Australia     73         44
New York  US            41         18
Lyon      France        22         25
...
...

计划应该在给定的时间范围内选择要访问的城市。城市数量只有时间限制,没有严格限制。

然而:

  • 每个城市最多应访问一次
  • 您可以在同一个国家/地区访问两次,但只有在您访问过数据框中的每个国家/地区后才能访问。 (在同一个国家/地区同样第3次:您必须先访问每个国家/地区两次)

目前我的代码如下:

max_time = 500

x = pulp.LpVariable.dicts("x", df.index, 0, 1, pulp.LpInteger)
mod = pulp.LpProblem("travel_prog", pulp.LpMaximize)

objval_points = {idx: (df['Points'][idx]) for idx in df.index}
mod += sum([x[idx]*objval_points[idx] for idx in df.index])

objval_time = {idx: (df['Time'][idx]) for idx in df.index}
mod += sum([x[idx]*objval_time[idx] for idx in df.index]) < max_time

for idx in df.index:    
    mod += x[idx] <= 1

我创建了一个约束,允许程序每个国家只选择一个城市,但这不是我想要的:

for country in df['Country'].unique():
    sub_idx = df[df['Country']==country].index
    mod += pulp.lpSum([x[idx] for idx in sub_idx]) <= 1        

1 个答案:

答案 0 :(得分:2)

计算每个国家/地区的访问次数。把它放在一个变量说CountVisit[Country]。引入变量maxVisitMinVisit。然后添加约束maxVisit >= CountVisit[Country]MinVisit <= CountVisit[Country],最后施加约束MaxVisit-MinVisit<=1