我认为我为优化所创建的是一个相当简单的问题。我在csv文件中有以下数据:
我正在尝试使用PuLP包创建一个“最优”的乘车日,但是在创建一个约束时总是会出现错误。简单地总结一下,限制因素是:每次骑车的时间(#骑乘次数*骑乘时间,再加上骑乘次数*等待时间),加上每次乘车之间的15分钟,必须等于或少于公园开放的时间(减去固定的用餐和厕所时间)。
当我运行约束行时,我一直得到一个KeyError:(0,'num')。(我可以打印ride_list.loc0,“num”,没有问题-首先要解决问题。)如有任何建议或想法,将不胜感激。
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))
发布于 2021-11-07 14:33:02
因此,索引存在的问题是由于您没有在pulp
中正确地构造变量。当你这样做时:
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
的输出结果。还请注意在概念约束中创建的变量的用法。
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)
产量:
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]
https://stackoverflow.com/questions/69868575
复制相似问题