我正在用Java编写一个时间表生成器,使用AI方法来满足硬约束并帮助找到最佳解决方案。到目前为止,我已经实现了迭代构造(最受限制的第一种启发式算法)和模拟退火算法,而且我正在实施遗传算法。基因交叉函数
对这个问题的一些信息,以及如何我代表它,然后: 我有一组事件,房间功能(即事件需要和房间满足),学生和插槽 的问题在于分配给每个事件老虎机和一个房间,这样就不需要学生在一个时间段内参加两个活动,所有分配的房间都满足了必要的要求。
我有一个等级的功能,为每套如果分配档次的软约束违规,因此关键是要尽量减少这种。
我实施遗传算法的方式是从迭代构建(可以将事件未分配)生成的种群开始,然后执行正常步骤:评估,选择,交叉,变异并保持最佳状态。冲洗并重复。
我的问题是,我的解决方案似乎改善太少。无论我做什么,人口往往会随机适应,并在那里停滞不前。请注意,这种健身总是不同的,但是会出现下限。
我怀疑问题出在我的交叉功能,这里是一个道理:
两个任务是随机选择交叉。让我们称之为分配A和B.对于所有B的事件,执行以下程序(顺序B的事件都被选中是随机的):
获取一个对应的事件,并比较分配。 3种不同的情况可能发生。
- 如果只有其中一个未分配,并且如果有可能在子项上复制另一个分配,则选择此分配。
- 如果两者都被分配,但只有一个分配给孩子的时候不产生
冲突,一个选择。 - 如果它们都被分配并且没有创建冲突,则它们是随机选择的 。
在任何其他情况下,该事件被留下未分配的。
这将创建一个孩子的一些家长的任务,一些母亲的,所以在我看来,这是一个有效的功能。而且,它并没有打破任何硬性限制。
至于突变,我用我的SA邻近的功能给我基于对孩子的另一项任务,然后更换这个孩子。
再次。通过这种设置,初始人口数为100,GA运行并始终趋于稳定在某个随机(高)适应值。有人能给我一个关于我可能做错什么的指针吗?
感谢
编辑:格式化并清除一些事情
嗨。我想这可能不是最好的,但它可以完成,因为它在几篇论文中显示http://secretgeek.net/content/bambrilg.pdf,http://www.cs.nott.ac.uk/ TR/1995/1995-8.pdf等等,所以我真的很希望看到我的实现工作正在进行......现在它应该会聚到具有这种交叉功能的最佳解决方案,但显然它不会“所以我做了一些错误=/ – JMarques