【问题标题】:Special scheduling Algorithm (pattern expansion)特殊调度算法(模式扩展)
【发布时间】:2011-01-14 10:13:30
【问题描述】:

问题
您认为遗传算法是否值得尝试解决以下问题,还是我会遇到局部最小值问题?

我认为问题的某些方面对于生成器/健身功能风格的设置来说可能很棒。 (如果你搞砸了一个类似的项目,我很乐意听取你的意见,而不是做类似的事情)

感谢您提供有关如何构建事物并确保正确性的任何提示。

问题
我正在寻找一种很好的调度算法来解决以下实际问题。

我有一个这样的 15 个插槽的序列(数字可能从 0 到 20 不等):

2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

(并且这种类型一共有10个不同的序列)

每个序列都需要展开成一个数组,其中每个槽可以占据1个位置。

1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 
1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 
0 0 1 1 0 0 0 1 1 1 0 0 0 1 1
0 0 1 1 0 0 0 1 1 1 0 0 0 1 1 

对矩阵的约束是:

  • [按行,即水平]放置的数量,必须是11或111
  • [row-wise]两个1的序列之间的距离需要最小为00
  • 每列的总和应该与原始数组匹配。
  • 应该优化矩阵中的行数。

然后数组需要分配 4 个不同的矩阵之一,这些矩阵可能有不同的行数:

A, B, C, D

A、B、C 和 D 是现实世界的部门。负载需要在 10 天期间合理分配,不干扰其他部门目标。

每个矩阵都与 10 个不同原始序列的扩展进行比较,因此您有:

A1, A2, A3, A4, A5, A6, A7, A8, A9, A10
B1, B2, B3, B4, B5, B6, B7, B8, B9, B10
C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
D1, D2, D3, D4, D5, D6, D7, D8, D9, D10

可能会保留其中的某些位置(不确定我是否应该将其仅保留/不保留或基于功能)。 预留的位置可能是会议和其他活动

每行的总和(例如所有 A)应在 2% 内大致相同。即 sum(A1 到 A10) 应该与 (B1 到 B10) 等大致相同。

行数可以变化,例如:

A1:5 行 A2:5行 A3:1 行,例如,单行可以是:

0 0 1 1 1 0 0 0 0 0 0 0 0 0 0

等等。

子问题*

我很乐意只解决部分问题。例如能够输入:

1 1 2 3 4 2 2 3 4 2 2 3 3 2 3

并获得一个适当的序列数组,其中 1 和 0 在上述约束之后的行数上最小化。

【问题讨论】:

  • 我了解优化第一个矩阵中的行数所描述的问题。恐怕我迷失了 A、B、C、D 是什么以及随后的步骤。你能澄清一下吗?
  • 我和克里斯一起要求澄清。第一个矩阵的行优化是整个问题,还是这仅仅是 A、B、C、D “事物”之后的初始要求?也许 ABCD 是解决方案的暂定方法?无论哪种情况,我都无法得到这个 ABCD 东西......
  • 您通常可以通过随机化初始种群并确保初始个体在解决方案空间中的合理分布来解决局部最小值问题。
  • 也许我误解了这个问题,但我看不出你的例子有什么解决方案。末尾的“... 3 2 3”不能应用“11”或“111”;最后两个值将始终为“0 1”,不能应用“11”或“111”。您能进一步解释一下吗?
  • 这不是[en.wikipedia.org/wiki/Knapsack_problem]的问题吗?

标签: genetic-algorithm


【解决方案1】:

子问题解决尝试

嗯,这是一个想法。此解决方案不是基于使用遗传算法,但可以使用一些想法朝着这个方向发展。

基向量

首先,您应该生成我认为的基向量。例如,如果您的序列是 3 个数字而不是 15 个,则基向量将是:

v1 = [1 1 0]

v2 = [0 1 1]

v3 = [1 1 1]

序列长度为 3 的任何解决方案都是仅使用正整数的这三个向量的线性组合。换句话说,一般的解决方案是

a*v1 + b*v2 + c*v3

