python - 函数中的列积分

标签 python python-3.x series

我有一个代码,它根据元素的重量和体积返回包装给定元素所需的卡车数量。此功能的目标是最大限度地降低运输成本

代码:

from pulp import *
import numpy as np

# Item masses, volumes
item_mass = data["Weight"].tolist()
item_vol = data["Volume"].tolist()
n_items = len(item_vol)
set_items = range(n_items)

# Mass & volume capacities of trucks
truck_mass = truck["Weight"].tolist()
truck_vol = truck["Volume"].tolist()

# Cost of using each truck
truck_cost = truck["Price"].tolist()

n_trucks = len(truck_cost)
set_trucks = range(n_trucks)

y = pulp.LpVariable.dicts('truckUsed', set_trucks,
    lowBound=0, upBound=1, cat=LpInteger)

x = pulp.LpVariable.dicts('itemInTruck', (set_items, set_trucks), 
    lowBound=0, upBound=1, cat=LpInteger)

# Model formulation
prob = LpProblem("Truck allocatoin problem", LpMinimize)

# Objective
prob += lpSum([truck_cost[i] * y[i] for i in set_trucks])

# Constraints
for j in set_items:
    # Every item must be taken in one truck
    prob += lpSum([x[j][i] for i in set_trucks]) == 1

for i in set_trucks:
    # Respect the mass constraint of trucks
    prob += lpSum([item_mass[j] * x[j][i] for j in set_items]) <= truck_mass[i]*y[i]

    # Respect the volume constraint of trucks
    prob += lpSum([item_vol[j] * x[j][i] for j in set_items]) <= truck_vol[i]*y[i]

# Ensure y variables have to be set to make use of x variables:
for j in set_items:
    for i in set_trucks:
        x[j][i] <= y[i]


prob.solve()

x_soln = np.array([[x[i][j].varValue for i in set_items] for j in set_trucks])
y_soln = np.array([y[i].varValue for i in set_trucks])

print (("Status:"), LpStatus[prob.status])
print ("Total Cost is: ", value(prob.objective))


print("Trucks used: " + str(sum(([y_soln[i] for i in set_trucks]))))

a = []
b = []

for i in set_items:
    for j in set_trucks:
        if x[i][j].value() == 1:
            print("Item " + str(i) + " is packed in vehicle "+ str(j))
            a.append(str(j))
            b.append(str(i))


totalitemvol = sum(item_vol)

totaltruckvol = sum([y[i].value() * truck_vol[i] for i in set_trucks])
print("Volume of used trucks is " + str(totaltruckvol))

if(totaltruckvol >= totalitemvol):
  print("Trucks are sufficient")
else:
  print("Items cannot fit")

此代码返回输出如下:

Status: Optimal
Total Cost is:  400000.0
Trucks used: 3.0
Item 0 is packed in vehicle 7
Item 1 is packed in vehicle 7
Item 2 is packed in vehicle 6
Item 3 is packed in vehicle 7
Item 4 is packed in vehicle 16
Item 5 is packed in vehicle 7
Item 6 is packed in vehicle 16
Item 7 is packed in vehicle 7
Item 8 is packed in vehicle 16
Item 9 is packed in vehicle 6
Item 10 is packed in vehicle 16
Volume of used trucks is 3436.0
Trucks are sufficient

我可以将“Item 0”替换为“Item (productId)”,而不是获取项目的索引,其中ProductID是“data”Dataframe中的一系列。 我很乐意提供数据和卡车 csv 文件或 colab 链接。

最佳答案

而不是“Item”+str(i)+“被包装在vehicle”+str(j)中,并假设ProductID的顺序与的顺序相同set_trucks,你可以这样做

s = pd.Series(['item0', 'item1', 'item2'])

for i in set_items:
    for j in set_trucks:
        print("Item " + str(s[i]) + " is packed in vehicle " + str(j))

由于您使用的是 Python 3,因此可以通过使用字符串格式(例如

)来更快地完成此操作
print(f"Item {s[i]} is packed in vehicle {j}")

关于python - 函数中的列积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55107464/

相关文章:

python - 在python 3中打印set容器时,它打印时没有顺序

c - c中的几何级数,错误的解决方案

python - 如何使用 dfs 进行拓扑排序?

python - 使用 python-igraph 和 mysql 结果创建有向加权图

python - 将 csv 文件导入到列表列表中

python - body 是什么? `from fastapi import Body`

python - 二进制转十进制 For 循环

python - 基于正则表达式提取单词

python - 通过 Pandas Series 中的多个实例计算第一个非零值和最后一个非零值之间的差异?

python - 如何从一个 Pandas 系列中删除另一个通用的值?