2017-09-19 8 views
0

Hey jolie nouvelle à optaplanner. Ce que j'ai est une entité de planification de processus qui a une «zone de disponibilité» et un ensemble d'ordinateurs qui ont également une zone de disponibilité affectée. Puisqu'un processus ne peut être mis sur un ordinateur avec la même zone de disponibilité, je voulais utiliser le ValueRangeProvider pour restreindre les sélections possibles pour inclure uniquement ces ordinateurs (similaire à la façon dont l'exemple dans la documentation réduit les salles basées sur le département des enseignants) . Mais il n'y a pas de connexion directe entre les zones de disponibilité et les entités de niveau inférieur (ordinateurs), l'objet sur lequel je travaille ne pointe actuellement que vers le haut. Je pensais que je pouvais juste passer la liste des ordinateurs à chaque processus et juste créer une liste de valuerange sur la base de ce que j'ai fait ci-dessous, mais j'espérais une solution plus élégante. Je regardais les filtres mais je n'arrivais pas à comprendre comment créer un filtre pour limiter un mouvement possible en fonction de l'entité de planification et de la variable de planification de cette entité.Comment utiliser OptaPlanner ValueRange en fonction de la valeur d'une entité de planification?

@PlanningVariable(strengthComparatorClass = ComputerStrengthComparator.class) 
public Computer getComputer() { 
    return computer; 
} 
@ValueRangeProvider(id="computerRange") 
public List<Computer> getPossibleComputers(){ 
    return computers.stream().filter(computer -> computer.getAvalibilityZone().equals(this.getAvalibilityZone())).collect(Collectors.toList()); 
} 

Si quelqu'un sait quelque chose que j'ai manqué ou a des idées, j'apprécierais beaucoup l'aide.

Répondre

1

Ce code fonctionne réellement aussi loin que je peux dire. Voir les documents "Fournisseur de plages de valeurs de l'entité" (par opposition à "de la solution"). Cela dit, il y a des limitations: certaines fonctionnalités ne le supportent pas et échoueront rapidement si elles sont combinées avec des plages de valeurs "de l'entité" - la plupart le font ces jours-ci, donc je ne m'en soucierais pas. De plus, cela empêche la recherche locale de casser ces contraintes pour échapper à un optima local, mais ce n'est généralement pas un problème.

+0

J'ai manqué quelles fonctionnalités ne sont pas supportées par d'entité dans la documentation, avez-vous un lien vers cela? Aussi, que recommanderiez-vous d'autre à la place? Je pensais à créer une règle, mais je ne voulais pas essayer d'essayer d'exécuter une solution qui n'est pas possible. – Landister

+0

J'ai fini par ajouter un filtre de changement de mode. Ce qui devrait être bon pour ce que je veux je pense. Merci pour l'aide! – Landister

+0

tous les coups devront être filtrés: échange de mouvement, changement de pilier, etc. C'est une douleur. Si vous n'avez que des modifications par rapport à votre solution, la qualité sera faible. –