【问题标题】:Add penalty parameter to linear program pulp向线性程序纸浆添加惩罚参数
【发布时间】: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+=,但我不知道如何让程序将其考虑在内。如果有人可以帮助我使其工作,或者对如何编程有其他建议,将不胜感激!

亲切的问候

【问题讨论】:

    标签: python pulp


    【解决方案1】:

    你不能“有条件地”制定你的模型......意思是Tardy是你模型中的一个变量,你不能在线性程序内部的条件语句(if-elif-else)中为其赋值,因为当问题被制定并交给求解器时,因变量的值(在这种情况下为x)是未知的,因此我们需要尝试其他方法并重新制定它。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2021-07-17
      • 2014-03-21
      相关资源
      最近更新 更多