此问题是following one的扩展。不同之处在于,现在我们的优化功能将在元素之间具有更高阶的关系:
我们有一个来自字母a1,a2,...aN
的元素数组E
。假设|N| >> |E|
。
对于字母表中的每个符号,我们定义一个唯一的整数优先级= V(sym)
。为简单起见,我们定义V{i} := V(symbol(ai))
。
任务是找到优先级函数V,其中包括:
Count(i)->MIN | V{i} > V{i+1} <= V{i+2}
换句话说,我需要找到满足条件i
的职位数V{i}>V{i+1}<=V{i+2}
最小的字母表的优先顺序/排列。
最大需要抽象(对我来说是低优先级)。我想一旦initial question的解决方案模型扩展到覆盖这一部分的第一部分,将其扩展得更远(见下文)会更容易。
给定一个大小为MxK的符号B矩阵(基本上B[i,j]
来自集合{<,>,<=,>=}
),找到优先级函数V,其中:
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
,i
满足V{i}<V{i+1}<V{i+2}
或V{i}>V{i+1}>V{i+2}
的数量最少。
答案 0 :(得分:1)
我的直觉是,这个问题的所有变化都将证明是NP难的。所以我开始寻找可以产生合理答案的启发式方法。这可能涉及一些反复试验。
一种简单的方法是记下可能的排列。然后尝试可能的互换,直到你到达当地最低点。尝试几次,然后选择最佳答案。
模拟退火提供了此方法的更复杂版本,请参阅http://en.wikipedia.org/wiki/Simulated_annealing以获取说明。可能需要进行一些实验才能找到一组似乎相对较好收敛的参数。
另一个想法是寻找遗传算法。基于快速谷歌搜索,看起来这样做的标准方法是尝试将NP完全问题转化为SAT问题,然后在该问题上使用遗传算法。这种方法需要以某种合理的方式将其转化为SAT问题。不幸的是,我不明白如何进行这种减少。事实上,在你的第一个版本中,你的问题与经典的NP难问题密切相关。它被标记为NP-hard而非NP-complete的事实证明人们还没有找到将其转化为SAT问题的好方法。因此,如果将简单版本转换为SAT问题并不明显,那么您也不太可能转换硬问题。
但你仍然可以尝试遗传算法的一些变化。变异非常简单,只需交换一些元素。组合元素的一种方法是采用3种排列并使用快速排序来查找组合,如下所示:采用随机旋转,然后使用“多数胜利”将元素分解为更大和更小。以相同的方式对每一半进行排序。
对不起,我不能只是给你一个方法并说,“这应该有效。”你看起来像是一个开放式的研究项目,我能做的最好的就是给你一些关于你可以尝试的事情的想法,这些事情可能会运作得相当好。