Algorithm 查找极端高阶元素关系的优先级函数/字母顺序

Algorithm 查找极端高阶元素关系的优先级函数/字母顺序,algorithm,math,Algorithm,Math,这个问题是问题的延伸。不同之处在于,现在我们的优化函数将在元素之间具有更高阶的关系: 我们有一个由字母表E中的元素a1,a2,…an组成的数组。假设|N |>|E | 对于字母表的每个符号,我们定义一个唯一的整数优先级=V(sym)。为了简单起见,让我们定义V{i}:=V(symbol(ai)) 任务是找到优先级函数V,其: Count(i)->MIN | V{i} > V{i+1} <= V{i+2} Sum(for all j in range [1,M]) {Cou

这个问题是问题的延伸。不同之处在于,现在我们的优化函数将在元素之间具有更高阶的关系:

我们有一个由字母表
E
中的元素
a1,a2,…an
组成的数组。假设
|N |>|E |

对于字母表的每个符号,我们定义一个唯一的整数优先级=
V(sym)
。为了简单起见,让我们定义
V{i}:=V(symbol(ai))

任务是找到优先级函数V,其:

Count(i)->MIN |   V{i} > V{i+1} <= V{i+2}
Sum(for all j in range [1,M]) {Count(i)}->EXTREMUM | V{i} B[j,1] V{i+1} B[j,2] ... B[j,K] V{i+K}

例如,找到优先级函数
V
,对于该函数,满足
V{i}V{i+2}
i
数最小。

我的直觉是,这个问题的所有变化都将被证明是NP难的。所以我开始寻找能给出合理答案的启发式方法。这可能涉及一些尝试和错误

一个简单的方法是写下一个可能的排列。然后尝试可能的交换,直到达到当地的最低要求。尝试几次,然后选择最佳答案

模拟退火为这种方法提供了更复杂的版本,有关说明,请参见。可能需要一些实验才能找到一组似乎收敛得比较好的参数

另一个想法是寻找一种遗传算法。基于谷歌的快速搜索,这样做的标准方法似乎是尝试将NP完全问题转化为SAT问题,然后在该问题上使用遗传算法。这种方法需要以某种合理的方式将其转化为SAT问题。不幸的是,我并不清楚人们将如何着手进行这种削减。事实上,在你的第一个版本中,你的问题与一个经典的NP难问题密切相关。事实上,它被标记为NP难而不是NP完全,这证明人们还没有找到一个好方法将其转化为SAT问题。因此,如果不清楚如何将简单的问题转化为SAT问题,那么您也不太可能转化为困难的问题

但你仍然可以尝试一些变异的遗传算法。突变很简单,只需交换一些元素。组合元素的一种方法是进行3次排列,然后使用快速排序来找到组合,如下所示:选择一个随机支点,然后使用“多数获胜”将元素分为大小。以相同的方式对每一半进行排序


很抱歉,我不能只是给你一个方法,然后说,“这应该行得通。”你已经有了一个开放式的研究项目,我能做的最好的事情就是给你一些想法,让你可以尝试一些可能会相当好用的东西。

想知道这个问题的动机是什么?@ThomasMcLeod。我的BWT排序算法使用改进的2阶伊藤田中版本作为基础。因此,它只需要对那些满足条件
S{i}>S{i+1}的子字符串直接排序,除非你有理由相信不是这样,否则我认为这种类型的任何问题都是NP难的。@b当然。我不需要精确的解决方案。任何给出合理结果的贪婪算法就足够了。啊,在这种情况下,写下一个随机排列。然后尝试交换元素,并在它改进排列时接受交换。当达到局部最小值时,就有了解决方案。重复该过程任意次数,并接受最佳最小值。