[PYTHON] J'ai essayé d'optimiser le séchage du linge

Déclencheur

On m'a dit de «sécher le linge» et j'y ai pensé en le séchant.

Problème de lessive

Séchez le linge avec un poids w = [7, 8, 9, 11, 13, 15, 17] un par un aux coordonnées p = [-3, -2, -1, 0, 1, 2, 3]. Trouvez la méthode de séchage qui minimise la valeur absolue du centre de gravité lorsque

Formulation

Pour la méthode de formulation, reportez-vous à Utiliser l'optimisation des combinaisons.

Variables $ x_ {ijk} \ in \ {0, 1 \} $ $ i $ ème position $ j $ pour le linge $ k S'il faut sécher $
$ y $ Valeur absolue du centre de gravité
Fonction objectif $ y $ $ \ rightarrow $ Minimum
Contraintes $ \ sum ^ n_ {i = 0} {\ sum_j {\ sum_k {p [j] ~ w [k] ~ x_ {ijk}}}} \ le y $ $\forall n \in \{0, 1, \dots \}$
Placer à chaque fois
Placer dans toutes les positions
Placer tout le linge

Essayez de résoudre avec python

python


from pulp import * # pip install pulp
def addvar(lowBound=0, var_count=[0], *args, **kwargs):
    var_count[0] += 1
    return LpVariable('v%d' % var_count[0], lowBound=lowBound, *args, **kwargs)

p = [-3, -2, -1, 0, 1, 2, 3]
w = [5, 6, 7, 9, 10, 11, 12]
r = range(len(p))
m = LpProblem()
x = [[[addvar(cat=LpBinary) for _ in r] for _ in r] for _ in r]
y = addvar()
m += y
for n in r:
    m += lpSum(x[n][j][k] for j in r for k in r) == 1
    m += lpSum(x[i][n][k] for i in r for k in r) == 1
    m += lpSum(x[i][j][n] for i in r for j in r) == 1
    if n:
        m += lpSum(p[j] * w[k] * x[i][j][k]
                   for i in range(n+1) for j in r for k in r) <= y
        m += lpSum(-p[j] * w[k] * x[i][j][k]
                   for i in range(n+1) for j in r for k in r) <= y
m += lpSum(x[0][len(p) // 2][k] for k in r) == 1
m += lpSum(x[1][j][k] for j in range(len(p) // 2) for k in r) == 1
%time m.solve()
print(LpStatus[m.status], value(m.objective))
>>>
Wall time: 2 s
Optimal 10.0

Puisqu'il peut être placé à la coordonnée de position 0 à tout moment, il est placé en premier. De plus, le suivant peut être à gauche ou à droite, il est donc fixé à gauche.

Affichage des résultats


for i in r:
    for j in r:
        for k in r:
            if value(x[i][j][k]) > 0.5:
                print(i, j, k)
>>>
0 3 6
1 2 4
2 5 3
3 1 2
4 6 0
5 0 1
6 4 5

Puisqu'il semble y avoir plusieurs solutions optimales, une solution approximative telle qu'une méthode de recherche locale est probablement plus efficace.

Postscript

L'utilisation de pandas dans la formulation permet de voir plus facilement ce qui suit.

py3


import pandas as pd
from pulp import * # pip install pulp
def addvar(lowBound=0, var_count=[0], *args, **kwargs):
    var_count[0] += 1
    return LpVariable('v%d' % var_count[0], lowBound=lowBound, *args, **kwargs)
def Σ(s, f=None):
    if not f:
        return lpSum(t.query(s.format(**globals())).x)
    return lpSum(t.query(s.format(**globals())).apply(f, axis=1))

p = [-3, -2, -1, 0, 1, 2, 3] #Coordonner
w = [5, 6, 7, 9, 10, 11, 12] #poids
r = range(len(p)) #intervalle
m = LpProblem() #Modèle mathématique
t = pd.DataFrame([(i, j, k, addvar(cat=LpBinary))
    for i in r for j in r for k in r], columns=['Commande', 'position', 'poids', 'x'])
y = addvar() #Valeur absolue du centre de gravité
m += y #Fonction objective
for n in r:
    m += Σ('Commande=={n}') == 1 # Commande n で置くこと
    m += Σ('position=={n}') == 1 # position n に置くこと
    m += Σ('poids=={n}') == 1 #Mettre le linge n
    if n:
        #La valeur absolue du centre de gravité est y ou moins
        m += Σ('Commande<={n}', lambda q: p[q.position] * w[q.poids] * q.x) <= y
        m += Σ('Commande<={n}', lambda q: -p[q.position] * w[q.poids] * q.x) <= y
m += Σ('Commande==0 &position==3') == 1 # Commande 0 にposition 3 に置くこと
m += Σ('Commande==1 &position<=2') == 1 # Commande 1 にpositionが 2 以下に置くこと
m.solve()
print(LpStatus[m.status], value(m.objective))

Recommended Posts

J'ai essayé d'optimiser le séchage du linge
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de résumer la commande umask
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de déboguer.
Qiita Job J'ai essayé d'analyser le travail
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai essayé de mettre Pytest dans la bataille réelle
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de simuler la méthode de calcul de la moyenne des coûts en dollars
J'ai essayé de refaire la factorisation matricielle non négative (NMF)
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé d'apprendre PredNet
J'ai essayé d'organiser SVM.
J'ai essayé d'implémenter PCANet
J'ai essayé la bibliothèque changefinder!
J'ai essayé de réintroduire Linux
J'ai essayé de présenter Pylint
J'ai essayé de résumer SparseMatrix
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant l'arbre de dichotomie
[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant pour comprendre la dichotomie
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de découvrir les grandes lignes de Big Gorilla
J'ai essayé d'introduire l'outil de génération de diagramme blockdiag
J'ai essayé de porter le code écrit pour TensorFlow sur Theano
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify