[PYTHON] Jeux de regroupement avec optimisation des combinaisons

Qu'est-ce que c'est

Vous êtes le secrétaire de la noce. Neuf participants joueront le jeu en trois groupes de trois chacun. Ce jeu sera joué 4 fois. Pensez à regrouper ** deux personnes ** afin qu'elles ne puissent être dans le même groupe qu'une seule fois **.

image.png

Formulation et Python

Résolvons-le en utilisant Optimisation de combinaison. Comme d'habitude, [en utilisant PuLP et pandas](http://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0#pulp%E3%81%A8pandas%E3%81%AE%E7%B5%84%E5%90%88 % E3% 81% 9B% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6). La variable ** 0-1 Var ** indique qui, quand et quel groupe détient.

python3


import pandas as pd
from pulp import *
from ortoolpy import addvars, addbinvars
from itertools import permutations
uss = [chr(65+i) for i in range(9)] # Users
a = pd.DataFrame([(us,wk,gr) for us in uss for wk in range(4)
        for gr in range(3)], columns=['User','Time','Group'])
a['Var'] = addbinvars(len(a)) #variable
a[:3] #Afficher les 3 premières lignes
User Time Group Var
0 A 0 0 v0001
1 A 0 1 v0002
2 A 0 2 v0003

Formulation

Fonction objectif Aucune
Contraintes Chaque personne appartient à un groupe à chaque fois
1 groupe correspond à 3 personnes
Deux personnes ne peuvent faire partie du même groupe qu'une seule fois
(utilisez une variable qui devient 1 dans le même groupe)

python3


m = LpProblem() #Modèle mathématique
for _,v in a.groupby(['User','Time']):
    m += lpSum(v.Var) == 1 #Chaque personne appartient à un groupe à chaque fois
for _,v in a.groupby(['Time','Group']):
    m += lpSum(v.Var) == 3 #3 personnes dans 1 groupe
for uu in permutations(uss,2):
    y = addvars(4*3) #Variables qui deviennent 1 dans le même groupe
    m += lpSum(y) <= 1 #Les deux personnes ne peuvent être dans le même groupe qu'une seule fois
    for w,(_,v) in zip(y, a[a.User.isin(uu)].groupby(['Time','Group'])):
        m += lpSum(v.Var) <= 1+w #Relation entre y et Var
m.solve()
a['Val'] = a.Var.apply(value)
a[a.Val>0].groupby(['Time','Group']).User.sum() #Affichage des résultats

résultat

Time  Group
0     0        AFI
      1        EGH
      2        BCD
1     0        ABH
      1        CEF
      2        DGI
2     0        ACG
      1        BEI
      2        DFH
3     0        BFG
      1        ADE
      2        CHI

Supplément - Partie 1

Lorsqu'elle est formulée simplement, la fonction objectif est une optimisation non linéaire quadratique. En l'état, il ne peut pas être résolu par le solveur MIP, donc l'ajout d'une nouvelle variable (y) pour chaque paire se traduira par une optimisation linéaire (bien qu'il y ait plus de variables). Cependant, à grande échelle, une solution approximative telle qu'une méthode de recherche locale peut être plus efficace.

Supplément - Partie 2

--LpProblem de PuLP n'est pas un problème, c'est un ** modèle **! --Problème: ce que vous voulez résoudre --Modèle: exprimé de manière à pouvoir être manipulé par un ordinateur

――Lors de l'examen des résultats, c'est le modèle, pas le problème, qui change!

c'est tout

Recommended Posts

Jeux de regroupement avec optimisation des combinaisons
Optimisation du regroupement par combinaison
Optimisation combinée avec recuit quantique
Résolvez le problème des 4 couleurs grâce à l'optimisation des combinaisons
Maximisez les ventes des restaurants grâce à l'optimisation combinée
Allez voir les baleines avec l'optimisation des combinaisons
Paver la route avec l'optimisation des combinaisons
Résolution de la théorie des jeux avec l'optimisation des combinaisons
Empilons les livres à plat avec l'optimisation des combinaisons
Résolution des problèmes de planification des infirmières grâce à l'optimisation des combinaisons
Utiliser l'optimisation des combinaisons
Créer un programme académique avec optimisation des combinaisons
Résolution des problèmes d'organisation des districts scolaires grâce à l'optimisation des combinaisons
Résolution du problème N Queen avec l'optimisation continue / combinée
Résolution du problème N Queen avec l'optimisation des combinaisons
Aménagement routier par optimisation
Introduction à l'optimisation
Créez des jeux avec Pygame
Essayez l'optimisation des fonctions avec Optuna
Enquête Star avec optimisation des combinaisons
Restaurez les photos décousues avec l'optimisation!
Optimisation globale à usage général avec Z3
Ajuster les hyper paramètres avec l'optimisation bayésienne
Résolution des problèmes de sac à dos avec les outils OR de Google - Pratiquer les bases des problèmes d'optimisation combinée
Résolution de "cubes en cubes" avec optimisation des combinaisons
Déterminer le programme enregistré par optimisation de combinaison
La puissance des solveurs d'optimisation combinée
Optimisation bayésienne très simple avec Python
Méthode de planification des expériences et optimisation des combinaisons
Optimisation apprise avec OR-Tools Part0 [Introduction]
Techniques d'optimisation combinées vues dans les puzzles
Divisez en équipes par optimisation de combinaison
Penser les menus par l'optimisation des combinaisons
Résolvez les problèmes d'optimisation des combinaisons avec les outils OR de Google (5) Décidez d'un cours de date