【问题标题】:Linear programming with scipy.optimize.linprog returns Optimization failed使用 scipy.optimize.linprog 进行线性规划返回优化失败
【发布时间】:2018-01-15 00:25:32
【问题描述】:

我正在尝试使用 linprog 来优化以下问题 (uploaded in Google Drive)。数据集本身上传here

到目前为止,我已经用 Python 编写了以下实现:

import pandas as pd
import numpy as np

df = pd.read_csv('Supplier Specs.csv')
from scipy.optimize import linprog

def fromPandas(dataframe, colName):
    return dataframe[[colName]].values.reshape(1,11)[0]

## A_ub * x <= b_ub
## A_eq * x == b_eq

A_eq = [1.0]*11
u_eq = [600.0] # demand

## reading the actual numbers from the pandas dataframe and then converting them to vectors

BAR = fromPandas(df, 'Brix / Acid Ratio')
acid = fromPandas(df, 'Acid (%)')
astringency = fromPandas(df, 'Astringency (1-10 Scale)')
color = fromPandas(df, 'Color (1-10 Scale)')
price = fromPandas(df, 'Price (per 1K Gallons)')
shipping = fromPandas(df, 'Shipping (per 1K Gallons)')
upperBounds = fromPandas(df, 'Qty Available (1,000 Gallons)')

lowerBounds = [0]*len(upperBounds) # list with length 11 and value 0
lowerBounds[2] = 0.4*u_eq[0] # adding the Florida tax bound

bnds = [(0,0)]*len(upperBounds) # bounds
for i in range(0,len(upperBounds)):
    bnds[i] = (lowerBounds[i], upperBounds[i])

c = price + shipping # objective function coefficients

print("------------------------------------- Debugging Output ------------------------------------- \n")
print("Objective function coefficients: ", c)
print("Bounds: ", bnds)
print("Equality coefficients: ", A_eq)
print("BAR coefficients: ", BAR)
print("Astringency coefficients: ", astringency)
print("Color coefficients: ", color)
print("Acid coefficients: ", acid)
print("\n")

A_ub = [BAR, acid, astringency, color, -BAR, -acid, -astringency, -color] # coefficients for inequalities
b_ub = np.array([12.5, 1.0, 4.0, 5.5, -11.5, -0.75, 0, -4.5]) # limits for the inequalities

b_ub = b_ub * u_eq[0] # scaling the limits with the demand

xOptimized = linprog(c, A_ub, b_ub, [A_eq], u_eq, bounds=(bnds))

print(xOptimized) # the amounts of juice which we need to buy from each supplier

优化方法返回找不到可行的起点。我相信我在使用该方法时有一个主要错误,但到目前为止我无法理解它。

一些帮助?

提前致谢!

编辑: 目标函数的期望值为371724

预期的解向量 [0,0,240,0,15.8,0,0,0,126.3,109.7,108.2]

【问题讨论】:

  • 来自scipy documentation:“A_eq:二维数组,当矩阵乘以 x 时,给出 x 处的等式约束值。”您的 A_eq 是一维的,但您使用 [A_eq] 隐藏了一条错误消息。
  • 当我只有1个等式约束时,我应该如何编写二维数组?

标签: python optimization simplex-algorithm


【解决方案1】:

这确实是我过早的猜测。 [A_eq] 当然是二维的,1xn。当您从

中删除所有负面约束时,您的脚本原则上可以显示示例
A_ub = [BAR, acid, astringency, color, -BAR, -acid, -astringency, -color] # coefficients for inequalities
b_ub = np.array([12.5, 1.0, 4.0, 5.5, -11.5, -0.75, 0, -4.5]) # limits for the inequalities

这似乎是问题的症结所在。由于 A_ub * x 酒吧 * x 和
-BAR * x 11.5

A_ub = [BAR, acid, astringency, color, -BAR, -acid, -astringency, -color] # coefficients for inequalities
b_ub = np.array([12.5, 1.0, 4.0, 5.5, 11.5, 0.75, 0, 4.5]) # limits for the inequalities

现在收敛,但给出的结果与您预期的解决方案不同,您现在在编辑中发布。显然,您必须重新评估您未在问题中指定的不等式参数。

【讨论】:

  • 谢谢!真的帮了我很多。但是我不明白为什么我不应该切换我最后 4 个 b_ub 值的符号? A_ub * x >= b_ub 等价于 -A_ub * x
  • 是的。我不知道,为什么解决方案不同。函数最小值计算为 368507,低于您发布的解决方案。为什么?我不知道。我会添加一些代码来测试,所有的等式和不等式参数确实如预期的那样得到满足,并且计算的函数确实给出了你从 scipy 返回的值。我假设,你确定,示例解决方案是正确的。
  • 我弄错了……酸度限值不是 0.75 和 1.0,而是 0.0075 和 0.01
  • 当我更新他的酸值并将我最后 4 个 b_ub 的符号切换为负时,它完美地工作
  • 加油!恭喜。远离 Excel,尤其是它们的统计和回归模块非常糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2021-01-29
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多