Python 在线性规划中增加惩罚参数

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

我正在用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]
其中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]