2017-09-18 8 views
0

J'utilise OptaPlanner pour résoudre une variante d'un problème de routage de véhicule dans lequel les exigences des clients à servir par les véhicules varient considérablement. J'ai quelques types de clients les plus communs et je veux les modéliser en utilisant différentes classes d'entités. Comme il est possible pour un seul conducteur d'assister à différents types, ils devraient être capables de former des chaînes hétérogènes avec des instances de toutes les classes sur eux.OptaPlanner classes d'entités multiples avec des variables chaînées

J'ai essayé de faire une preuve de concept en modifiant l'exemple VRP. J'ai extrait ICustomer, une interface pour tous mes clients et j'ai changé le Standstill pour que getNextCustomer renvoie un ICustomer. Lorsque je tente de l'exécuter avec le client et Customer2 (une copie de la classe client), à la fois la mise en œuvre Iaide, je reçois cette erreur:

Exception in thread "main" java.lang.IllegalArgumentException: The entityClass 
(interface org.optaplanner.examples.vehiclerouting.domain.Standstill) has a 
InverseRelationShadowVariable annotated property (nextCustomer) with a masterClass 
(interface org.optaplanner.examples.vehiclerouting.domain.ICustomer) which is not a 
valid planning entity. 

Dans le pire des cas, je vais modéliser simplement différents types de clients avec Enums et "ifs" dans une seule entité de planification pour obtenir le même comportement. Encore, serait génial de savoir si j'ai rencontré une limitation de l'API ou quelqu'un connaît un meilleur moyen d'y parvenir. Merci :)

Répondre

1

OptaPlanner supporte pleinement le polymorfisme, les hiérarchies de classe, etc. Nous avons des tests pour cela (et nous avons régulièrement trouvé des bugs pour cela qui ont été résolus - aussi récemment que pour 7.3.final IIRC). Voir aussi TestDataSolution.java et similaire. Les nouveaux reproducteurs sont bien sûr les bienvenues.

L'exception indique une histoire différente. Vérifiez où vous utilisez @InverseRelationShadowVariable, le type de retour de ce champ/méthode - Je soupçonne que votre refactor n'a peut-être pas impacté ce code correctement.