从源列表创建新的随机列表

时间:2012-12-04 05:23:59

标签: .net vb.net algorithm list random

我正在使用VB.net 2012,我想在代码中执行以下操作:

我有一个长度为x的媒体项目列表 列表中的每个项目的持续时间为y 我想创建一个总持续时间为z的新随机列表,这些项目只能在这个新列表中出现一次。

最好的方法是什么?我不确定这是否属于'背包问题'。无论哪种方式,我可以帮助实现这一点,无论是使用伪代码还是实际的vb.net代码?

2 个答案:

答案 0 :(得分:1)

我可能会误解你,但似乎你有l个对(item,x)的列表,你想找到l的一个子集(让它为l')这样sum(l'.e.item) == z

不幸的是 - 您正在描述Subset Sum ProblemNP-Complete,所以没有已知的多项式解决方案

如果列表相当小,您可以使用暴力(检查所有可能性)。如果数字都是整数,则还有DP solution以伪多项式时间运行。
一些替代方法是近似算法或启发式算法 - 例如Genetic Algorithms

答案 1 :(得分:0)

伪代码:

1. Object Song: properties Name, Duration
2. mlstLibrary = List(Of Song) ... fill mlstLibrary
3. user enters desired playlist duration intPlaylistDuration    
4. make a copy of mlstLibrary called mlstLibraryWorking
5. Dim intPlaylistDurationWorking As Integer = 0
6. Dim lstPlaylist As New List(Of Song) ' This is the output playlist
7. Do While mlstLibraryWorking.Count > 0
7a.  Go through mlstLibraryWorking and remove all items that have .Duration > (intPlaylistDuration - intPlaylistDurationWorking)
7b1.  Pick random Song from mlstLibraryWorking 
7b2.  Add selected Song to mlstPlaylist
7b3.  intPlaylistDurationWorking += selected Song.Duration
7b4.  Remove selected Song from mlstLibraryWorking  
8. Loop