WedX - журнал о программировании и компьютерных науках

Линейное программирование с scipy.optimize.linprog возвращает Ошибка оптимизации

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

До сих пор я написал следующую реализацию на 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: A_eq : двумерный массив, который при матричном умножении на x дает значения ограничений равенства в x. Ваш A_eq является одномерным, но вы подавили сообщение об ошибке с помощью [A_eq]. 14.01.2018
  • Как мне написать двумерный массив, если у меня есть только одно ограничение равенства? 14.01.2018

Ответы:


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

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

14.01.2018
  • Спасибо! Мне действительно очень помог. Однако я не понимаю, почему я не должен менять знаки моих последних 4 значений b_ub? A_ub * x ›= b_ub эквивалентно -A_ub * x ‹= -b_ub, не так ли? 14.01.2018
  • Да, это так. Я не знаю, почему решения различаются. Минимум функции рассчитывается как 368507, что ниже вашего опубликованного решения. Почему? Я не знаю. Я бы добавил некоторый код для проверки того, что все параметры равенства и неравенства действительно выполняются, как и ожидалось, и что вычисляемая функция действительно дает значение, которое вы получили от scipy. Я предполагаю, что вы убедились, что пример решения правильный. 14.01.2018
  • Я получил свою ошибку ... пределы кислоты не 0,75 и 1,0, а 0,0075 и 0,01 14.01.2018
  • когда я обновляю кислотные значения и переключаю знак моих последних 4 b_ub на отрицательный, он отлично работает 14.01.2018
  • Вперёд, команда! Поздравляю. И держитесь подальше от Excel, особенно их статистика и модули регрессии ужасны. 14.01.2018
  • Новые материалы

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

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]