Number Partition Problem(数字划分问题|

2020-01-04  本文已影响0人  winddy_akoky

一、前言

这是神州南部的SZ大学某门水课的大作业。如果你也不幸进了这所大学,也跟我一样报了LH老师的课,我的这份作业也许能帮你节省不少时间。

二、问题

我拿到的NP问题是Partion Problem,这是一个最简单的NP-Hard问题。其问题大概是这样的:

给定一个含有n个元素的集合:

S=\{a_i | i \in \{1,...,n\} \}

问是否存在集合S的一个划分:S=S_1 \cupS_2,使得S_1的元素之和等于S_2的元素和。例如,给定下列集和:

2 \ 10 \ 3 \ 8 \ 5 \ 7 \ 7 \ 9 \ 5 \ 3 \ 2

我们可以把上面集合划分成\{2,5,3,10,7\}\{2,5,3,9,8\},这两个集合的元素和都为27。对于这个问题,如果穷举所有可能性的话,其时间复杂度是O(2^N),且这个问题的复杂主要受集合的长度和集合中元素的大小的影响。如果集合长度短或者是集合中的最大元素比较小,都可以找到一个多项式时间算法去解决这个问题。

三、解法

我上网收到了两篇论文:


image.png
image.png

一个是用动态规划+回溯法来求解,另一个是用变领域的遗传算法来求解。下面我简单介绍一下。

动态规划+回溯法

设集合的长度为n ,集合中最长的元素为m ,当n:m比值比较大时,说明这个集合比较稠密,这时我们偏向于用动态规划求解划分问题;而当这个比值比较小时,说明集合比较稀疏,这时我们倾向于用回溯方法解决划分问题,因为如果用动态规划去解决稀疏集合的话,就会浪费大量的内存空间。

基于上面的分析,我们最终结合动态规划和回溯法这两种算法。其主要思想是先把集合分成两个部分,一部分是稀疏的集合,另一部分是稠密的集合。对于稀疏的集合,就用回溯法解决;对于稠密的集合,就用动态规划进行求解。这种策略很好融合了动态规划与回溯法的优点,使得算法更加快速高效。其具体算法如下:

image.png

并行可对回溯法进行。

变领域遗传算法

这里并不仔细介绍遗传算法和变领域算法,不了解的自行百度了解一下。

image.png

代码和PPT

福利:https://github.com/WinddyAkoky/Number-Partition-Problem

友情提示:emmmm这份代码有点问题,就是dp_bs的并行时间比串行时间长。。。。尴尬。。。。不过LH那货肯定不看。。哈哈哈哈。。。如果你能把dp_bs的并行改好了,记得给我一个留言,我学习学习 -_-

上一篇下一篇

猜你喜欢

热点阅读