我有一个几乎1k变量和限制的巨大linprog问题。
我可以使用scipy.optimize.linprog(method='simplex')
来计算解决方案,但我需要约100个不等式的影子价格(或机会成本)。
我可以通过在不等式的右侧添加1然后解决该问题来计算它们。然后我得到影子价格减去两个解决方案的目标函数值:shadow_price_i = f_max_original - f_max_i
。然后重复100次。这种方法有效,但速度很慢(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))