C'est ma première expérience avec un défi de complexité asymptotique bien que je sois satisfait des réponses entièrement en code tant qu'elles sont accompagnées d'une explication de leur complexité temporelle.
J'ai le problème suivant.
Considérez les tâches T_1, ... T_n et les procs M_1, ..., M_m. Chaque tâche prend un certain temps à effectuer en fonction des procs.
Chaque tâche coûte également un certain montant à effectuer en fonction des procs.
Les tâches doivent être effectuées dans un ordre strict (elles ne peuvent pas être effectuées en parallèle) et il faut du temps pour changer de proc. Une tâche ne peut pas être déplacée d'un processus à un autre après son démarrage.
Enfin, chaque tâche doit être terminée avant un certain temps.
la tâche
L'objectif est de donner un algorithme (ou un code) qui, compte tenu des cinq tableaux du formulaire ci-dessus, minimise le coût total pour terminer toutes les tâches tout en s'assurant que toutes les tâches sont terminées dans leurs délais. Si cela n'est pas possible, nous signalons simplement que cela ne peut pas être fait.
But
Vous devez donner la grande complexité Oh de votre solution en termes de variables n, m et d, où d est la dernière échéance. Il ne devrait pas y avoir de constantes inutiles dans votre grande complexité Oh. Ainsi O (n / 1000) doit être écrit comme O (n), par exemple.
Votre score est calculé simplement en définissant n = 100, m = 100 et d = 1000 dans votre complexité déclarée. Vous voulez le plus petit score possible.
tie break
En cas d'égalité, la première réponse l'emporte.
notes ajoutées
log
dans le temps la complexité d'une réponse sera prise en base 2.
tableau des scores
- 10 ^ 202 de KSFT ( Python ) Le premier soumis ainsi obtient la prime.
- 10 ^ 202 de Dominik Müller ( Scala )
O(m ^ n)
. Aucun algorithme ne sera "plus rapide" que cela. L'élagage basé sur un temps ou un coût maximum requis ne change pas la complexité de l'algorithme, ni avoir à la fois un coût en dollars et un coût en temps,d
n'est donc pas un élément de la complexité.Réponses:
Résultat: 10 ^ 202
J'aimerais un peu que nous ayons le support de LaTeX maintenant ...
Puisque personne d'autre n'a répondu, j'ai pensé que j'essaierais, même si ce n'est pas très efficace. Je ne sais pas quel est le gros O, cependant.
Je pense que ça marche. Du moins, c'est le cas pour le seul cas de test publié.
Il prend une entrée comme dans la question, sauf sans les étiquettes de numéro de machine ou de tâche, et avec des points-virgules au lieu des sauts de ligne.
la source
Tout vérifier - Scala
Score estimé: 2m ^ n
Je pars de chaque machine et itère sur toutes les tâches pour créer toutes les permutations à travers les tâches avec différentes machines qui respectent les délais. Ce qui signifie que si tout est à temps, j'obtiendrais 9 chemins possibles avec 2 machines et 3 tâches. (m ^ n) Ensuite, je prends le chemin le moins cher.
L'entrée est structurée comme ceci (-> explique les parties et ne doit donc pas être entrée):
Et voici le code:
J'ai également eu une idée de partir de l'arrière. Puisque vous pouvez toujours choisir une machine avec le coût le plus bas si le temps est plus petit que la différence entre la date limite précédente et la nouvelle. Mais cela ne diminuerait pas le temps d'exécution maximal si la tâche avec le meilleur coût prend plus de temps que la dernière échéance est chronométrée.
Mise à jour
======
Voici une autre configuration. temps:
Coût:
temps de commutation:
coût de commutation:
délais:
Comme entrée dans mon programme:
Celui-ci a deux solutions: temps: 18, coût: 15, chemin: liste (M_1, M_1, M_1, M_2) temps: 18, coût: 15, chemin: liste (M_2, M_1, M_1, M_1)
Ce qui soulève la question de savoir comment cela doit être géré. Tous devraient-ils être imprimés ou un seul? Et si le temps était différent? Est-ce celui qui a le coût le plus bas et aucune échéance manquée ou devrait-il également être celui qui a le temps le plus bas?
la source
O(m^n)
temps. Itérer sur chaque machine pour toutes les tâches prend duO(n*m^n)
temps.O(n*m^n)
itérer sur chaque tâche pour chacun des chemins? Et itérer sur chaque machine pour chaque tâche quelque chose commeO(n*m)
.O(n*m^n)
".O(m*m^n)=O(m^n+1)
. C'est toujours le même score.