SCIPY создать границы для нескольких переменных, используя цикл - PullRequest
0 голосов
/ 03 мая 2020

Я не нашел этот конкретный c вопрос, заданный здесь. Я использую scipy для оптимизации линейной программы, которая имеет несколько переменных ... не только 3 или 4 (показано в большинстве примеров / документации). В примерах, которые я видел, число переменных невелико, поэтому границы для каждой переменной могут быть буквально перечислены. Тем не менее, у меня есть матрица переменных - в частности, верхний три angular из 12 * 12, для которого мне нужно указать границы. Я не смог придумать способ сделать это.

import numpy as np

#matrix of values that will be "changed" by solver to optimize:
x = np.triu(np.ones((12, 12)),1)

#bounds:
bnds = (0,100)
  1. Мне нужно создать одинаковые границы для всех элементов x.

  2. Мне нужно убедиться, что способ создания границ принят процедурой оптимизации scipy.

Я попробовал следующее:

mxbnds = np.ones((12,12),dtype=object)
for i in range(0,len(schedule0)):
    for j in range(0,len(schedule0)):
        mxbnds[i,j] = bnds

Но когда я пытаюсь оптимизировать с помощью:

import scipy.optimize as opt
sol = opt.minimize(val, schedule0, method='SLSQP', bounds= mxbnds)

Я получаю ошибку

"ValueError: установка элемента массива с последовательностью"

Я думаю, что это связано с тем, как я создаю границы, это кажется неправильным. Любая помощь будет оценена. Я могу предоставить меньшую воспроизводимую версию проблемы, включая целевую функцию, если это необходимо. Я надеюсь, что кто-то делал это раньше и мог указать на то, что я делаю неправильно, просто посмотрев, как я создаю границы. Спасибо!

Больше попыток: Я только что попробовал:

bnds = [[bnds for j in x] for i in x]

Это создает bnds, но теперь я получаю еще одну ошибку:

IndexError: SLSQP Error: the length of bounds is not compatible with that of x0.

Кажется, немного прогресс кажется ......

...