OptaPlanner 공부하기 - 1
Optaplanner 란
solution 에 제약 조건들은 예를 들면 아래처럼 나타낼 수 있다. knapsack 같은 경우,
간단히 말해서, 최적화 문제를 인공지능적인 방법으로 접근해서 해결해주는 open source java library 이다. maven 을 통해 import 를 할 수있으며, 소스 또한 github 에 공개 되어 있다. pure 100% java 로 짜여있고, SpringBoot 와도 compatible 하다. 문제를 해결하기 위한 수학적 방정식같은걸 짜지 않아도 된다고 한다.
Optaplanner 라는 이름에서도 유추할 수 있겠지만, 이 도구가 해결해주는 문제는 간단히는 knapsack problem 부터 시작 해서, vehicle routing, employee rostering, maintanence scheduling, task assignment, school timetabling 같은 것들이 있다. 제한된 자원을 문제 해결을 위해 할당해서 처리해야 하는데 optimal solution 을 내주는 것이다.
인공지능 하면, 방대한 데이터를 학습시켜서 판단하는 gene 같은걸 형성하는 거라고 생각했는데, maven library 를 import 하는 것만으로도 된다니 신기하다.
knapsack 문제 해결하는 예제를 따라가면서 해봤는데, 일단은 신기하다. 일단 개발자가 해야하는 일은 문제와 제약조건들에 annotation 을 달면 된다. 하나하나 앞으로 공부해가야 할 것들이다.
@PlanningEntity,
@PlanningVariable,
@PlanningEntityCollectionProperty,
@ProblemFactProperty,
@PlanningScore
maxWeight 를 넘으면 안되면서(penalize),
private Constraint maxWeight(ConstraintFactory constraintFactory) {
return constraintFactory.from(Ingot.class).filter(i -> i.getSelected())
.groupBy(ConstraintCollectors.sum(i -> i.getWeight())).join(Knapsack.class)
.filter((ws, k) -> ws > k.getMaxWeight())
.penalize("Max Weight", HardSoftScore.ONE_HARD, (ws, k) -> ws - k.getMaxWeight());
}
최대로 넣을 수 있는(reward) solution 을 찾아야 한다. private Constraint maxValue(ConstraintFactory constraintFactory) {
return constraintFactory.from(Ingot.class)
.filter(Ingot::getSelected)
.reward("Max Value", HardSoftScore.ONE_SOFT, Ingot::getValue);
}
앞으로 살펴보면서 공부를 해야겠다.
Comments
Post a Comment