具有较小权重和的较大子集(“逆”加权区间调度问题。)

时间:2015-08-29 05:14:05

标签: algorithm scheduling intervals

我想找到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)的子集。

这个问题是项目的一部分,我为此搜索了很多内容,但却以这种方式找到了任何东西。我不熟悉算法和编程,如果我在这里写一些愚蠢的东西,我很抱歉。

你知道如何解决这个问题吗?

1 个答案:

答案 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);
    }
}