Python 在线性规划中增加惩罚参数
我正在用python编写一个LP问题。我对LP并不陌生,但我喜欢纸浆。到目前为止,我得到了一些正确实现的约束。它们很简单,我知道它们是如何工作的。问题是如何为航行分配集装箱Python 在线性规划中增加惩罚参数,python,pulp,Python,Pulp,我正在用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 voy
# 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]
其中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
这意味着在第五次航行中,集装箱i有一个arival datetime,如果该值大于close datetime或小于open datetime,则该集装箱应受到惩罚(Tardy[container]=1)
因为x是一个lpx变量
x[(i,v)]
问题解决前始终为0,因此,tardy始终为1
我想我必须把一个prob+=粘贴到某个地方,但我不知道如何让程序考虑到它。如果有人能帮助我使它工作,或者对如何编程有其他建议,那将不胜感激
善意的问候你不能“有条件地”制定你的模型。。。意思是
Tardy
是模型中的一个变量,您不能在线性程序中的条件语句(如果elif-else)中为其赋值,因为在制定问题并将其交给解算器时,因变量(x
)的值未知,因此,我们需要尝试其他方法,并重新表述
目前还不完全清楚您是如何在模型中处理时间的,但似乎集装箱有到期日期,航程有到达时间,这将是计算延迟的基础。因此,您应该引入Tardy[i]
作为非负实值,并将其限制为大于到达时间和到期日期之间的差值。假设集装箱“i”在“v”航次上运行。因此,我们需要将该增量乘以选择二进制变量x
,以仅适用于选择情况。在伪代码中:
Tardy[i] >= (arrival_time[v] - due_time[i]) * x[i,v]
然后将它构建到模型中每个i,v的纸浆模型中
x[(i,v)]
Tardy[i] >= (arrival_time[v] - due_time[i]) * x[i,v]