首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OptaPlanner中增加求解调度问题的约束条件?

如何在OptaPlanner中增加求解调度问题的约束条件?
EN

Stack Overflow用户
提问于 2022-07-06 11:32:11
回答 1查看 104关注 0票数 0

我试图用OptaPlanner解决以下问题:

有必要在employees.

  • There之间划分作业列表,是一个员工可以执行的最小和最大作业数量。(例如,5-10)
  • 每个作业都有一个固定的时间(30分钟)完成
  • ,工程位于不同的地方,因此,有一个成本矩阵(List<Cost>只有到达工作地点的时间是重要的)。我用GraphHopper做建筑成本矩阵。
  • 雇员有一个工作计划。例如,9小时(540 minutes).
  • Jobs )应在员工之间进行分配,考虑到完成工作所需的时间(每项工作30分钟)和成本矩阵,总时间不超过工作计划(540分钟)。

源代码:

代码语言:javascript
复制
@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;

}

下面是约束类:

代码语言:javascript
复制
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);
    }
}

我怎样才能解决这个问题呢?

提前谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2022-07-14 15:42:03

您需要更改域;在Cost中,我可以看到您要求对作业进行排序,但是Job没有任何问题属性(即非计划变量字段)可以用来确定顺序(例如,日期时间字段)。

要强制执行订单,可以使用两种不同的模型:

解释的。

就是一个例子。

约束的最终形式将取决于所使用的模型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72882869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档