2017-10-08 1 views
1

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

Répondre

0

Il semble que la tâche d'optimisation aplatit votre estimation initiale et retourne après chaque itération de la matrice de solutions aplaties (au lieu de la matrice 4x3). s tableau 1x12). C'est pourquoi vous obtenez ce genre d'erreur. Vous devez remodeler votre tableau x dans les fonctions d'objectif et de contrainte de 1x12 à 4x3. Après cela, vous pouvez accéder à la deuxième dimension de la variable x et éviter IndexError: invalid index to scalar variable.. Vos fonctions devraient être comme ceci:

def objective(x): 
    global q 
    sum = 0 
    x = x.reshape((4, 3)) 
    for i in range(4): 
     for j in range(3): 
      sum = sum + x[i][j]*q[i][j] 
    return -1*sum 

def constraint1(i): 
    def g(x): 
     con = 20 
     x = x.reshape((4, 3)) 
     for k in range(3): 
      con = con - x[i][k] 
     return con 
    return g 

def constraint2(k): 
    def h(x): 
     sum_eq = 20 
     x = x.reshape((4, 3)) 
     for i in range(4): 
      sum_eq = sum_eq - x[i][k] 
     return sum_eq 
    return h 
+0

Cela fonctionne. Merci beaucoup! Idiot de ne pas vérifier la taille de x – dott