特殊调度算法(模式扩展)

时间:2010-02-08 15:36:50

标签: genetic-algorithm

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

我认为问题的某些方面对于生成器/健身功能样式设置很有用。 (如果你有一个类似的项目,我很乐意听到你的意见,而不是做类似的事情)

感谢您提供有关如何构建事物和正确解决问题的任何提示。

问题
我正在寻找一个好的调度算法来用于以下现实世界的问题。

我有一个包含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的行数按照上述约束条件的行数最小化。

2 个答案:

答案 0 :(得分:2)

子问题解决方案尝试

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

基础载体

首先,你应该生成我认为的基础向量。例如,如果您的序列长度为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的所有可能的基础向量。从我的粗略计算中我认为那里介于长度为15的300-400个基本矢量之间。如果你愿意,我可以给你一些生成它们的提示。

寻找解决方案

现在,您要做的是按照它们的总和/大小对这些基础向量进行排序。然后在搜索解决方案时,从具有最大总和的基础向量开始。我们从具有最大总和的向量开始,因为它们导致总行数较少。我们还有一个数组veccoefs,它包含每个基矢量的线性系数的条目。在搜索解决方案之初,所有的veccoef都是0。

因此我们采用第一个基矢量(具有最大和/幅度的矢量)并从序列中减去该矢量,直到我们创建一个无法解析的结果(例如,在其中具有0 1 0)或任何数字结果是否定的。我们存储我们在veccoefs中减去矢量的次数。我们使用从序列中减去基矢量后的结果作为下一个基矢量的序列。如果结果中只剩下零,那么我们就会停止循环。

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

其他可能的解决方案

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

此外,您可以考虑使用Metropolis型蒙特卡罗解决方案。您可以随机选择是在每一步添加矢量,移除矢量还是替换矢量。要添加/删除/替换的向量将随机选择。接受这种变化的概率是变化前和变化后的解决方案的适用性的比率。适用性可以等于当前解和序列之间的差,平方和求和,减去解中涉及的行/基矢量的数量。您需要为各种术语设置适当的常量,以使接受率达到50%左右。我有点怀疑这会很好用,但我认为在寻找可能的解决方案时你仍然应该考虑它。

答案 1 :(得分:1)

GA可以应用于此问题,但它不会是5分钟的任务。你需要将几个东西放在一起,而不知道每个东西的哪个实现是最好的 所以:

  1. 解决方案表示 - 您将如何表示可能的解决方案?使用矩阵似乎是最直接的。也可以使用一维数组的集合。 但是你有一些约束,所以也许SuperGene概念值得考虑?
  2. 您必须使用适当的突变/交叉算子进行给定的基因表示。
  3. 您将如何对解决方案施加约束?摧毁那些不合适的人?如果它们包含有价值的信息呢?也许让他们留在人口中但是会给健身增加一些惩罚,所以他们会为后代做出贡献,但不会进入下一代呢?
  4. 无论如何,我认为GA可以应用于这个问题。这值得吗?通常GA不是最好的算法,但如果其他算法失败,它们就是不错的算法。我会选择GA,因为它最有趣但我会寻找替代解决方案(以防万一)。

    P.S。个人见解:我正在解决N皇后问题,70< N< 100(董事会NxN,N女王)。算法对于较低的N工作正常(可能它正在尝试所有组合?),但是在此范围内的N,我找不到合适的解决方案。健身迅速跃升至最大值的90%左右,但最终总共有两个皇后冲突。但这是非常天真的实施。