我试图用OptaPlanner解决以下问题:
有必要在employees.
List<Cost>只有到达工作地点的时间是重要的)。我用GraphHopper做建筑成本矩阵。源代码:
@Data
@NoArgsConstructor
@PlanningEntity
public class Job {
@PlanningId
private Long id;
@PlanningVariable(valueRangeProviderRefs = "employeeRange")
private Employee employee;
private Coordinate coordinate;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@PlanningEntity
public class Employee {
@PlanningId
private Long id;
@InverseRelationShadowVariable(sourceVariableName = "employee")
private List<Job> jobs;
}
@Data
@NoArgsConstructor
@PlanningSolution
public class Plan {
@ProblemFactCollectionProperty
@ValueRangeProvider(id = "employeeRange")
private List<Employee> employees;
@PlanningEntityCollectionProperty
private List<Job> jobs;
@PlanningScore
private HardSoftScore score;
}
@Data
public class Cost {
private Job from;
private Job to;
private Long time;
}下面是约束类:
public class CustomConstraintProvider implements ConstraintProvider {
@Override
public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
return new Constraint[] {
minInspectionNumberConflict(constraintFactory),
maxInspectionNumberConflict(constraintFactory)
};
}
Constraint minInspectionNumberConflict(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(Employee.class)
.filter(employee -> employee.getApplications().size() < 5)
.penalize("Min Count",
HardSoftScore.ONE_HARD,
employee -> 5 - employee.getApplications().size());
}
Constraint maxInspectionNumberConflict(ConstraintFactory constraintFactory) {
return constraintFactory.forEach(Employee.class)
.filter(employee -> employee.getApplications().size() > 10)
.penalize("Max Count", HardSoftScore.ONE_HARD,
employee -> employee.getApplications().size() - 10);
}
}我怎样才能解决这个问题呢?
提前谢谢你的帮助。
发布于 2022-07-14 15:42:03
您需要更改域;在Cost中,我可以看到您要求对作业进行排序,但是Job没有任何问题属性(即非计划变量字段)可以用来确定顺序(例如,日期时间字段)。
要强制执行订单,可以使用两种不同的模型:
Job指向前一个Job (第一个Job指向Employee)。这是由https://www.optaplanner.org/docs/optaplanner/latest/planner-configuration/planner-configuration.html#chainedPlanningVariable和https://www.optaplanner.org/docs/optaplanner/latest/design-patterns/design-patterns.html#chainedThroughTimePattern .解释的。
@PlanningListVariable,其中为每个Employee分配了一个有序的作业List (每个任务只分配给一个雇员)。这会将Employee更改为带有作业@PlanningListVariable的@PlanningEntity,并将Job更改为shadow entity (将@PlanningVariable更改为@InverseRelationShadowVariable)。https://github.com/kiegroup/optaplanner-quickstarts/tree/stable/use-cases/vehicle-routing .就是一个例子。
约束的最终形式将取决于所使用的模型。
https://stackoverflow.com/questions/72882869
复制相似问题