OptaPlanner 返回空解决方案



我正在尝试用OptaPlanner解决一个问题,但程序返回了我和空的解决方案。我按照这个例子来解决它:https://github.com/ge0ffrey/getting-started-guides/tree/gs-constraint-solving-ai-optaplanner/complete

我正在使用SpringBoot JPA集成。

这里有实现的代码:

  • 规划解决方案
@PlanningSolution
public class HorarioComidas {
@ValueRangeProvider(id = "recetaRange")
@ProblemFactCollectionProperty
private List<Receta> recetaList;
@ValueRangeProvider(id = "fechaSemanaRange")
@ProblemFactCollectionProperty
private List<FechaSemana> fechaSemanaList;
@ValueRangeProvider(id = "comidaRange")
@ProblemFactCollectionProperty
private List<Comida> comidaList;
@PlanningEntityCollectionProperty
private List<UsuarioReceta> usuarioRecetas;
@PlanningScore
private HardSoftScore score;
// Ignored by OptaPlanner, used by the UI to display solve or stop solving button
private SolverStatus solverStatus;
...
}
  • 光规划师服务
@Service
public class OptaPlannerService {
@Autowired
private HorarioComidasService horarioComidasService;
@Autowired
private SolverManager<HorarioComidas, Usuario> solverManager;
@Autowired
private ScoreManager<HorarioComidas> scoreManager;
public HorarioComidas getTimeTable(Usuario usuario) {
// Get the solver status before loading the solution
// to avoid the race condition that the solver terminates between them
SolverStatus solverStatus = getSolverStatus(usuario);
HorarioComidas solution = horarioComidasService.findByUsuario(usuario);
scoreManager.updateScore(solution); // Sets the score
solution.setSolverStatus(solverStatus);
return solution;
}
public void solve(Usuario usuario) {
horarioComidasService.usuario = usuario;
solverManager.solveAndListen(usuario, 
horarioComidasService::findByUsuario, 
horarioComidasService::save);
}
public SolverStatus getSolverStatus(Usuario usuario) {
return solverManager.getSolverStatus(usuario);
}
public void stopSolving(Usuario usuario) {
solverManager.terminateEarly(usuario);
}
}
  • 堀里奥Comida服务:

@Service
public class HorarioComidasService {
@Autowired
private UsuarioRecetaService usuarioRecetaService;
@Autowired
private RecetaService recetaService;
public Usuario usuario;
public HorarioComidas findByUsuario(Usuario usuario) {
if (!usuarioRecetaService.findByUsuario(usuario).isEmpty()) {
throw new IllegalStateException("No hay una lista de comida para este usuario.");
}
// Occurs in a single transaction, so each initialized lesson references the same timeslot/room instance
// that is contained by the timeTable's timeslotList/roomList.
return new HorarioComidas(recetaService.findAll(), usuarioRecetaService.findByUsuario(usuario), Arrays.asList(FechaSemana.values()), Arrays.asList(Comida.values()));
}
public void save(HorarioComidas horarioComidas) {
for (UsuarioReceta usuarioReceta : horarioComidas.getUsuarioRecetas()) {
usuarioReceta.setUsuario(usuario);
usuarioRecetaService.create(usuarioReceta);
}
}
}
  • 调用 OptaPlanner 服务的函数:
public void generarListaCompra(Usuario usuario) throws InterruptedException {
optaPlannerService.solve(usuario);
HorarioComidas horarioComidas = optaPlannerService.getTimeTable(usuario);
while (horarioComidas.getSolverStatus() != SolverStatus.NOT_SOLVING) {
// Quick polling (not a Test Thread Sleep anti-pattern)
// Test is still fast on fast machines and doesn't randomly fail on slow machines.
Thread.sleep(20L);
horarioComidas = optaPlannerService.getTimeTable(usuario);
}
}
  • 约束提供程序,但目前没有限制:
public class HorarioComidasConstraintProvider implements ConstraintProvider {
@Autowired
private IntoleranciaUsuarioService intoleranciaUsuarioService;
@Autowired
private IntoleranciaRecetaService intoleranciaRecetaService;
@Override
public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
return new Constraint[]{};
}
}
  • 控制台返回什么:
2020-06-04 14:12:42.186  INFO 10130 --- [  restartedMain] .ConditionEvaluationDeltaLoggingListener : 
Condition evaluation unchanged
2020-06-04 14:21:37.238  INFO 10130 --- [pool-5-thread-1] o.o.core.impl.solver.DefaultSolver       : 
Solving started: time spent (3), best score (0hard/0soft), environment mode (REPRODUCIBLE), random (JDK with seed 0).
2020-06-04 14:21:37.239  INFO 10130 --- [pool-5-thread-1] o.o.core.impl.solver.DefaultSolver       : Skipped all phases (2): out of 0 planning entities, none are movable (non-pinned).
2020-06-04 14:21:37.239  INFO 10130 --- [pool-5-thread-1] o.o.core.impl.solver.DefaultSolver       : Solving ended: time spent (4), best score (0hard/0soft), score calculation speed (250/sec), phase total (2), environment mode (REPRODUCIBLE).

我想最好添加一个简单的约束(奖励/惩罚(以允许求解器计算分数,这将有助于它猜测是否会有变化,您能否在解决之前和之后使用您的@PlanningSolution/规划实体(在您的情况下为规划实体收藏财产(的一些日志更新您的帖子? 这也将有助于记录分数。

PS:尝试覆盖"HorarioComidasService::save"以在保存之前登录。

相关内容

最新更新