Функция минимизации Сципи на матрице х0 - PullRequest
1 голос
/ 02 апреля 2019

Кажется, что Scipy optimize.minimize принимает только одно измерение x0. У меня есть проблема, где мои х0 имеют форму (п, м). Существуют такие ограничения, что каждая строка x0 должна соответствовать определенному значению.

Я мог бы просто пройтись по каждой строке и выполнить оптимизацию; Тем не менее, я надеюсь добавить ограничения для столбцов в какой-то момент.

Есть ли известный способ справиться с этим? Я не могу найти много дискуссий об этом. Я пробовал разные версии вещания, сплющивания и т. Д., Но мне не очень повезло в создании разумной структуры.

РЕДАКТИРОВАТЬ: я добавил минимальный пример кода. Условие ограничения возвращает надлежащие нули при тестировании с test_x.

import numpy as np
import scipy.optimize

def cost(x, p):
    x.reshape(3, 4)
    p.reshape(3, 4)
    return (x * p).sum()

def demand_constraint(x, d):
    x = x.reshape(3, 4)
    b = x.sum(axis=0) - d
    return np.broadcast_to(b, (3, 4)).flatten()

demand = np.array([10, 14, 8, 26])
prices = np.array([[4, 4, 5, 5], [2, 8, 6, 2], [3, 2, 9, 8]])
x0 = np.zeros_like(prices).flatten()
p0 = prices.flatten()

test_x = np.array([[4, 14, 8, 26], [5, 0, 0, 0], [0, 0, 0, 0]])


cost(x0, p0)

cons = ({'type': 'eq', 'fun': demand_constraint, 'args': (demand,)})

output = scipy.optimize.minimize(cost, x0, args=p0, constraints=cons)

1 Ответ

0 голосов
/ 10 апреля 2019

Для любого, кто может столкнуться с этим в поиске, способ справиться с этим - добавить ограничение для каждой отдельной строки. Таким образом, в поле request_constraint выше будет поле row_index и будет возвращено одно значение.

Это единственное значение затем может быть включено в добавляемое ограничение. Вы продолжаете добавлять ограничения (каждый свой собственный словарь) для формы. Моя ошибка состояла в том, чтобы предположить, что ограничение может применяться ко всем x. Это лучше подходит для применения к одному х.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...