J'ai rencontré ce problème et j'ai du mal à trouver un moyen de l'aborder. Toutes les pensées seraient grandement appréciées!
Supposons que l'on nous donne une matrice , par exemple,
Sans essayer chaque permutation, trouvez un ordre des colonnes qui maximise le nombre de lignes pour lesquelles le premier élément non nul est .
Pour l'exemple ci-dessus, un tel ordre (ce n'est pas unique!) Est , c'est-à-dire,
Ici, pour rangées sur le premier élément non nul est .
Réponses:
Ce problème, que j'appellerai CO pour la commande de colonnes, est NP-difficile . Voici une réduction du problème NP-hard Vertex Cover (VC):
Formes de problème de décision de VC et CO
Soit l'instance VC d'entrée( V, E, k ) . Il représente la question: "Étant donné le graphique ( V, E) , est-il possible de choisir un ensemble d'au plus k sommets dans V telle sorte que chaque arête dans E soit incidente sur au moins un sommet choisi?" Nous allons construire une instance ( A , k′) de CO qui représente la question: "Étant donné la matrice UNE avec des éléments dans { - 1 , 0 , 1 } , Est - il possible de permuter les colonnes de UNE telle que 1 apparaît avant -1 sur au moins k′ lignes « Ces deux problèmes sont énoncés dans? Problème de décision sous forme, par laquelle la réponse à chacune est OUI ou NON: formellement , c'est cette forme de problème qui est NP-complet (ou pas) .Il n'est pas trop difficile de voir que la forme de problème d'optimisation la plus naturelle énoncée dans la question du PO est à peu près équivalente en termes de complexité: recherche binaire sur le seuil Le paramètre peut être utilisé pour résoudre le problème d'optimisation à l'aide d'un résolveur de problème de décision, tandis qu'une seule invocation d'un résolveur de problème d'optimisation, suivie d'une seule comparaison, suffit pour résoudre le problème de décision.
Construire une instance de CO à partir d'une instance de VC
Soitn = | V| et m = | E| . Nous allons construire une matrice UNE avec ( n + 1 ) m + n lignes et n + 1 colonnes. Les m rangées supérieures ( n + 1 ) m seront formées de m blocs de n + 1 rangées chacun, chaque bloc représentant un bord à recouvrir . Le fond n les lignes contiennent des "drapeaux" de sommet, ce qui entraînera un coût fixe pour une colonne (correspondant à un sommet) si elle est incluse dans le côté gauche de la solution de CO (correspondant à un sommet inclus dans la couverture de sommet du Solution VC).
Pour chaque sommetvje , créez une colonne dans laquelle:
Créez une autre colonne "clôture" qui se compose de(n+1)m copies de -1, suivies de n copies de +1.
Enfin, fixons le seuilk′ pour l'instance CO construite: (n+1)m+n−k . En d'autres termes, nous autorisons au plus k lignes dans lesquelles un -1 apparaît avant un +1. Appelons ce nombre de lignes violées le «coût» d'une solution de CO.
Preuve
La correspondance entre une solution à l'instance CO et un ensemble de sommets dans l'instance VC d'origine est la suivante: chaque colonne à gauche de la clôture correspond à un sommet qui se trouve dans l'ensemble et chaque colonne à droite de la clôture correspond à un sommet qui ne l'est pas.
Intuitivement, les -1 en haut de la colonne "clôture" forcent la sélection d'un sous-ensemble de colonnes à placer à sa gauche qui contiennent ensemble + 1 dans toutes ces positions - correspondant à un sous-ensemble de sommets qui sont incidents sur chaque bord. Chacune de ces colonnes qui apparaît à gauche de la "clôture" a un -1 sur une ligne distincte quelque part dans lesn lignes du bas , entraînant un coût de 1; les +1 dans le bas de la "clôture" garantissent que toutes les colonnes placées à sa droite n'encourent pas de tels frais.
Clairement, une solution VC utilisant au plusk sommets donne une solution à l'instance de CO construite avec un coût au plus k : ordonnez simplement les colonnes correspondant aux sommets dans la couverture de sommets arbitrairement, suivies de la colonne de clôture, puis de toutes les colonnes restantes dans n'importe quel ordre .
Reste à montrer qu'une solution à l'instance CO avec un coût au plusk correspond à une couverture de vertex avec au plus k sommets.
Supposons au contraire qu'il existe une solution à l'instance CO avec un coût au plusk qui laisse une ligne dans les rangées supérieures (n+1)m avec un -1 avant un +1. Cette ligne appartient à un bloc de (n+1) lignes correspondant à un bord particulier uv . Chaque ligne de ce bloc dans l'instance d'origine A est identique par construction; permuter les colonnes peut modifier ces lignes, mais n'affecte pas le fait qu'elles sont identiques. Ainsi, chacune de ces n+1 lignes identiques a un -1 avant un +1 dans la solution, ce qui implique un coût d'au moinsn+1 . Maisk≤n<n+1 : contradiction.
Étant donné que chacun desm blocs de rangées dans les rangées supérieures (n+1)m a un +1 avant un -1, chacun des bords correspondants est couvert par un sommet correspondant à une colonne à gauche de la clôture: c'est-à-dire , ce sous-ensemble de sommets constitue une couverture de sommets. Puisqu'aucune des m (n+1)m rangées n'a un -1 avant un +1, le seul endroit où le coût peut s'accumuler dans la solution est dans les n rangées, des colonnes placées à gauche de la clôture. Chacune de ces colonnes a coûté exactement 1, donc étant donné que le coût est d'au plus k , il doit y avoir au plus k ces colonnes, et donc au plus k sommets dans la couverture.
Enfin, il est clair que l'instance CO peut être construite en temps polynomial à partir de l'instance VC, ce qui signifie que si un algorithme polynomial existait pour résoudre le CO, toute instance VC pourrait également être résolue en temps polynomial en construisant d'abord une instance CO comme décrit ci-dessus, puis le résoudre. Puisque VC est NP-dur, le CO l'est aussi.
la source
Ensuite, vous devez faire une exploration complète de la combinatoire en utilisant de manière itérative la fonction pick:
Après chaque sélection, vous pouvez faire une simplification pour éventuellement réduire le nombre de possibilités à explorer. Je suggère d'explorer goulûment en commençant par la colonne ayant le moins -1, ainsi vous pouvez atteindre une borne inférieure faisant un critère d'arrêt.
Sur l'exemple donné, la première simplification donne (comme Pål GD l'a expliqué en commentaire)
Néanmoins, la simplification épargne encore environ la moitié des étapes d'exploration. Et ce type de matrice peut être divisé en plusieurs sous-matrices indépendantes.
la source