Algorithm 任务调度中的NP完全性

Algorithm 任务调度中的NP完全性,algorithm,job-scheduling,np-complete,np,operations-research,Algorithm,Job Scheduling,Np Complete,Np,Operations Research,这是一个发人深省的问题,我的教授提出了NP完全性的概念。我知道为什么会有一个解决方案,因为NP完全性的规则,但我不知道如何找到它。问题是: 该问题是一个具有两个处理器的简单任务调度问题。每个处理器可以处理n任务中的一个,并且任何两个任务都可以同时完成。每个任务都有一个结束时间e,必须在此时间之前完成。每个任务也有一个持续时间d。所有时间值,例如结束时间、持续时间和系统中的当前时间(时间将从0开始),都是整数。因此,我们得到了一个n任务列表,我们需要使用这两个处理器来调度所有任务。如果任何一个不能

这是一个发人深省的问题,我的教授提出了NP完全性的概念。我知道为什么会有一个解决方案,因为NP完全性的规则,但我不知道如何找到它。问题是:

该问题是一个具有两个处理器的简单任务调度问题。每个处理器可以处理
n
任务中的一个,并且任何两个任务都可以同时完成。每个任务都有一个结束时间
e
,必须在此时间之前完成。每个任务也有一个持续时间
d
。所有时间值,例如结束时间、持续时间和系统中的当前时间(时间将从0开始),都是整数。因此,我们得到了一个
n
任务列表,我们需要使用这两个处理器来调度所有任务。如果任何一个不能被调度,该算法必须不返回任何解。请记住,顺序并不重要,哪个处理器获得哪个任务也不重要,只要不存在重叠且每个任务在截止日期前完成即可

这就是问题的概念/抽象之处,比如说我们可以访问一个特殊的小函数,我们不知道它是如何工作的,我们所知道的是:给定一个
n
任务列表和当前日程安排,它将返回
true
false
,这取决于算法从这一点上是否可解。此函数假定已计划的任务是固定的,它只会更改未计划任务的时间。但是,此函数只返回true或false,如果它确实找到了解决方案,则不会为您提供正确的时间表。关键是,您可以在调度问题的实现中使用特殊函数。其目标是解决调度问题,并使用多项式次数的特殊函数调用,在每个作业都已正确调度的情况下返回工作调度

编辑:澄清一下,问题是:创建一个解决方案来调度所有
n
任务,而不超过截止日期,使用多项式数量的“特殊函数”调用

我认为这个问题是为了证明一个解是多项式的,但找到它是非多项式的。但我的教授坚持认为,有一种方法可以通过对特殊函数调用多项式次数来解决这个问题。由于问题作为一个整体是NP完全的,这将证明运行时的非多项式方面在算法的“决策”部分出现


如果您想让我澄清任何问题,请留下评论,我知道这不是问题的完美解释。

如果oracle
M
仅返回
true
false

输入: 任务-任务列表 输出: 计划:每个任务的三元组(任务、处理器、开始) 算法:

While there is some unscheduled task:
   let p be the processor that currently finished up his scheduled tasks first
   let x be the first available time on x
   for each unscheduled task t:
      assign t with the triplet: (t,p,x)
      run M on current tasks
      if M answers true:
            break the for loop, continue to next iteration of while loop
      else:
            unassign t, and continue to next iteration of for loop
    if no triplet was assigned, return NO_SOLUTION
return all assigned triplets
  • 上述函数以多项式时间运行-它需要
    O(N^2)
    调用
    M
  • 上述算法的正确性可以通过归纳来证明,其中归纳假设在while循环的轮
    k
    之后,如果在它之前有一个解,那么在它之后仍然有一个解(以及在分配某个任务之后)在证明了这一观点之后,对于
    k=#任务
正式证明上述主张:

  • 对于k=0,归纳的基础是平凡的
  • 假设:对于任何k
  • 证明:

假设有一个解
{(tj,pj,xj)| j=1,…,n}
,由
j订购问题到底是什么?为什么不设置运筹学标签?如果这是一个工厂中的两个处理器或两个生产点,这并不重要。这是一个典型的运筹学问题。@BitTickler我不知道你所说的运筹学研究是什么意思?问题是:创建一个解决方案来安排所有的时间
n
使用多项式次数的“特殊函数”调用,在不超过截止日期的情况下执行任务。“也许如果你少打扰你的教授,他会抽出时间给你一个适当的话题范围;”具体地说:。。。也许我应该成为一名教授。。陛下不,这样我就不得不和别人交谈,而没有那么多时间来实际编程:)从一个空的时间表开始。对于每个任务t,在尽可能早的时间将其临时放入P1的计划中,并调用oracle。如果您得到一个“否”,则暂时将t移动到P2时间表中最早的可用插槽,然后再次呼叫oracle。以这种方式完成任务,直到得到“是”。此时,永久分配t。这需要对oracle进行最多n次调用。重复此操作,直到分配了所有n个处理器,最多需要对oracle进行n^2次调用。顺便说一句,这与证明问题在于NP基因无关,但你不需要每次调整一个单位的时间吗?所有时间值的循环都是伪多项式。不是多项式。