其中 a、b 和 c 是正整数。对于序列[1 2 1],解是v1 = 1, v2 = 1, v3 = 0。你首先要做的是找到所有可能的长度为15的基向量。根据我的粗略计算,我认为有介于 300-400 个长度为 15 的基向量之间。如果你愿意,我可以给你一些生成它们的技巧。

寻找解决方案

现在,您要做的是按这些基向量的总和/大小对它们进行排序。然后在寻找解决方案时,从总和最大的基向量开始。我们从总和最大的向量开始,因为它们导致总行数减少。我们还有一个数组 veccoefs,其中包含每个基向量的线性系数条目。在开始寻找解的时候,所有的 veccoefs 都是 0。

所以我们取第一个基向量(总和/幅度最大的那个)并从序列中减去这个向量,直到我们创建一个无法解决的结果(例如其中包含 0 1 0)或任何数字结果是否定的。我们将减去向量的次数存储在 veccoefs 中。我们使用从序列中减去基向量后的结果作为下一个基向量的序列。如果结果中只剩下零,那么我们停止循环。

我不确定这种方法的效率/准确性,但它至少可以给你一些想法。

其他可能的解决方案

解决这个问题的另一个想法是使用基向量并将问题形成为优化/最小二乘问题。您形成一个基向量矩阵,这样基本问题将最小化 Sum[(Ax - b)^2] 其中 A 是基向量矩阵,b 是输入序列,x 是基向量系数。但是,您还希望最小化行数,因此可以将 x^T*x 之类的项添加到最小化函数中,其中 x^T 是 x 的转置。在我看来,困难的部分是找到可微分项来添加,这将鼓励整数向量系数。如果您能想到一种方法来做到这一点,那么优化很可能是做到这一点的好方法。

此外,您可以考虑使用 Metropolis 类型的蒙特卡洛解决方案。您将随机选择是在每一步添加一个向量、删除一个向量还是替换一个向量。将随机选择要添加/删除/替换的向量。此更改被接受的概率将是更改之前和更改后解决方案的适用性的比率。适用性可能等于当前解与序列之间的差值,平方和相加,减去解中涉及的行数/基向量。您需要为各种术语输入适当的常量,以尝试使接受率达到 50% 左右。我有点怀疑这是否会很好地工作,但我认为您在寻找可能的解决方案时仍然应该考虑它。

【讨论】:

    【解决方案2】:

    GA 可以应用于这个问题,但它不会是 5 分钟的任务。您需要将几件事情放在一起,但不知道每件事情的最佳实现方式。
    所以:

    1. 解决方案表示 - 您将如何表示可能的解决方案?使用矩阵似乎是最直接的。也可以使用一维数组的集合。 但是你有一些限制,所以也许 SuperGene 的概念值得考虑?
    2. 对于给定的基因表示,您必须使用适当的突变/交叉运算符。
    3. 您将如何对解决方案实施约束?破坏那些不合适的?如果它们包含有价值的信息怎么办?也许让它们留在种群中,但对适应度增加一些惩罚,因此它们会为后代做出贡献,但不会进入下一代?

    无论如何我认为GA可以应用于这个问题。这值得吗?通常 GA 不是最好的算法,但如果其他算法失败,它们是不错的算法。我会选择 GA,只是因为它会很有趣,但我会寻找替代解决方案(以防万一)。

    附:个人见解:我正在解决 N 个皇后问题,70

    【讨论】:

    • (我完全同意 AI 类比仅仅实现可行的东西要酷得多)。我不确定如何解释 SuperGene 的概念。这是一种看待约束的特殊方式,而不是在生成、突变和交叉中强制执行某些约束?
    • 就是这样。在 SuperGene 中,您对具有复杂表示的个体施加约束。就像在您的情况下限制行的总和等一样。您可以将所有其他约束(如果有的话,例如域上的约束)放入您的适应度函数中。此外,在某些情况下,使用 SuperGene 可以提高算法的整体性能,根据jgap.sourceforge.net/doc/supergenes/supergenes.html 顺便说一句,JGAP 是一个很好的包,有很多未来,而且非常易于使用。
    • 谢谢,我会在接下来的几天内调查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多