Hi everybody
I am using optaplanner in real-time style. My application domain is similar
to the "Vehicle Routing" example (
http://docs.jboss.org/drools/release/6.0.0.CR5/optaplanner-docs/html_single/index.html#vehicleRouting).
I mean, I am using chained variables and shadow variables. I have a problem
while trying to remove a fact (an entity), via a ProblemFactChange:
java.lang.IllegalArgumentException: The entity instance (...) was never
added to this ScoreDirector. Usually the cause is that that specific
instance was not in your Solution's entities.
The fact removing that I made is like:
solver.addProblemFactChange(new ProblemFactChange() {
@Override
public void doChange(ScoreDirector scoreDirector) {
...
scoreDirector.beforeEntityRemoved(toRemove);
workingSolution.getCustomerList().remove(toRemove);
scoreDirector.afterEntityRemoved(toRemove);
}
});
I think the problem is there. Do you know what I'm doing wrong?
I have attached a test case based on the "Vehicle Routing". To run it, just
put that file into the
optaplanner-distribution-6.0.0.CR5/examples/sources/src/test/java/org/optaplanner/examples/vehiclerouting/app/
directory.
<http://drools.46999.n3.nabble.com/file/n4017760/serverlog.zip>I'd
appreciate any ideas on how to resolve this.
Best regards,
Juan Ignacio Barisich
package org.optaplanner.examples.vehiclerouting.app;
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.junit.Before;
import org.junit.Test;
import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
import org.optaplanner.core.api.solver.Solver;
import org.optaplanner.core.api.solver.SolverFactory;
import org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig;
import org.optaplanner.core.config.solver.EnvironmentMode;
import org.optaplanner.core.config.solver.SolverConfig;
import org.optaplanner.core.config.solver.XmlSolverFactory;
import org.optaplanner.core.config.termination.TerminationConfig;
import org.optaplanner.core.impl.score.director.ScoreDirector;
import org.optaplanner.core.impl.solution.Solution;
import org.optaplanner.core.impl.solver.ProblemFactChange;
import org.optaplanner.examples.common.persistence.SolutionDao;
import org.optaplanner.examples.vehiclerouting.domain.Customer;
import org.optaplanner.examples.vehiclerouting.domain.timewindowed.TimeWindowedVehicleRoutingSolution;
import org.optaplanner.examples.vehiclerouting.persistence.VehicleRoutingDao;
import org.optaplanner.examples.vehiclerouting.solver.score.VehicleRoutingSimpleScoreCalculator;
/**
* Test of bug while removing an entity on real-time, chained with shadow
* variables entities.
*
* @author [email protected]
*/
public class VehicleRoutingBugTest {
protected SolutionDao solutionDao;
private ExecutorService executor = Executors.newFixedThreadPool(1);
protected File unsolvedDataFile;
protected SolverFactory buildSolverFactory() {
SolverFactory solverFactory = new XmlSolverFactory(
createSolverConfigResource());
TerminationConfig terminationConfig = new TerminationConfig();
solverFactory.getSolverConfig().setTerminationConfig(terminationConfig);
return solverFactory;
}
protected ScoreDirectorFactoryConfig createOverwritingAssertionScoreDirectorFactory() {
ScoreDirectorFactoryConfig assertionScoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig();
assertionScoreDirectorFactoryConfig
.setSimpleScoreCalculatorClass(VehicleRoutingSimpleScoreCalculator.class);
return assertionScoreDirectorFactoryConfig;
}
protected SolutionDao createSolutionDao() {
return new VehicleRoutingDao();
}
protected String createSolverConfigResource() {
return "/org/optaplanner/examples/vehiclerouting/solver/vehicleRoutingSolverConfig.xml";
}
private void removeFirstEntity(final Solver solver) {
solver.addProblemFactChange(new ProblemFactChange() {
@Override
public void doChange(ScoreDirector scoreDirector) {
TimeWindowedVehicleRoutingSolution workingSolution = (TimeWindowedVehicleRoutingSolution) scoreDirector
.getWorkingSolution();
// e.g., pick the first entity
final Customer toRemove = workingSolution.getCustomerList()
.get(0);
// FIXME here is the problem
scoreDirector.beforeEntityRemoved(toRemove);
workingSolution.getCustomerList().remove(toRemove);
scoreDirector.afterEntityRemoved(toRemove);
}
});
}
@Before
public void setUp() {
solutionDao = createSolutionDao();
}
@Test
public void testBug() throws InterruptedException {
SolverFactory solverFactory = buildSolverFactory();
@SuppressWarnings("unchecked")
final Solution<HardSoftScore> planningProblem = solutionDao
.readSolution(new File(
"data/vehiclerouting/unsolved/cvrptw-100customers-A.xml"));
solverFactory.getSolverConfig().getTerminationConfig()
.setMaximumMinutesSpend(2L);
SolverConfig solverConfig = solverFactory.getSolverConfig();
solverConfig
.setEnvironmentMode(EnvironmentMode.NON_INTRUSIVE_FULL_ASSERT);
ScoreDirectorFactoryConfig assertionScoreDirectorFactory = createOverwritingAssertionScoreDirectorFactory();
if ((assertionScoreDirectorFactory != null)
&& EnvironmentMode.NON_INTRUSIVE_FULL_ASSERT.isAsserted()) {
solverConfig.getScoreDirectorFactoryConfig()
.setAssertionScoreDirectorFactory(
assertionScoreDirectorFactory);
}
final Solver solver = solverFactory.buildSolver();
solver.setPlanningProblem(planningProblem);
executor.submit(new Runnable() {
@Override
public void run() {
try {
// Wait until solver works some time
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
throw new UnsupportedOperationException();
}
// Remove ten items
for (int i = 0; i < 10; i++) {
removeFirstEntity(solver);
}
}
});
solver.solve();
}
}
_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users