我想用Optaplanner建模和解决的问题是为体育团队(这里:足球)创建一个名单。即:从所有可用的玩家中,根据若干标准选择11。我使用硬/中/软分数来定义有效的解决方案,例如一个严格的标准,指定一名守门员必须出现在名单中。玩家选择的顺序并不重要。建模:有效地建模子集选择
我现在有这个作为我PlanningEntity
:
@PlanningEntity
public class Roster
{
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member1;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member2;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member3;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member4;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member5;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member6;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member7;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member8;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member9;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member10;
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member11;
public List<RosterMember> getMembers()
{
return Lists.newArrayList(member1, member2, member3, member4, member5, member6, member7, member8, member9, member10, member11);
}
}
对于分数计算我只用getMembers
,即如果一个球员被分配到member1
或member2
我不在乎。 求解器主要使用默认配置,并且配置为在100s后超时,或者10s后未实现改进。
在对某些样本数据集进行处理后,我发现求解器在大多数情况下找不到最优解(但至少是有效的),例如,不是最好的守门员(这通常很容易看到,因为没有多少可用的选择,应该选择一个)。
我怀疑这与我建模PlanningEntity
的方式有关:由于所有名单成员都可以单独设置,这似乎使解决方案的空间不必要的大。如前所述,成员分配给哪个字段并不重要。只有(或者更确切地说是谁)被分配,谁不能分配才重要。所以我基本上需要选择一部分玩家,同时满足一些限制和优化标准。
但是,简单地注释List of RosterMember
s为@PlanningVariable
似乎不起作用。在例子中我也找不到类似的情况。 我想这应该是一个简单的建模例子?
到目前为止,我能想出的唯一想法是明确地建模一些(硬)约束,例如,只将其范围限制为goalkeeper
,而将所有其他范围限制为non-goalkeeper
(或甚至更多)。根据文件(4.3.5.2.3),这应该避免。
编辑:我只有一个名册实例。我假设不同团队的名单不相关,并计划按顺序为每个团队运行求解器。
编辑2:以下的建议,我现在有这个,而不是以前Roster
:
@PlanningEntity
public class RosterAssignment
{
@PlanningVariable(valueRangeProviderRefs = {"candidates"})
private RosterMember member;
}
在创建初始悬案的解决方案,我加11个空RosterAssignments。 然而求解似乎并不能够改善任何东西开始解决方案已被创建后:
(DefaultConstructionHeuristicPhase.java:158) Construction Heuristic phase (0) ended: step total (11), time spent (111), best score (-1hard/-2medium/1275soft).
(DefaultLocalSearchPhase.java:152) Local Search phase (1) ended: step total (375104), time spent (10111), best score (-1hard/-2medium/1275soft).
(DefaultSolver.java:238) Solving ended: time spent (10129), best score (-1hard/-2medium/1275soft), average calculate count per second (75545), environment mode (REPRODUCIBLE).
你有多少个'Roster'实例? –