9
votes

Optimisation avec des paramètres distincts dans Matlab

J'ai 12 séries de vecteurs (environ 10 à 20 vecteurs) et je souhaite choisir un vecteur de chaque ensemble de sorte qu'une fonction F apporte la somme de ces vecteurs à mesure que l'argument est optimisé. De plus, j'ai des contraintes pour certains composants de cette somme.

Exemple: xxx

contraintes: xxx

cible: choisi x, y, ..., z à maximiser le (s) f (s): xxx

où f est une fonction non linéaire qui prend le vecteur s et renvoie un scalaire.

bruteforcing prend trop de temps parce qu'il sont d'environ 5,9 billions de combinaisons, et puisque j'ai besoin du maximum (ou même de meilleures combinaisons), je ne peux utiliser aucun des algorithmes gourmands qui me sont venus à mon esprit.

Les vecteurs sont assez clairsemés, environ 70-90% sont des zéros. Si cela aide d'une manière ou d'une autre ...?

La boîte à outils d'optimisation MATLAB n'a rien aidé non plus que cela ne prend pas beaucoup de support à une optimisation discrète.


13 commentaires

Pouvez-vous dire quelque chose sur la fonction non linéaire f (s) ? Que savez vous à propos de ceci? Que pouvez-vous supposer?


Si vous pouvez fournir un exemple entièrement reproductible (avec les contraintes et la fonction Obj détaillée), nous pouvons suggérer des moyens de résoudre le problème.


Avec les contraintes, l'espace de recherche n'est pas si gros.


Utilisez fminsearch ou bintprog et minimise 1 / f (s) ...


@natan comment bintprog va aider? La fonction objectif de bintprog est supposé linéaire


J'ai écrit aussi "ou fminsearch", donné plus de données, je donnerais probablement un meilleur commentaire ...


Sur la fonction F (s): J'aurai besoin de différentes fonctions et je ne suis pas sûr à 100% à quoi ils ressemblent, mais voici quelques exemples: F (S) = S_1 * (S_2 * S_3 - S_2 + 2) ou F (S ) = S_1 * S_2 * 0,5 / (1.5 * S_3). Les contraintes sont comme dans mon exemple, seulement plus grandes / plus petites.


Est-ce que a_x signifie que X est un nombre de 1 à 20, relatif à A_1 ... A_20? Qu'est-ce que s1 = signifie? Un seul des quatre vecteurs échantillonnés de l'ensemble a_i ... l_j ?


Avez-vous la boîte à outils d'optimisation globale?


@natan: 1 / f (s) est problématique avec des méthodes qui utilisent des dérivés (et d'autres choses aussi bien); Habituellement, tout simplement -f (s) est le meilleur choix.


@Phpdna: Comment savez-vous cela? Supposons que 75% de toutes les combinaisons seraient coupées par les contraintes. Cela laisse (20 ^ 12) / 4 ou environ 1 quadrillion combinaisons. À une milliard de combinaisons par seconde, cela signifie que près de 12 jours de chiffrement numérique ... ne semble pas très efficace pour moi.


Juste pour vérifier: 1) Vos vecteurs sont-ils en effet des entiers? Si oui, quel genre (int8, uint64, etc.)? Quelle est leur taille réelle , dans votre véritable programme, je veux dire?


Les vecteurs sont réellement floats, mais ils ne contiennent que des entiers que les arrondies à int8 sont bien. Ils ont 24 éléments.


3 Réponses :


6
votes

