0

我想用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,即如果一个球员被分配到member1member2我不在乎。 求解器主要使用默认配置,并且配置为在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). 
+0

你有多少个'Roster'实例? –

回答

1

见网球例如:每个Day例如,有4个TeamAssignment实例,而不是4个规划变量上Day本身。

虽然搜索空间相同,但默认移动(changeMove和swapMove)效果更好,因为您将在TeamAssignment“day1-spot1”和TeamAssignment“day2-spot3”之间交换。

+0

有关建议的更改,请参阅编辑2。求解器现在根本找不到任何改进 - 我错过了什么? – geld0r

+0

可视化输出解决方案,并了解如何改进输出解决方案(如果甚至可能),启用调试和跟踪日志记录以了解发生了什么,请设置基准测试程序。之后,在这些事情之后,尝试添加一个pilarChange/SwapMoveSelector。 –

+0

我真的不明白为什么解决者不能改进初始解决方案,但发现这在我手动构建(天真)开始解决方案时起作用。从那时起,实际的改进就完成了,并且达成了一个好的解决方案我将不得不尝试高级配置。由于我无法加载配置xml文件(无论出于何种原因,没有找到),我只能使用代码中的配置直到现在看起来没有提供高级配置。 – geld0r