【发布时间】:2021-05-19 10:14:12
【问题描述】:
我正在用纸浆 python 写一个 LP 问题。我对 LP 并不陌生,但我对纸浆很熟悉。到目前为止,我得到了一些正确实施的约束。它们很简单,我知道它们是如何工作的。问题在于将容器分配给航程;
# All containers asigned to only 1 voyage
for i in cntrs:
prob += lpSum([x[(i,v)] for v in voyages]) <= 1
# Contaienr to right destination
for v in voyages:
prob += lpSum([x[(i,v)] * posibleDest.loc[i,v] for i in cntrs]) == 1
# Weight capacity of voyages
for v in voyages:
for b in barges:
prob += lpSum([weight[i] * x[(i,v)] for i in cntrs]) <= voyWCap[v]
# Type capacity of voyages
for c in cats:
for v in voyages:
prob += cntrCat.loc[i,c] * x[(i,v)] <= bargeCATCAP.loc[c,b] * voyBarge.loc[b,v]
# TEU cap of voyages
for v in voyages:
for b in barges:
prob += lpSum([cntrTEU[i] * x[(i,v)] for i in cntrs]) <= voyTEUCap[v]
我测试了这个程序,它工作得很好,但是我被困在一个特定的部分。我想添加一个参数'Tardy',如果容器迟到/早到达,它会给容器一个'惩罚值'。我的目标函数是最小化未使用的空间,因此将惩罚的总和乘以一个大数字应该“推动”程序尝试在正确的时间窗口内获取所有内容。
现在我的问题;我知道这行得通,只是不知道如何编程。
到目前为止我做了什么;
我的目标函数如下
prob += lpSum([(TEUcap[b] * voyBarge.loc[b,v]) - (x[(i,v)] * cntrTEU[i]) + Tardy[i] * M]
for i in cntrs
for b in barges
for v in voyages)
M 是一个很大的数
我创建了一个包含 0 的字典 (Tardy) 和一个循环来填充该字典;
Tardy = dict.fromkeys(cntrs,0)
for i in cntrs:
for v in voyages:
if cntrDest.dot(voyArive).loc[i,v] != 0:
if cntrDest.dot(voyArive).loc[i,v] * x[(i,v)] <= (cntrOpen.dot(voyDest)).loc[i,v] * x[(i,v)]:
Tardy[i] = 1
elif cntrDest.dot(voyArive).loc[i,v] * x[(i,v)] >= (cntrClose.dot(voyDest)).loc[i,v] * x[(i,v)]:
Tardy[i] = 1
else:
Tardy[i] = 0
换句话说:我的大部分参数都是矩阵,如果有一个值(不是0)
cntrDest.dot(voyArive).loc[i,v]
这意味着容器 i 在航次 v 上存在到达日期时间,如果该值大于关闭日期时间,或者小于打开日期时间,则该容器应该受到惩罚(Tardy[container] =1)
因为 x 是一个 LpVariable
x[(i,v)]
在问题解决之前总是0,因此,tardy总是1。
我想我必须在某处“粘贴”一个 prob+=,但我不知道如何让程序将其考虑在内。如果有人可以帮助我使其工作,或者对如何编程有其他建议,将不胜感激!
亲切的问候
【问题讨论】: