我有多个组来指定符号的关系..例如:
[A B C]
[A D E]
[X Y Z]
这些组的含义是(对于第一组)符号A,B和C彼此相关。 (第二组)符号A,D,E彼此相关......等等。
鉴于所有这些数据,我需要将所有唯一符号放入一维数组中,其中彼此以某种方式相关的符号将彼此靠得更近。鉴于上面的例子,结果应该是这样的:
[B C A D E X Y Z]
或
[X Y Z D E A B C]
在这个结果数组中,由于符号A有多个关系(即在一个组中有B和C,在另一个组中有D和E),它现在位于这些符号之间,稍微保留了这种关系。
请注意,订单并不重要。在结果中,X Y Z可以放在第一个或最后一个,因为这些符号与任何其他符号无关。但是,相关符号的接近程度非常重要。
我需要帮助确定采用符号关系组的算法,然后使用上面的逻辑输出1维数组。由于使用实际数据,关系组中符号的数量可以变化,关系组的数量也没有限制,符号可以与任何其他符号有关系,因此我正在研究如何执行此操作。
为了进一步说明我的困境的棘手问题,如果你在上面的例子中添加了另一个关系组。让我们说:
[C Z]
结果现在应该是:
[X Y Z C B A D E]
请注意,符号Z和C现在更接近,因为它们的关系通过附加数据得到了加强。之前的所有关系仍保留在结果中。
答案 0 :(得分:5)
您需要做的第一件事就是精确定义您想要的结果。
您可以通过定义结果的好坏来做到这一点,这样您就知道哪个是最好的结果。数学上你通过成本函数来做到这一点。在这种情况下,通常会选择相关元素之间的距离之和,这些距离的平方和或最大距离。然后,具有较小的成本函数值的列表是期望的结果。
目前尚不清楚在这种情况下是否可以通过某种特殊方法计算最佳解决方案(例如,如果选择最大距离或距离之和作为成本函数)。
无论如何,通过标准方法很容易找到一个很好的近似值。
一个简单的greedy approach就是将每个元素插入到整个列表的结果成本函数最小的位置。
一旦你有了一个好的起点,你可以尝试通过修改列表以获得更好的解决方案来进一步改进它,例如通过交换元素或旋转列表的一部分(local search,hill climbing,{ {3}},simulated annealing)。
答案 1 :(得分:2)
我认为,由于数据量大且缺乏额外标准,制作最佳选择的东西将非常困难。你有没有考虑过做一个贪婪的算法(以一种能让你接近理想解决方案的方式逐步构建你的解决方案)?这是我的想法:
按大小对相关符号集进行排序,并从最大的一个开始。把它们放在一起,因为没有任何其他标准,我们不妨说它们的接近度是最重要的,因为它是最大的集合。考虑第一个中的每个符号设置一个“端点”,一个端点是一个符号,你可以重新排列并放在数组的任何一端,而不会破坏你的接近规则(第一组中的所有内容最初都是一个端点,因为它们可以在任何端点中重新排列办法)。然后浏览您的列表,只要一个集合中有一个或多个与第一个集合相同的符号,请相应地连接它们。您连接到彼此的符号不再被视为端点,但其他所有符号仍然是。即使一个更大的集合只有一个共同的符号,我会猜测这比具有更多符号的小集合更好,因为这样,至少较大的集合保持在一起而不是可能被分割,如果它是比较小的集合放入数组。
我会继续这样做,更新已存在的端点列表,以便您可以在完成设置时继续进行匹配。我会跟踪我是否停止制作比赛,在这种情况下,我只是进入列表的顶部,然后选择下一个最大的,无与伦比的组合(如果没有更多匹配则无关紧要)制作,所以去最有价值/最大的协会)。抛弃旧的端点,因为它们没有匹配,然后你刚刚添加的集合的所有符号都是新的端点。
这可能没有足够好的运行时间,我不确定。但希望它能给你一些想法。
编辑:显然,作为算法的一部分,沟渠重复(琐碎)。
答案 2 :(得分:2)
所描述的问题基本上是drawing一维图形的问题。
使用关系构建图表。将唯一符号视为图的顶点。在关系中共同出现的任意两个顶点之间放置一条边;更复杂的是基于符号对共同出现的关系的数量来构造权重。
用于绘制图形的算法将连接良好的顶点彼此靠近,这相当于将相关符号放置在彼此附近。由于仅需要排序,因此可以基于它们在图中的位置对符号进行排序。
绘制图表有很多算法。在这种情况下,我会使用Fiedler ordering,它使用graph Laplacian的特定特征向量(Fiedler向量)对顶点进行排序。在明确定义的数学意义上,Fiedler排序是直截了当,有效且最优的。
答案 3 :(得分:0)
听起来你想进行拓扑排序:http://en.wikipedia.org/wiki/Topological_sorting
关于初始排序,似乎你试图强制执行某种稳定性条件,但我不清楚你的问题应该是什么。您可以尝试在描述中更准确一点吗?