Имитация отжига в optaplanner

Добрый день.

Мне нужно решить проблему с временными окнами с помощью дорожного графика, где часы работы клиента и депо ограничены по времени. Я загружаю исходные данные по проблеме из своего файла.
Как правильно настроить в конфигурации Алгоритм имитации отжига и жесткие правила в каплях по мощностям и временным окнам? Мне нужен пример рабочей конфигурации.

    //my loader problem from json file
    Loader loader = new Loader();
    loader.load(AppConfig.CURRENT_DIR + "\\" + "problem_cvrptw.json");
    InputBuffer buf = loader.getBuf();

    //set problem
    TimeWindowedVehicleRoutingSolution problem = new TimeWindowedVehicleRoutingSolution();
    problem.setCustomerList(buf.getCustomers());
    problem.setDepotList(buf.getDepots());
    problem.setVehicleList(buf.getVehicles());
    problem.setLocationList(buf.getLocations());
    problem.setDistanceType(DistanceType.ROAD_DISTANCE);
    problem.setDistanceUnitOfMeasurement(null); //not "sec"

    //build solver
    SolverConfig solverConfig = SolverConfig.createFromXmlResource("vehicleRoutingSolverConfig.xml");
    SolverFactory<TimeWindowedVehicleRoutingSolution> solverFactory = SolverFactory.create(solverConfig);
    Solver<TimeWindowedVehicleRoutingSolution> solver =  solverFactory.buildSolver();

    //solve 
    TimeWindowedVehicleRoutingSolution solution = solver.solve(problem);

Как создать конфигурацию для решения проблемы с алгоритмом отжига с помощью SolverConfig solverConfig = new SolverConfig ()?


person Vitaly    schedule 17.02.2020    source источник


Ответы (1)


В XML просто следуйте этому разделу документации. Это будет выглядеть так:

<localSearch>
    ...
    <acceptor>
      <simulatedAnnealingStartingTemperature>2hard/100soft</simulatedAnnealingStartingTemperature>
    </acceptor>
</localSearch>

Если вы хотите избежать использования XML, вы можете сделать что-то вроде этого:

solverConfig = new SolverConfig(...).withPhases(
       new ConstructionHeuristicPhaseConfig(),
       new LocalSearchPhaseConfig.withLocalSearchType(LATE_ACCEPTANCE));

Теперь вместо LATE_ACCEPTANCE вы можете использовать SIMMULATED_ANNEALING, но это не может работать без startTemperate, поэтому вам придется сделать что-то вроде withAcceptor().with....

person Geoffrey De Smet    schedule 18.02.2020