2013-05-07 2 views
0

Je suis face à un NPE en essayant de résoudre ma solution:exception Nullpointer dans CompositePlanningValueRangeDescriptor.extractValues ​​

Exception in thread "main" java.lang.NullPointerException 
at java.util.ArrayList.addAll(ArrayList.java:472) 
at org.drools.planner.core.domain.variable.CompositePlanningValueRangeDescriptor.extractValues(CompositePlanningValueRangeDescriptor.java:46) 
at org.drools.planner.core.domain.variable.PlanningVariableDescriptor.extractPlanningValues(PlanningVariableDescriptor.java:259) 
at org.drools.planner.core.heuristic.selector.variable.PlanningValueSelector.initSelectedPlanningValueList(PlanningValueSelector.java:91) 
at org.drools.planner.core.heuristic.selector.variable.PlanningValueSelector.phaseStarted(PlanningValueSelector.java:73) 
at org.drools.planner.core.heuristic.selector.variable.PlanningValueWalker.phaseStarted(PlanningValueWalker.java:64) 
at org.drools.planner.core.heuristic.selector.variable.PlanningVariableWalker.phaseStarted(PlanningVariableWalker.java:62) 
at org.drools.planner.core.constructionheuristic.greedyFit.decider.DefaultGreedyDecider.phaseStarted(DefaultGreedyDecider.java:62) 
at org.drools.planner.core.constructionheuristic.greedyFit.DefaultGreedyFitSolverPhase.phaseStarted(DefaultGreedyFitSolverPhase.java:112) 
at org.drools.planner.core.constructionheuristic.greedyFit.DefaultGreedyFitSolverPhase.solve(DefaultGreedyFitSolverPhase.java:57) 
at org.drools.planner.core.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:190) 
at org.drools.planner.core.solver.DefaultSolver.solve(DefaultSolver.java:155) 
at de.haw.dsms.applicationcore.planning.BalancingApp.main(BalancingApp.java:47) 

J'ai annoté mon entité de planification avec les annotations suivantes pour collecter la plage de valeurs à partir de deux listes dans la solution :

@PlanningEntity 
public class ScheduleItem implements Cloneable{ 

private ChangeOfferEvent item; 

@PlanningVariable() 
@ValueRanges({ 
     @ValueRange(type = ValueRangeType.FROM_SOLUTION_PROPERTY, solutionProperty = "offers"), 
     @ValueRange(type = ValueRangeType.FROM_SOLUTION_PROPERTY, solutionProperty = "dummies") 
}) 
public ChangeOfferEvent getItem() { 
    return item; 
} 

public void setItem(ChangeOfferEvent item) { 
    this.item = item; 
} 

public ScheduleItem() { 
    this.item = null; 
} 
    ... 

Ceci est la solution:

public class ProductionConsumptionBalancing implements Solution<HardAndSoftLongScore> { 

/* 
* Problem facts 
*/ 

// The grid entity offers 
private List<ChangeOfferEvent> offers; 
// Placeholder events to represent "not used schedule items" 
private List<PlaceholderOfferEvent> dummies; 
// The total energy consumption in the grid 
// [Watt] 
private TotalEnergyConsumption totalElectricityConsumption; 
// The total energy production in the grid 
// [Watt] 
private TotalEnergyProduction totalElectricityProduction; 

public List<ChangeOfferEvent> getOffers() { 
    return offers; 
} 

public void setOffers(List<ChangeOfferEvent> offers) { 
    this.offers = offers; 
} 

public List<PlaceholderOfferEvent> getDummies() { 
    return dummies; 
} 

public void setDummies(List<PlaceholderOfferEvent> dummies) { 
    this.dummies = dummies; 
} 

public TotalEnergyConsumption getTotalElectricityConsumption() { 
    return totalElectricityConsumption; 
} 

public void setTotalElectricityConsumption(
     TotalEnergyConsumption totalElectricityConsumption) { 
    this.totalElectricityConsumption = totalElectricityConsumption; 
} 

public TotalEnergyProduction getTotalElectricityProduction() { 
    return totalElectricityProduction; 
} 

public void setTotalElectricityProduction(
     TotalEnergyProduction totalElectricityProduction) { 
    this.totalElectricityProduction = totalElectricityProduction; 
} 

/* 
* Problem entities 
*/ 
private List<ScheduleItem> schedule;  

@PlanningEntityCollectionProperty 
public List<ScheduleItem> getSchedule() { 
    return schedule; 
} 

public void setSchedule(List<ScheduleItem> schedule) { 
    this.schedule = schedule; 
} 
    ... 

La chose étrange à propos de ceci est que pendant le débogage, j'ai découvert que c'est le paramètre "planningEntity" qui est nul et non les valeurs dans la solution.

Est-ce que quelqu'un rencontre le même problème ou sait comment résoudre ce problème?

Merci et meilleures salutations!

PS: Il semble que cela vient de la méthode initSelectedPlanningValueList:

private void initSelectedPlanningValueList(AbstractSolverPhaseScope phaseScope) { 
90   if (planningVariableDescriptor.isPlanningValuesCacheable()) { 
91    Collection<?> planningValues =    planningVariableDescriptor.extractPlanningValues(
92      phaseScope.getWorkingSolution(), null); 
93    cachedPlanningValues = applySelectionOrder(planningValues); 
94   } else { 
95    cachedPlanningValues = null; 
96   } 
97  } 

PSPS: Problème résolu. Le problème est apparu parce que j'ai oublié de lier l'attribut du dummies du clone à la liste des mannequins d'origine. Donc, la liste des nuls dans la solution clonée était nulle.

@Override 
public Solution<HardAndSoftLongScore> cloneSolution() { 

    ProductionConsumptionBalancing clone = new ProductionConsumptionBalancing(); 

    // Transfer consumption and production values 
    clone.totalElectricityConsumption = this.totalElectricityConsumption; 
    clone.totalElectricityProduction = this.totalElectricityProduction; 

    // Shallow copy offer lists (shouldn't change) 
    clone.offers = this.offers; 

    // Shallow copy of dummy list 
    clone.dummies = this.dummies; 

    // Deep copy schedule 
      ... 
+0

Quelle version de Drools Planner (= OptaPlanner)? –

Répondre

0

A partir de 6.0.0.Beta1, OptaPlanner (= Drools planificateur) supporte automatic cloning out-of-the-box. Vous n'avez donc plus besoin d'implémenter la méthode cloneSolution(), car Planner s'en charge automatiquement. Parce que vous n'avez plus besoin d'implémenter la méthode, vous ne pouvez pas l'implémenter correctement.

Notez que vous pouvez toujours implémenter une méthode de clonage personnalisée si vous le voulez vraiment aussi.

+1

J'utilise la dernière version stable 5.5.0. Ca sonne bien d'avoir une méthode clone moins à écrire et peut-être une erreur de moins à faire; Et en passant, merci Geoffrey d'avoir fait Planner. – armins