[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!
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.
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. ..
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