Линейное программирование с scipy.optimize.linprog возвращает оптимизацию не удалась

Я пытаюсь использовать linprog для оптимизации следующей проблемы (загружено в Google Drive). Сам набор данных загружен здесь

До сих пор я написал следующую реализацию на 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]

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 <= b_ub, вы ищете решение для
BAR * x <= 12,5
а также
-BAR * x <= -11,5, т.е.
11,5 <= BAR * x <= 12,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

Это сходится сейчас, но дает результат, отличный от ожидаемого решения, которое вы опубликовали сейчас в своем редактировании. Очевидно, вы должны пересмотреть параметры неравенства, которые вы не указали в своем вопросе.

Другие вопросы по тегам