es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aplicación de OptaPlanner con Spring boot con addProblemFactChange.

Ya leí la pregunta que se publicó aquí https://stackoverflow.com/questions/67025030/how-to-implement-a-problemfactchange-while-using-optaplanner-spring-boot-starter

¿Ha habido algún progreso en esta solicitud de función? También me gustaría enviar eventos problemFactChange() a la instancia del SolverManager basada en REST. Creo que esto es una brecha importante en la API actual del SolverManager, especialmente para hacer aplicaciones web más atractivas. Se necesita solveAndListen() y algo como submitProblemFactChange() para permitir que el usuario desencadene un cambio en el hecho de optimización en curso.

¿Hay alguna solución alternativa que use SolverManager?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hasta ahora, no ha habido ninguna actualización oficial sobre esta solicitud de función para la API SolverManager. Sin embargo, hay soluciones alternativas que puedes utilizar para lograr una funcionalidad similar.

    Una solución alternativa es utilizar solverThreadFactory y executor de SolverManager para ejecutar tus eventos problemFactChange(). Aquí tienes un ejemplo:

    @Autowired
    private SolverManager<myplanningsolution, long=""> solverManager;
    // ...
    SolverFactory<myplanningsolution> solverFactory = SolverFactory.create(mySolverConfig);
    Solver<myplanningsolution> solver = solverFactory.buildSolver();
    
    solverManager.solverThreadFactory(new MySolverThreadFactory(solver));
    
    MyPlanningSolution problem = createProblem();
    
    solverManager.solveAndListen("myProblemId", () -> problem, 
        solution -> {
            // ...
        }, 
        problemFactChange -> {
            MySolverThreadFactory.execute(() -> solver.addProblemFactChange(problemFactChange));
        });
    

    En este ejemplo, creamos una SolverThreadFactory personalizada que ejecuta eventos problemFactChange() utilizando el executor de SolverManager.

    Otra solución alternativa es crear un controlador personalizado con un punto final POST que acepte eventos problemFactChange() y los agregue manualmente a la cola de SolverManager. Aquí tienes un ejemplo:

    @RestController
    @RequestMapping("/solver")
    public class MySolverController {
        @Autowired
        private SolverManager<myplanningsolution, long=""> solverManager;
    
        @PostMapping("/problem/{problemId}/fact")
        public ResponseEntity<void> submitProblemFactChange(@PathVariable Long problemId, 
                @RequestBody MyProblemFactChange problemFactChange) {
            MyPlanningSolution problem = solverManager.getBestSolution(problemId);
            if (problem != null) {
                solverManager.addProblemFactChange(problemId, problemFactChange);
                return ResponseEntity.ok().build();
            } else {
                return ResponseEntity.notFound().build();
            }
        }
    }
    

    En este ejemplo, creamos un Controlador Spring Boot personalizado con un punto final que acepta eventos problemFactChange() y los agrega manualmente a la cola de SolverManager. Luego, puedes llamar a este punto final desde tu aplicación web para desencadenar cambios de hecho del problema.

    Ambas soluciones alternativas te permiten utilizar la API SolverManager para ejecutar eventos problemFactChange() mientras esperas una implementación oficial de la función.</myplanningsolution,></myplanningsolution,>

Comments are closed.