将惩罚参数添加到线性程序纸浆中



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

这意味着在航程v中,集装箱i有一个有效的日期时间,如果该值大于结束日期时间,或小于开放日期时间,则该集装箱应受到处罚(Tardy[container]=1(

因为x是LpVariable

x[(i,v)]

在问题解决之前总是0,因此,延迟总是1。

我想我必须在某个地方"粘贴"一个prob+=,但我不知道如何让程序将其考虑在内。如果有人能帮助我实现它,或者对如何编程有其他建议,我将不胜感激!

问候

您无法制定您的模型"有条件地";。。。意味着Tardy是模型中的一个变量,您不能在线性程序中的条件语句(如果elif-else(中为其赋值,因为当问题被公式化并移交给求解器时,因变量(在这种情况下为x(的值是未知的,所以我们需要尝试其他方法并重新公式化。

目前还不完全清楚您在模型中是如何处理时间的,但似乎集装箱有到期日,航程有到达时间,这将是计算Tardy的基础。因此,您应该引入Tardy[i]作为一个非负的实际值,并将其限制为大于到达时间和到期日之间的差值。这是假设集装箱"i"在特定的航程"v"上行驶。因此,我们需要将该delta乘以选择二进制变量x,以仅适用于选择的情况。在伪代码中:

Tardy[i] >= (arrival_time[v] - due_time[i]) * x[i,v]

然后将其构建到模型中每个i,v的纸浆模型中

最新更新