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

Reply via email to