Orlando Allen 2023-03-29 13:48 采纳率: 0%
浏览 46

线性规划求解问题,使用python的pulp库

谁要是能把这份代码改的可以成功运行,并且不缺失我所需要的内容的话。我就给他这150,然后就是请你们这些用chagpt的小可爱们走远点,别给我丢个它的回答。如果你能改的可以运行的话,我不给钱我天打雷劈,但是记住我要求的条件。

import pulp

# 定义相关参数和数据
I = ["A", "B", "C", "D"]  # 基本港口列表
O = ["P", "Q"]  # 单纯加油港口列表
P = I + O  # 所有港口列表
N = len(I)  # 基本港口数量
M = len(P)  # 所有港口数量
d = [
    [0, 50, 100, 150, 60, 110],
    [50, 0, 60, 110, 20, 70],
    [100, 60, 0, 50, 80, 30],
    [150, 110, 50, 0, 130, 40],
    [60, 20, 80, 130, 0, 90],
    [110, 70, 30, 40, 90, 0]
]  # 航段路径长度(单位:n mile)
t_e = [0, 24, 48, 72, 96, 120]  # 船舶允许抵达各港口的最早时间
t_l = [24, 48, 72, 96, 120, 144]  # 船舶允许抵达各港口的最晚时间
C_oil = [1, 1.1, 1.2, 1.3, 1.4, 1.5]  # 各港口油价
B = [100, 100, 100, 100, 100, 100]  # 各港口加油固定费用
omega = 2000  # 燃油舱最大容量
q = 3  # 船舶最大加油次数
g = 10  # 港口燃油加注速率
phi = 3.17  # 碳排放系数
tau = 0.1  # 碳税税率
mu = 0.01  # 燃油消耗系数
V_min = 10  # 最低航速
V_max = 20  # 最高航速
r = [
    [0.9, 100],
    [0.85, 120],
    [0.8, 130],
    [0.75, 140],
    [0.7, 150],
    [0.65, 160]
]  # 加油损失收益系数
p = [1, 1.1, 1.2, 1.3, 1.4, 1.5]  # 港口单位燃油价格及折扣价格

# 创建线性规划问题
problem = pulp.LpProblem("Container_Ship_Optimization", pulp.LpMinimize)

# 定义决策变量
v = pulp.LpVariable.dicts("v", ((i, j) for i in range(M) for j in range(M)), lowBound=V_min, upBound=V_max)
x = pulp.LpVariable.dicts("x", range(M), lowBound=0)
y = pulp.LpVariable.dicts("y", range(M), cat="Binary")
z = pulp.LpVariable.dicts("z", ((i, j) for i in range(M) for j in range(M)), cat="Binary")
w = pulp.LpVariable.dicts("w", ((i, j) for i in range(M) for j in range(M)), lowBound=0)
u = pulp.LpVariable.dicts("u", ((i, j) for i in range(M) for j in range(M)), lowBound=0)
F = pulp.LpVariable.dicts("F", range(M), lowBound=0)  # 添加新变量F
T = pulp.LpVariable.dicts("T", ((i, j) for i in range(M) for j in range(M)), lowBound=0)  # 添加新变量T

# 定义目标函数
objective = pulp.lpSum(F[i] for i in range(M)) + \
    pulp.lpSum(tau * phi * T[(i, j)] for i in range(M) for j in range(M))

problem += objective

# 定义约束条件
for i in range(M):
    problem += pulp.lpSum(y[i] for i in range(N)) <= q

    for j in range(M):
        problem += (omega * y[i]) * z[(i, j)] >= mu * u[(i, j)] * z[(i, j)]
        problem += x[i] * z[(i, j)] <= mu * u[(i, j)] * z[(i, j)]
        problem += w[(i, j)] == v[(i, j)] * v[(i, j)] * v[(i, j)]
        problem += u[(i, j)] == w[(i, j)] * d[i][j]
        problem += T[(i, j)] == u[(i, j)] * z[(i, j)]
    problem += x[i] <= omega * y[i]
    problem += t_e[i] * z[(i, j)] <= x[i] / g
    problem += x[i] / g <= t_l[i] * z[(i, j)]

    problem += F[i] >= (C_oil[i] - r[i][0] * y[i]) * x[i] - r[i][1] * y[i] * y[i]

    if i != j:
        problem += z[(i, j)] + z[(j, i)] == 1
    else:
        problem += z[(i, j)] == 0

for i in range(N):
    problem += pulp.lpSum(z[(i, j)] for j in range(M)) == 1

for j in range(N, M):
    problem += pulp.lpSum(z[(i, j)] for i in range(M)) <= 1

problem.solve()
print("Status:", pulp.LpStatus[problem.status])
print("Objective value:", pulp.value(problem.objective))

for i in range(M):
    print(f"Port {i + 1}:")
    print(f" Fuel: {pulp.value(x[i])}")
    print(f" Refueling: {pulp.value(y[i])}")
    for j in range(M):
        if pulp.value(z[(i, j)]) == 1:
            print(f" Route: ({i + 1}, {j + 1})")
            print(f" Speed: {pulp.value(v[(i, j)])}")
            print(f" Distance: {d[i][j]}")

  • 写回答

1条回答 默认 最新

  • ash062 2023-03-29 15:16
    关注

    pulp似乎不支持非线性,需要把第二个循环里非线性部分进行拆分,可以参考
    将 0-1 变量的乘积转化成线性

    评论

报告相同问题?

问题事件

  • 创建了问题 3月29日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真