0

我正在关注一本解释高级线性程序的书。到目前为止一切都很好,但是这个例子让我很难理解如何正确编写目标函数和约束。

线性规划示例

下面你会发现我尝试对左系数进行编码,但你可以看到它似乎不正确。

到目前为止,我的实现如下

   import pulp as lp

# data
r = 0.02
T = 2
J = 3
E = 6
K = {(1): 2, (2): 3, (3): 4, (4): 4, (5): 6, (6): 7}
C_j_t = {(1, 1): 2, (1, 2): 3, (2, 1): 4, (2, 2): 5, (3, 1): 6, (3, 2): 7}
F_j_e = {(1, 1): 2, (1, 2): 3, (2, 1): 4, (2, 2): 5, (3, 1): 6, (3, 2): 7}
I_j_e = {(1, 1): 2, (1, 2): 3, (2, 1): 4, (2, 2): 5, (3, 1): 6, (3, 2): 7}
# F_j_e = 1

prob = lp.LpProblem('Foobar Village Highway Problem', lp.LpMaximize)

X_j_t = lp.LpVariable.dicts("X",
                            [(j, t)
                             for j in range(1, J)
                             for t in range(1, T)],
                            cat='Continuous')

coef_left = {}                
for t in range(1, T):
    for j in range(1, J):
        coef_left[(j, t)] = (1 + r)**-t * C_j_t[(j, t)]

pv = (1 + r)**-T
right_side = {}
for j in range(1, J):
    for e in range(1, K[(j)]):
        right_side[(j, e)] = pv * F_j_e[(j, e)] * I_j_e[(j, e)]



prob += lp.lpSum(coef_left[(j, t)] * X_j_t[(j, t)] + right_side[(j, e)]
                 for j in range(1, J)
                 for t in range(1, T)
                 for e in range(1, E))


    prob.writeLP(r'8.2.1.lp')
    # Solve 
    prob.solve()

我认为这是不正确的,或者我使用正确的方法将这个复杂的目标编码为约束。

它返回以下内容:

\* Foobar_Village_Highway_Problem *\
Maximize
OBJ: 3.92156862745 X_(1,_1) + 7.8431372549 X_(2,_1)
Subject To
Bounds
X_(1,_1) free
X_(2,_1) free
End
4

1 回答 1

0

由于片段不完整,我们无法复制太多,但循环结构似乎存在问题:

prob += lp.lpSum(coef_left[(j, t)] * X_j_t[(j, t)]
                 for j in range(1, J)
                 for i in range(1, T))  <----- for t
于 2020-10-30T09:19:59.623 回答