En se référant à mon code ci-dessous (seulement la partie pertinente du code original), puisque x0 est un tableau 4 X 3, x devrait également être le même. Mais j'obtiens une erreur 'index invalide à la variable scalaire' dans la contrainte1.Scipy optimiser minimiser les contraintes itérées ne reconnaissent pas x comme un tableau
j'ai écrit les contraintes itérativement comme cela se fait dans la réponse à scipy.optimize.minimize (COBYLA and SLSQP) ignores constraints initiated within for loop
mieux (général) façon d'écrire les contraintes serait génial. Merci d'avance! J'ai besoin de la boucle pour les contraintes car c'est juste un problème d'optimisation de jouet et non le problème d'optimisation original (théorie des jeux) que je souhaite résoudre.
Le code (lien pour compléter le code ci-dessous):
def constraint1(i):
def g(x):
con = 20
for k in range(3):
con = con - x[i][k]
return con
return g
x0 = np.array([[5,5,5],[5,5,5],[5,5,5],[5,5,5]])
cons = []
for i in range(4):
cons.append({'type': 'ineq', 'fun': constraint1(i)})
solution = minimize(objective,x0,method='SLSQP',\
bounds=None,constraints=cons)
Et l'erreur (S'il vous plaît ignorer les numéros de ligne comme ci-dessus est une partie d'un code légèrement plus grand):
Traceback (most recent call last):
File "opt.py", line 44, in <module>
bounds=None,constraints=cons)
File "C:\Users\dott\Anaconda2\lib\site-packages\scipy\optimize\_minimize.py", line 458, in minimize constraints, callback=callback, **options)
File "C:\Users\dott\Anaconda2\lib\site-packages\scipy\optimize\slsqp.py", line 312, in _minimize_slsqp
mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in cons['ineq']]))
File "opt.py", line 15, in g
con = con - x[i][k]
IndexError: invalid index to scalar variable.
Le code complet: https://pastebin.com/cvYBvW3B
Cela fonctionne. Merci beaucoup! Idiot de ne pas vérifier la taille de x – dott