我想找到WIS问题的变体,其中结果必须是具有最小权重和的较大子集。例如,在:
Input: Number of Intervals n = 5
Interval Details: (start-finish, weight)
Interval 1: (0-5, 15)
Interval 2: (4-9, 18)
Interval 3: (10-15, 12)
Interval 4: (8-21, 19)
Interval 5: (25-30, 25)
答案必须是子集{3,1,5},因为这是具有最大元素和最小权重和ws = 52(12 + 15 + 25)的子集。
这个问题是项目的一部分,我为此搜索了很多内容,但却以这种方式找到了任何东西。我不熟悉算法和编程,如果我在这里写一些愚蠢的东西,我很抱歉。
你知道如何解决这个问题吗?
答案 0 :(得分:0)
蛮力方法:找到所有可能的起始间隔和所有可能的最后间隔,并计算起始和结束间隔之间的所有可能序列。这相当于计算有向无环图(DAG)中节点对之间的所有路径。
计算起始间隔:
同样,计算结束间隔:
计算这两组之间的所有路径:
这里需要应用一种算法来计算DAG中的所有路径。实现可以在互联网上找到。一个例子:
void recursive(Interval current, Interval destination, List<Interval> path)
{
path.Add(current);
if (current == destination)
{
if (path.Count > maxLength || (path.Count == maxLength && pathWeight < minWeight))
{
minWeightPath = new List<Interval>(path);
}
path.Remove(current);
return;
}
//Successors are all intervals with startTime >= current.finishTime
List<Interval> possibleSuccessors = getAllSuccessors();
foreach (var item in possibleSuccessors)
{
recursive(item, destination, path);
}
path.Remove(current);
}
通过以下方式调用此方法:
foreach (var startNode in startingNodes)
{
List<Interval> path = new List<Interval>();
foreach (var endNode in endNodes)
{
if (startNode.finishTime < endNode.startTime)
recursive(startNode, endNode, path);
}
}