在 Pulp Python 中制定方程

问题描述

我正在尝试制定以下等式:25、28、29、30 和 31,使用包含 LpVariable 的字典在 Python 中使用 Pulp,目的是最大限度地减少从一个网络节点传输的端到端延迟到节点。

  • i 索引指的是特定类型的传输流
  • k 索引指的是流中的一个
  • Vx、Va、Vb 是网络中具有这种拓扑结构的节点 (Vx Va Vb)

方程:

目前我正在弄清楚如何设置第 29 个约束,所以在我看来它应该是这样的:

model = LpProblem(name="ilp",sense=LpMinimize)
I = range(2)
K = range(4)

offsets = {i: LpVariable(name=f"offset_{i}",lowBound=lowBounds[i]) for i in I}

e2e_lat = {}
e2e_lat_lowBound = {}
for i in I:
    for k in K:
        e2e_lat[i] = offsets[i,k] + t_tx[i,k] - offsets[i,1]
        e2e_lat_lowBound[i] = offsets[i,k].lowBound + t_tx[i,k]

for i in I:
    model += e2e_lat[i] == deadline[i]

#Objective
model += c2 * lpSum([e2e_lat[i] - e2e_lat_lowBound[i] for i in I])

由于我是线性编程的新手,我不知道应该如何编码。

如果能得到任何帮助,我将不胜感激。

解决方法

考虑到之前发布的方程,这是一个可能的解决方案:

from pulp import LpMinimize,LpProblem,LpStatus,lpSum,LpVariable,PULP_CBC_CMD

# Variables (ms)
# I = num of flows,K = num of frames
I = range(3)
K = range(4)
periods = [1.1,1.1,5]
deadline = [10,30,80]
t_tx = [0.012,0.008,0.0024]
e2e_lat = {}
e2e_lat_lowBound = {}

model = LpProblem(name="ilp",sense=LpMinimize)
offsets = {i: {k: LpVariable(name=f"f_{i}{k}",lowBound=k*periods[i]) for k in K} for i in I}

# Equation 25 & 28(e2e & e2e_lowBound definitions):
for i in range(len(offsets)):
    for k in range(len(offsets[i])):
        e2e_lat[i] = offsets[i][k] - t_tx[i] - offsets[i][0]
        e2e_lat_lowBound[i] = offsets[i][k].lowBound + t_tx[i]
        
        print("e2e: {} = {} - {} - {}".format(e2e_lat[i],offsets[i][k],t_tx[i],offsets[i][0]))
        print("e2e_lb: {} = {} + {}".format(e2e_lat_lowBound[i],offsets[i][k].lowBound,t_tx[i]))

# Equation 29 (Deadline):
for i in I:
    model += e2e_lat[i] <= deadline[i]
    
    print("{} <= {}".format(e2e_lat[i],deadline[i]))

# Equation 30 (offset upperBound): 
for i in range(len(offsets)):
    for k in range(len(offsets[i])):
        model += offsets[i][k] <= ((k+1)*periods[i] - t_tx[i])
        
        print("{} <= {}*{} - {}".format(offsets[i][k],k+1,periods[i],t_tx[i]))

# Equation 26 (Objective Function): 
model += lpSum([e2e_lat[i] - e2e_lat_lowBound[i] for i in range(len(e2e_lat))])

由于此方程将冷藏到 TSN 调度问题的时间资源分配,因此我还需要添加以下方程以防止 2 个流重叠。

for i in range(len(offsets)):
    for k in range(len(offsets[i])):
        if i+1 in I: 
            model += (k+1)*periods[i] + offsets[i][k] + t_tx[i] <= (k+1)*periods[i+1] + offsets[i+1][k]