在scipy linprog中有效地获得影子价格

时间:2018-05-16 15:01:27

标签: python scipy linear-programming

我有一个几乎1k变量和限制的巨大linprog问题。 我可以使用scipy.optimize.linprog(method='simplex')来计算解决方案,但我需要约100个不等式的影子价格(或机会成本)。

我可以通过在不等式的右侧添加1然后解决该问题来计算它们。然后我得到影子价格减去两个解决方案的目标函数值:shadow_price_i = f_max_original - f_max_i。然后重复100次。这种方法有效,但速度很慢(1小时)。

我能做些什么来更快地获得影子价格?也许我缺少一些技巧或功能......

1 个答案:

答案 0 :(得分:2)

解决双重问题,仅需再给linprog打个电话,这将给您所有的影子价格。这是一个标准LP问题的示例:

     c = np.array([400,200,250])  # negative of objective function
     b = [1000,300,625] # constraint bounds
     A = [[3, 1, 1.5], [0.8, 0.2, 0.3], [1, 1,1]]  # constraints
     x1_bnds =(0, None) # bounds on x1
     x2_bnds = (0,None) # bounds on x2
     x3_bnds = (0,None) # bounds on x
     result = opt.linprog(-c,A_ub=A, b_ub=b, bounds=(x1_bnds,x2_bnds, x3_bnds))

     dual_c = b
     dual_b = -1.0 * c
     dual_A = -1.0 * np.transpose(A)
     result = opt.linprog(dual_c,A_ub=dual_A, b_ub=dual_b, bounds=(x1_bnds,x2_bnds, 
           x3_bnds))