0

optaplanner를 처음 사용하려고 시도했습니다. (은 매우 간단하고 도움은 매우 완전하며 오류 메시지는 매우 명확합니다). 내 문제는 간단합니다. 크기에 따라 팀을 팀에 할당하십시오. 나는 모든 방을 채우고 싶습니다, 그리고 나는 팀이 훨씬 더 많은 사람들이 이용 가능한 공간 인보다 더 많을 수도 있습니다.Optaplanner에서 변수 할당을 강제로하지 마십시오

제 문제는 분명히 모든 팀을 할당 할 수 없다는 것입니다. 그리고 나는 이것을 어떻게 나타낼 지 궁금합니다.

처음에는으로 HARD_SOFT 점수를 사용했습니다. 사용 가능한 공간과 할당 된 팀의 차이로 인해 필자에게 하드 스코어가 주어졌습니다. 간단한 구현으로 솔버는 하드 제한을 깨는 경우에도 모든 팀을 할당하고 계속 실행합니다.

// Loop on all rooms 
    for (Room currentRoom : currentAllocation.getRoomList()){ 
     int requiredSize = 0; 
     // Cumulated sum of allocated people required size 
     for (People currentPeople : currentAllocation.getPeopleList()){ 
      if (currentRoom.equals(currentPeople.getRoom())){ 
       requiredSize += currentPeople.get_requiredSize(); 
      } 
     } 
     // Check if max capacity is respected or not for current room 
     if (requiredSize > currentRoom.getSize()){ 
      // Max capacity is not respected 
      hardScore += (currentRoom.getSize()-requiredSize); 
     }     
    } 

다음, 나는 또 하나 개의 인공 룸 (방 0)을 추가했다. 팀이 그 방에 배정되면 내 점수가 떨어집니다. 다른 객실은 하드 스코어로 추적됩니다.

이제 하드 점수가 0이되면 즉시 솔버를 멈출 수 있습니다. 소프트 점수는 왼쪽 공간을 줄이기 위해 사용됩니다. 그리고 최종 솔루션에서 할당되지 않은 팀 (방 0에 할당 된 팀)을 쉽게 찾을 수 있습니다. 진행하는 올바른 방법입니까?

많은 도움을 주셔서 감사합니다.

ThePolyscope.com

답변

0

이것은 을 계획 overconstrained이라고합니다. 문서 및 병원 침대 계획 (pas) 예에서 @PlanningVariable(nullable = true)을 살펴보십시오.

+0

도움 주셔서 감사합니다. – RandomCoder

관련 문제