Fondamentalement, il s'agit d'un problème de cueillette de verrouillage, où les broches de la serrure ont 20 positions distinctes et il y a 12 goupilles. Aussi:

  • Certaines des positions de la broche seront bloquées, en fonction des positions de toutes les autres broches. LI>
  • Selon les spécificités de la serrure, il peut y avoir plusieurs clés qui correspondent li> ul>

    ... Intéressant! p>

    basé sur l'approche de Rasman et le commentaire de la phpdna, et em> l'hypothèse que vous utilisez int8 code> comme type de données, sous les contraintes données, il existe P >

    function [sol, fval, exitflag] = bintprog_nonlinear()
    
        %// insert your data here
        %// Any sparsity you may have here will only make this more 
        %// *memory* efficient, not *computationally*
        data = [... 
            ...  %// this will be an array with size 4-by-20-by-12
            ...  %// (or some permutation of that you find more intuitive)
            ];
    
        %// offsets into the 3D array to facilitate indexing a bit
        offsets = bsxfun(@plus, ...
            repmat(1:size(data,1), size(data,3),1), ...
            (0:size(data,3)-1)' * size(data,1)*size(data,2));   %//'
    
        %// your objective function
        function val = obj(X)
    
            %// limit "X" to integers in [1 20]
            X = min(max(round(X),1),size(data,3));
    
            %// "X" will be a collection of 12 integers between 0 and 20, which are 
            %// indices into the data matrix
    
            %// form "s" from "X"        
            s = sum(bsxfun(@plus, offsets, X*size(data,1) - size(data,1)));
    
    
            %// XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX        
            %// Compute the NEGATIVE VALUE of your function here
            %// XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX
    
    
        end
    
        %// your "non-linear" constraint function 
        function [C, Ceq] = nonlcon(X)
    
            %// limit "X" to integers in [1 20]
            X = min(max(round(X),1),size(data,3));
    
            %// form "s" from "X"        
            s = sum(bsxfun(@plus, offsets, X(:)*size(data,1) - size(data,1)));
    
            %// we have no equality constraints
            Ceq = [];
    
            %// Compute inequality constraints
            %// NOTE: solver is trying to solve C <= 0, so: 
            C = [...
                40 - s(1)
                s(2) - 100
                -20 - s(4)
            ];
    
        end
    
        %// useful GA options
        options = gaoptimset(...
            'UseParallel', 'always'...
            ...
        );
    
        %// The rest really depends on the specifics of the problem.
        %// Useful to look at will be at least 'TolCon', 'Vectorized', and of course, 
        %// 'PopulationType', 'Generations', etc.
    
        %// THE OPTIMZIATION 
        [sol, fval, exitflag] = ga(...
            @obj, size(data,3), ...  %// objective function, taking a vector of 20 values
            [],[], [],[], ...        %// no linear (in)equality constraints
            1,size(data,2), ...      %// lower and upper limits
            @nonlcon, options);      %// your "nonlinear" constraints
    
    
    end
    


0 commentaires

0
votes

Sauf si vous définissez une intelligence sur la manière dont les jeux de vecteurs sont organisés, il n'y aura pas de moyen intelligent de résoudre votre problème d'autre que la force brute pure.

dis que vous trouvez s s.t. F (s) est une contrainte maximale de s, vous devez toujours comprendre comment construire S avec douze vecteurs à 4 éléments (un système surdéterminé s'il y en avait un), où chaque vecteur a 20 valeurs possibles. La plus-value peut aider, bien que je ne sois pas sûre de savoir comment il est possible d'avoir un vecteur avec quatre éléments être 70-90% zéro et que la monnaie ne serait utile que s'il y avait encore une méthodologie dans la façon dont le vecteur est organisé

Je ne dis pas que vous ne pouvez pas résoudre le problème, je dis que vous devez repenser comment le problème est configuré.


2 commentaires

Le fait que s devrait être une combinaison linéaire de vecteurs donnés (avec des coefficients all-unity) est en fait la contrainte la plus difficile dans ce problème. Vous pourriez même dire que est le problème; Le minimum de f (s) seulement une considération secondaire.


À propos de la cérémonie et de la taille des vecteurs: mes vecteurs ont 24 éléments, je viens d'utiliser des plus petits pour faire un exemple. J'aurais probablement dû mentionner ça.



0
votes

Je sais, cette réponse vous jette vraiment tard .

Malheureusement, le problème, comme l'indique pas de nombreux modèles à exploiter, en plus de la force brute -branch et lié, maître et esclave, etc. - essayer une approche d'esclave maîtres Résoudre d'abord la fonction Problème non linéaire continu en tant que maître et résolution de la sélection discrète, car esclave pourrait aider, mais avec autant de combinaisons, et sans plus d'informations sur les vecteurs, il n'y a pas trop d'espace pour le travail.

mais sur la base des fonctions continues quasi-totales données données, basées sur des combinaisons de sommes et d'opérateurs de multiplication et de leurs inverses, la monnaie est un point clair à exploiter ici. Si 70-90% des vecteurs sont nuls, presque une bonne partie de l'espace de la solution sera proche de zéro ou près de infini . Par conséquent, une solution de Pseudo 80-20 jeté facilement les combinaisons "zéro" et n'utiliseraient que les "infinies".

De cette façon, la force brute pourrait être guidée.


0 commentaires