anchor.diff:                          // ... in the same timeslot ...
                           Joiners.equal(Lesson::getTimeslot),
                           // ... in the same room ...
  -                        Joiners.equal(Lesson::getRoom),
  -                        // ... and the pair is unique (different id, no reverse pairs)
  -                        Joiners.lessThan(Lesson::getId))
  +                        Joiners.equal(Lesson::getRoom))
                   // then penalize each pair with a hard weight.
                   .penalize("Room conflict", HardSoftScore.ONE_HARD);
       }
  
positive.code: import org.acme.optaplanner.domain.TimeTable;
  import org.acme.optaplanner.domain.Timeslot;
  import org.optaplanner.core.api.score.ScoreManager;
  import org.optaplanner.core.api.solver.SolverManager;
  import org.optaplanner.core.api.solver.SolverStatus;
  
  
negative.code:     @Inject
      SolverManager<TimeTable, Long> solverManager;
      @Inject
      ScoreManager<TimeTable, HardSoftScore> scoreManager;
  
      // To try, open http://localhost:8080/timeTable
      @GET
  