Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 变权加权区间调度_Algorithm_Scheduling_Intervals - Fatal编程技术网

Algorithm 变权加权区间调度

Algorithm 变权加权区间调度,algorithm,scheduling,intervals,Algorithm,Scheduling,Intervals,在传统的加权区间调度问题中,我们有一个加权区间的列表{i_1,…,i_n}。给出了一种求解加权区间调度问题的算法,它是一个基本的动态规划问题。但是,如果在计划中,选定间隔的权重取决于之前间隔的权重(反过来,权重取决于顺序),会发生什么情况?一个例子是w_j'=w_j'*(w_(j-1)“+1),其中素数变量是内在权重,而非素数权重是考虑顺序的“实际”权重,即实际用于目标函数的权重。这个问题是NP难的吗?听起来确实是这样 编辑:为了使这更容易(也更现实),让我们假设离散的单位时间。好的,我算出了。

在传统的加权区间调度问题中,我们有一个加权区间的列表
{i_1,…,i_n}
。给出了一种求解加权区间调度问题的算法,它是一个基本的动态规划问题。但是,如果在计划中,选定间隔的权重取决于之前间隔的权重(反过来,权重取决于顺序),会发生什么情况?一个例子是
w_j'=w_j'*(w_(j-1)“+1)
,其中素数变量是内在权重,而非素数权重是考虑顺序的“实际”权重,即实际用于目标函数的权重。这个问题是NP难的吗?听起来确实是这样


编辑:为了使这更容易(也更现实),让我们假设离散的单位时间。

好的,我算出了。算法是(如果我错了,请纠正我):

其中,集合
时间、间隔
是间隔和间隔本身的潜在时间点,
f
是目标函数


迭代之间的常数是:在一段时间的迭代
t
完成后,
best(t)
是以
t
结束的最佳计划。注意,由于初始化步骤,
best(t)=best(t-1)
是可能的。还要注意,正如在我的评论中一样,只有当
f
是单调递增的时,这才有效,因为
f
意味着基于它之前的间隔应用于每个单独的间隔。我在这里用它作为速记。

仔细看这个问题,我想知道为什么我们不能只使用DP,这样子问题是“到时间t我们能完成什么,到作业j结束”,而不仅仅是“到时间t我们能完成什么”@DennisMeng所以,你的建议是迭代开始/结束时间,如,查看所有具有结束时间
t
的作业,然后尝试将其纳入计划,使用以前的计算通知链的其余部分,然后转到
t+1
?如果“使用以前的计算通知链的其余部分”,您的意思是“使用以前的计算来计算我从一开始到现在所能做的最好的事情
t
”“那么我认为你的想法是对的。我的建议与原问题中所做的主要区别在于,当我们查看以前的计算时,我们不仅关心计算到什么时候,还关心上次计算中使用的作业。@DennisMeng OK,谢谢。最后一件事:如果我理解你所说的,你的建议是默认地假设计算重量所涉及的函数都在增加。例如,如果其中一个函数是
f(x)=1/(|x |+1)
,我们要给它提供前面间隔的权重之和,那么我们希望这些权重之和尽可能接近于零。这通常会破坏算法。嗯,我想这是真的。谢谢你清理了那部分。
for t in times:
    if is_first(t):
        best_candidate = None
    else:
        best_candidate = best(t - 1)

    for interval in intervals if interval.end_time is t:
        value_i = f(best(interval.start_time) + interval)
        value_candidate = f(best_candidate)
        if value_i > value_candidate:
            best_candidate = best(interval.start_time) + interval

    best(t) = best_candidate

return best(times[-1])