具有较小权重和的较大子集("inverse" 加权间隔调度概率。)
Larger subset with smaller weight sum ("inverse" Weighted Interval Scheduling Prob.)
我想找到 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) 的子集。
这个问题是一个项目的一部分,我为此在谷歌上搜索了很多,但以这种方式找到了任何东西。我不熟悉算法和编程,如果我在这里写了一些愚蠢的东西,我很抱歉。
你知道如何解决这个问题吗?
蛮力法:找到所有可能的开始间隔和所有可能的最后间隔,并计算开始和结束间隔之间的所有可能序列。这等于计算有向无环图 (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);
}
}
我想找到 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) 的子集。
这个问题是一个项目的一部分,我为此在谷歌上搜索了很多,但以这种方式找到了任何东西。我不熟悉算法和编程,如果我在这里写了一些愚蠢的东西,我很抱歉。
你知道如何解决这个问题吗?
蛮力法:找到所有可能的开始间隔和所有可能的最后间隔,并计算开始和结束间隔之间的所有可能序列。这等于计算有向无环图 (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);
}
}