首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"KeyError:(0,'num')“在使用列表理解创建PuLP LPConstraint时

"KeyError:(0,'num')“在使用列表理解创建PuLP LPConstraint时
EN

Stack Overflow用户
提问于 2021-11-06 23:00:06
回答 1查看 114关注 0票数 0

我认为我为优化所创建的是一个相当简单的问题。我在csv文件中有以下数据:

我正在尝试使用PuLP包创建一个“最优”的乘车日,但是在创建一个约束时总是会出现错误。简单地总结一下,限制因素是:每次骑车的时间(#骑乘次数*骑乘时间,再加上骑乘次数*等待时间),加上每次乘车之间的15分钟,必须等于或少于公园开放的时间(减去固定的用餐和厕所时间)。

当我运行约束行时,我一直得到一个KeyError:(0,'num')。(我可以打印ride_list.loc0,“num”,没有问题-首先要解决问题。)如有任何建议或想法,将不胜感激。

代码语言:javascript
运行
复制
import pandas as pd
import pulp

ride_list = pd.read_csv('RideData.csv')
num_rides = ride_list.shape[0]
rides = list(range(num_rides))
min_times = 0 #minimum # times for each ride
max_times = 2 #maximum # times for each ride
time_between = 0.25 #how long to allow between rides
food_time = 2.5 #how long to allow for meals
hours_open = 12 #how many hours the park is open

# Set default values for testing
for i in rides:
    ride_list.loc[i, 'my_min'] = min_times
    ride_list.loc[i, 'my_max'] = max_times
    ride_list.loc[i, 'my_rating'] = ride_list.loc[i, 'rating']
    ride_list.loc[i, 'num'] = 0

# Initialize model
model = pulp.LpProblem('Maximimize ride enjoyment', pulp.LpMaximize)

# Add calculation to be optimized
model += pulp.lpSum([ride_list.loc[i,'ride'] * ride_list.loc[i,'rating'] * ride_list.loc[i,'num'] for i in rides])

# Add constraint to # times for each ride
x = pulp.LpVariable.dicts("times",[ride_list.loc[i, 'num'] for i in rides], 
                          lowBound = min_times,
                          upBound = max_times,
                          cat = 'Integer')

# Add constraint for total amount of time
total_rides = pulp.lpSum([ride_list[i,'num'] for i in rides])
model += pulp.LpConstraint('total_ride_time',
                          (pulp.lpSum([((ride_list.loc[i,'wait'] * ride_list.loc[i,'num']) + 
                          (ride_list.loc[i,'ride'] * ride_list.loc[i,'num'])) for i in rides]) + 
                          ((total_rides - 1) * time_between)) <= 
                          (hours_open - food_time))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-07 14:33:02

因此,索引存在的问题是由于您没有在pulp中正确地构造变量。当你这样做时:

代码语言:javascript
运行
复制
x = pulp.LpVariable.dicts("times",[ride_list.loc[i, 'num'] for i in rides], ...

您正在传递数据帧的values列表,这是不正确的。这个调用应该为要创建的变量提供一个键集,在这种情况下,x和逻辑索引仅仅是乘坐次数的计数。在您的示例中,您提供了一个包含3个零的列表,因为您已经用这些值填充了df。它会折叠成一个有一个零的集合。见下面的例子。另外,在剩余的工作中,您没有使用您创建的变量.??您使用的是ride_list.loc[i,'num'],它只是数据帧中的一些固定值,而不是问题中的变量

下面是一个示例,它展示了构造变量等的更好方法。请注意打印x格式错误和y的输出结果。还请注意在概念约束中创建的变量的用法。

代码语言:javascript
运行
复制
import pulp
import pandas as pd

data = { 'wait':        [1, 5, 10],
         'ride_time':   [2, 6, 8],
         'num' :        [0, 0, 0]}

df = pd.DataFrame(data)
print (df)

model = pulp.LpProblem("ride_plan", pulp.LpMaximize)
x = pulp.LpVariable.dicts("rides", [df.loc[i, 'num'] for i in range(len(df))])  # <-- bad
print(x)

y = pulp.LpVariable.dicts("rides", range(len(df)), cat="Integer")
print(y)

# example constraint for notional max wait time of 15 minutes...
model += pulp.LpConstraint(pulp.lpSum(df.loc[i, 'wait'] * y[i] for i in range(len(df)))) <= 15

print(model)

产量:

代码语言:javascript
运行
复制
   wait  ride_time  num
0     1          2    0
1     5          6    0
2    10          8    0

{0: rides_0}    # <--- x
{0: rides_0, 1: rides_1, 2: rides_2}   # <--- y

ride_plan:
MAXIMIZE
None
SUBJECT TO
_C1: rides_0 + 5 rides_1 + 10 rides_2 <= 15

VARIABLES
rides_0 free Integer
rides_1 free Integer
rides_2 free Integer

[Finished in 220ms]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69868575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档