谁要是能把这份代码改的可以成功运行,并且不缺失我所需要的内容的话。我就给他这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]}")
pulp似乎不支持非线性,需要把第二个循环里非线性部分进行拆分,可以参考
将 0-1 变量的乘积转化成线性