2017-03-11 3 views
0

Je veux créer un score incrémental pour VRP avec une planification sur-contrainte. Je crée un véhicule factice supplémentaire, qui inclut tous les clients non planifiés. Le problème est lorsque optaplanner déplace le client vers un autre véhicule, il appelle afterVariableChanged avec le nom de variable previousStandstill et le véhicule pour ce client n'est pas actualisé. Alors je ne sais pas le véhicule pour ce client, je ne sais pas si j'ai besoin d'ajouter un coût doux ou non (pour un véhicule factice je ne pouvais pas ajouter de coût).Optaplanner VRP plan incrémental de score incrémental

Comment résoudre ce problème?

Exemple:

Optaplanner déplacer Customer1 de véhicule1 à véhicule2:

beforeVariableChanged: previousStandstill(Customer1), customer.GetVehicle() = Vehicle1 
beforeVariableChanged: nextCustomer(Customer0),  customer.GetVehicle() = Vehicle1 
afterVariableChanged: nextCustomer(Customer0),  customer.GetVehicle() = Vehicle1 
afterVariableChanged: previousStandstill(Customer1), customer.GetVehicle() = Vehicle1 
beforeVariableChanged: vehicle(Customer1),    customer.GetVehicle() = Vehicle1 
afterVariableChanged: vehicle(Customer1),    customer.GetVehicle() = Vehicle2 

Quand je reçois afterVariableChanged: previousStandstill (Customer1), dans customer.GetVehicle() J'ai ancienne valeur du véhicule et je n » Je ne sais pas si besoin d'ajouter un coût modéré (pour le coût du véhicule factice sont ignorés). Y at-il un moyen d'obtenir un véhicule réel dans afterVariableChanged - previousStandstill plutôt que dans afterVariableChanged - véhicule.

Répondre

1

Vérifiez si vous le champ annoté vechicle avec AnchorShadowVariable:

@AnchorShadowVariable(sourceVariableName = "previousStandstill") 
public VehicleNode getVehicleNode() { 
    return vehicleNode; 
} 

Cette annotation dit Optaplanner de mettre à jour le champ vechicle.

+0

Oui, j'ai AnchorShadowVariable. Le problème est que la variable de véhicule dans Customer est mise à jour après l'appel afterVariableChanged avec le nom de variable previousStandstill – Kapeciu

+0

Et la classe qui contient cette annotation a elle aussi une annotation PlanningEntity? Cela devrait fonctionner. –

+0

Oui, c'est le cas. Le problème est le temps, lorsque le champ du véhicule est mis à jour. – Kapeciu