Résolvez le problème du sac à dos Python avec l'algorithme glouton

[Problème de sac à dos (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83 % E3% 82% AF% E5% 95% 8F% E9% A1% 8C) Greedy Method (Wikipedia) Résoudre avec% B2% E6% B3% 95). Notez que la solution requise par la méthode gloutonne n'est pas toujours une solution exacte. Nous vous serions reconnaissants si vous pouviez nous faire savoir s'il y a des lacunes ou des suggestions d'amélioration concernant le code.

(À propos de la méthode de cupidité de Wikipedia)

Un exemple d'application au problème du sac à dos est présenté ci-dessous. Dans le cas de ce problème, il peut être appliqué en divisant et en évaluant chaque bagage.
Déterminez la valeur de chaque bagage dans le problème du sac à dos. Le nombre (valeur) ÷ (volume) est souvent utilisé.
Sélectionnez le bagage avec la valeur d'évaluation la plus élevée.
Si le bagage ne dépasse pas la capacité maximale même si vous le mettez dans le sac à dos, mettez-le dans le sac à dos.
Sélectionnez tous les bagages dans l'ordre de la valeur d'évaluation et répétez l'opération ci-dessus.
La solution optimale ne peut pas être obtenue par la méthode gourmande pour ce problème.

C'est comme calculer la valeur par volume et emballer à partir d'une bonne affaire!

problème

4*x1 + 5*x2 + x3 + 3*x4 <= 6
xi = 0 or 1 (i = 1, 2, 3, 4)

Dans les conditions ci-dessus
7*x1 + 8*x2 + x3 + 2*x4
Pour maximiser( x1, x2, x3, x4 )Utilisez la méthode gourmande.

répondre

import numpy as np
from pandas import DataFrame

#Des contraintes
weights = np.array([4, 5, 1, 3])
#De la fonction objectif
values = np.array([7, 8, 1, 2])
#Un tableau de x. La valeur initiale est tout 0. Défini sur 1 une fois adopté.
results = np.array([0, 0, 0, 0])
#Calculez la valeur d'évaluation.
evaluates = values/weights
#Assembler dans un DataFrame
target_df = DataFrame(np.c_[evaluates, weights, values, results], index=['x1', 'x2', 'x3', 'x4'], columns = ['evaluate', 'weight', 'value', 'result'])
#Trier par ordre décroissant par valeur d'évaluation
target_df.sort_values('evaluate', ascending=False)

#La somme des poids des éléments adoptés. Valeur initiale 0.
weight_sum = 0

#Tournez la boucle de celle avec la valeur d'évaluation la plus élevée
for index, target in target_df.iterrows():
    #Adopté après élimination des contraintes
    if weight_sum + target['weight'] <= 6:
        weight_sum += target['weight']
        target['result'] = 1
        
print(target_df)
print("---answer---")
print(target_df['result'])

sort Le tri DataFrame était composé de sort_values. Quand j'ai essayé de le faire avec sort, je suis devenu DEPRECATED. Disposer dans l'ordre inverse avec «ascendant». pandas.DataFrame.sort

Lorsque j'ai essayé de trier dans l'ordre inverse uniquement avec numpy, cela a été fait comme suit.

import numpy as np
arr = np.array([[4, 2], [5, 2], [6, 4], [1, 3], [2, 3]])
arr = arr[ arr[:,0].argsort() ] #0ème tri
arr = arr[::-1]
print(arr)

[[6 4]
 [5 2]
 [4 2]
 [2 3]
 [1 3]]

C'est un peu ennuyeux. ..

résultat

    evaluate  weight  value  result
x1  1.750000     4.0    7.0     1.0
x2  1.600000     5.0    8.0     0.0
x3  1.000000     1.0    1.0     1.0
x4  0.666667     3.0    2.0     0.0
---answer---
x1    1.0
x2    0.0
x3    1.0
x4    0.0
Name: result, dtype: float64

Donc, ( x1, x2, x3, x4 ) = ( 1, 0, 1, 0 )

Recommended Posts

Résolvez le problème du sac à dos Python avec l'algorithme glouton
Un mémo qui a résolu le problème du sac à dos par la méthode gourmande
Résolvez le problème de minimisation parabolique avec OpenMDAO
Rechercher le labyrinthe avec l'algorithme python A *
Résolvez le problème du sac à dos Python avec la méthode de branche et liée
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
Résolution du modèle Lorenz 96 avec Julia et Python
Trouvez l'itinéraire le plus court avec l'algorithme de Python Dijkstra
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Informations de base Écrire le problème d'algorithme de l'automne 2018 en Python
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Le 14ème problème de référence d'écriture en temps réel hors ligne avec Python
Résolution du problème de l'iris avec scikit-learn ver1.0 (régression logistique)
J'ai essayé de résoudre le problème avec Python Vol.1
Résoudre les mathématiques avec Python (incomplet)
Résolution de Nampre avec Python (partie 2)
[Python3] Méthode Dikstra avec 14 lignes
Appelez l'API avec python3.
Trouver une solution au problème N-Queen avec un algorithme génétique (2)
Résolvez le livre en spirale (algorithme et structure de données) avec python!
Trouver une solution au problème N-Queen avec un algorithme génétique (1)
Extraire le fichier xz avec python
Obtenez la météo avec les requêtes Python
Trouvez la distance d'édition (distance de Levenshtein) avec python
Accédez à l'API Etherpad-lite avec Python
J'ai aimé le tweet avec python. ..
Implémentation de la méthode Dyxtra par python
[Commentaire d'AtCoder] Gagnez le problème ABC165 C "Many Requirements" avec Python!
Résolution du labyrinthe avec Python-Supplément au chapitre 6 de la référence rapide de l'algorithme-
Je voulais résoudre le problème ABC164 A ~ D avec Python
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ésolvez les problèmes de somme partielle avec une recherche complète en Python
Rendre la console Python couverte d'UNKO
Le 16ème problème d'écriture en temps réel hors ligne a été résolu avec Python
[Python] Définissez la plage du graphique avec matplotlib
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Derrière le flyer: utiliser Docker avec Python
Essayez l'algorithme Variational-Quantum-Eigensolver (VQE) avec Blueqat
Vérifier l'existence du fichier avec python
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
[Python] Récupère le nom de la variable avec str
[Python] Arrondissez avec juste l'opérateur
Afficher Python 3 dans le navigateur avec MAMP
Algorithme Python
Lisons le fichier RINEX avec Python ①
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Travailler avec OpenStack à l'aide du SDK Python