Votre mission est de construire un algorithme (programme ou fonction) qui puisse optimiser le conditionnement des fruits d'un tapis roulant dans des sacs à envoyer aux détaillants, optimisant pour un plus grand nombre de sacs.
Chaque sac doit peser au moins une certaine quantité, mais tout excédent est un manque à gagner, car ce poids pourrait être utilisé pour remplir un autre sac. Votre machine d'ensachage a toujours une longueur d'avance sur les n
fruits de la file d'attente et peut uniquement choisir d'ajouter l'un de ces n
fruits au sac (unique) en cours de traitement. Il ne peut pas regarder au-delà des n
premiers éléments de la file d'attente. Le programme sait toujours exactement combien de poids il y a déjà dans le sac.
Une autre façon de visualiser cela est d'avoir un tapis roulant avec une zone de chargement de taille n
à la fin, d'où un fruit doit être pris avant l'arrivée d'un nouveau fruit. Tout fruit restant et un sac non plein à la fin sont jetés.
Contributions
- Liste / tableau des poids des fruits en file d'attente (entiers positifs)
- Poids total minimum pour les sacs (entier positif)
- Lookahead
n
(entier positif)
Production
Votre algorithme doit renvoyer pour tous les sacs le poids des fruits qu'ils contiennent, par tout moyen qui vous convient et votre langue, que ce soit stdin ou une valeur de retour ou autre chose. Vous devriez pouvoir exécuter le programme et calculer votre score en une minute sur votre ordinateur.
Exemple
Total weight 1000, lookahead of 3 and fruit queue:
[171,163,172,196,156,175,162,176,155,182,189,142,161,160,152,162,174,172,191,185]
One possible output (indented to show how the lookahead affects the bagging):
[171,163,172, 156,175, 176]
[162, 155,182,189, 161,160]
[152,162,174,172,191,185]
Notation
Votre algorithme sera testé sur six passages sur un lot de 10000 oranges que j'ai préparé pour vous, sur des têtes de recherche allant de 2 à 7, inclus aux deux extrémités. Vous devez les emballer dans des sacs pesant au moins 1 000 unités. Les oranges sont normalement distribuées avec un poids moyen de 170 et un écart type de 13, si cela peut être utile.
Votre score sera la somme du nombre de sacs des six courses. Le score le plus élevé l'emporte. Les failles standard ne sont pas autorisées.
Exemple d'implémentation simple et passe-partout de suite de tests à Haskell
Réponses:
Python 3,
99649981 sacsL'idée de cette solution est similaire à celle de Jonathan, JayCe et fortraan, mais avec une fonction de notation =)
Cette solution ajoute les meilleurs sous-ensembles de la zone d'anticipation selon le
score
.score
fournit un ordre sur les sous-ensembles en utilisant le schéma suivant:expected_mean
tente de prédire à quoi devraient ressembler les autres valeurs (en supposant que leur choix est optimal).UPD :
Voici une autre observation: vous pouvez placer toutes les oranges du meilleur sous-ensemble dans le sac sans nuire aux performances de l'algorithme. En déplacer n'importe quelle partie permet toujours de déplacer le reste par la suite, et le reste devrait toujours être la meilleure option (sans nouvelles oranges) si la notation est correcte. De plus, de cette façon, il est possible d'améliorer dynamiquement l'ensemble des candidats à mettre dans le sac en voyant plus d'oranges avant de remplir le sac. Et vous voulez en savoir autant d'informations que possible, il est donc inutile de déplacer plus d'une orange dans le sac à un moment donné.
Essayez!
la source
powerset
fonction soit redondant dans ce cas car il est delen(list_)
toute façon égal à ?)expected_mean(w)
qui donne aussi de bons résultats:return (w+2) / max(1, round((w+2) / mean))
Python 3 , 9796 sacs
S'appuyant sur la réponse de Jonathan:
Cela repose sur le jeu de puissance du livre de cuisine d'itertool. Trouve d'abord le sous-ensemble optimal du tampon en fonction de la minimisation de la différence par rapport au poids cible pour tous les sous-ensembles, puis sélectionne un élément de ce sous-ensemble en fonction du même critère. Si aucun sous-ensemble optimal ne sélectionne l'ensemble du tampon.
la source
C ++ 17, 9961,58 (moyenne sur certaines graines aléatoires)
(faites défiler vers le bas pour l'explication si vous ne connaissez pas le C ++)
(si
<
est utilisé, l'algorithme essaie de minimiser le nombre de sacs)Inspiré par cette réponse .
Lien TIO pour 250 répétitions: essayez-le en ligne!
Définit une fonction (en fait, elle ressemble à une fonction, c'est une structure)
pick_orange
qui, compte tenuvector<int> weights
du poids des oranges etint remain
du poids restant du sac, renvoie l'index de l'orange à cueillir.Algorithme:
les
500
temps de répétition{
génèrent des oranges aléatoires (fausses) (distribution normale avec une moyenne de 170 et stddev 13) jusqu'à ce qu'il y ait des
N_NEW_ORANGES=7
orangeschoisissent un sous-ensemble dont la somme est la plus petite et non inférieure à
remain
(la fonctionbacktrack
fait cela)marque toutes les oranges de ce sous-ensemble comme bonnes
}
moyenne du nombre de fois où une orange est marquée comme bonne des (vraies) oranges de poids égal
renvoie la meilleure orange
Il y a 3 constantes codées en dur dans le programme qui ne peuvent pas être déduites du problème:
N_NEW_ORANGES
(la longueur de prédiction). L'augmentation de ce qui rend le programme s'exécute de manière exponentielle plus longue (car backtrack)la source
invalid use of template-name ‘std::normal_distribution’
. Aucun problème avec gcc 7.1.0.Python 2 , 9756 sacs
Faisons rouler l'orange ...
Essayez-le en ligne!
Cueille toujours les fruits du tampon, ce qui minimise la différence absolue entre le nouveau poids et le poids cible.
la source
Python 3, 9806 sacs
S'appuyant sur les réponses de Jonathan et JayCe:
Essayez-le en ligne!
Comment ça marche
Supposons que le sac contient 900 unités et qu'il y a 2 fruits disponibles: 99 unités et 101 unités. Si le fruit de 99 unités est plus proche du début de la liste d'anticipation, alors
min
le sélectionnera au lieu de 101. Si cela se produit, nous aurions maintenant besoin d'un autre fruit pour remplir 1 unité restante nécessaire. J'ai changé le programme pour privilégier les fruits de plus grande valeur dans ces cas.Il le fait en triant puis en inversant la liste d'anticipation avant le paramétrage.
la source
PHP, 9975 sacs
la plus longue de toutes les soumissions mais devrait être lisible
Essayez-le
la source
Python 3,
98559928994799569964 sacsBasé sur le code de démarrage de Jonathan Allan, mais non golfé pour être lisible.
Idée: Depuis 1000/170 = 5,88, nous essayons de sélectionner des fruits proches de 1000/6 (j'ai tripoté les constantes magiques). Cependant, si le dernier fruit du sac peut minimiser les déchets, nous l'utilisons à la place.
Cette solution a des objectifs de somme de sac pour chaque fruit ajouté. Je vais probablement m'arrêter ici. J'ai utilisé Nelder-Mead pour trouver mon
targets
tableau:9956 sacs
Le programme de sacs 9947 est particulièrement simple:
la source
targets
? Formation sur les données aléatoires?Rubis , 9967 sacs
Essayez-le en ligne!
Si vous avez suffisamment de poids pour remplir le sac, trouvez le sous-ensemble le plus léger qui peut remplir le sac et utilisez l'orange le plus clair de ce sous-ensemble. Sinon, rapprochez le plus possible le poids restant d'un multiple de 170.
la source
Raquette / Scheme, 9880 sacs
Pour décider du fruit à ajouter au sac, comparez le poids optimal du sac au poids du sac avec le fruit supplémentaire. Si c'est le poids optimal, utilisez-le. Si elle est en surpoids, minimisez l'excédent. En cas d'insuffisance pondérale, minimisez l'excédent après avoir tenté de laisser un écart optimal.
la source
Haskell , 9777 sacs
Ce fut ma première tentative:
Essayez-le en ligne!
la source
Haskell , 9981 sacs
Les Angs → Jonathan Allan → JayCe → fortraan → Alex → Roman Czyborra codegolf python pourrait retourner à Haskell pour plus de pureté mathématique le long du même courant de pensée
(<miss)==False<True
)pour cet entier inversez le à
(m-n)/sqrt(n)==(n+1-m)/sqrt(n+1) <==> n=sqrt(m^2-1/4)-1/2
partir d'un https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variablesassaisonné de quelques inutilités inutiles
Essayez-le en ligne!
sans donner un gain numérique différent au-dessus des 9981 filets d'oranges récoltés auparavant tandis que mon emballeur de sacs 10k011 saisissant des oranges impropres de retour de sacs non fermés a été disqualifié par user69850 en persona user202729 → Jo King → ovs donc la générosité méritée est allée à Alex
la source