m0_58754940 2024-04-25 23:19 采纳率: 69.6%
浏览 0
已结题

问题关于在线排序的算法

运筹学的时间在线排序,其中的在线LPT算法,是在任何时刻当有机器出现空闲,就从当前已经就绪的还没有加工工件中选择加工时间最大的工件安排在这台机器上加工,工件按时间在线到达,即一个工件只有被释放之后才能知道它的一切信息,求这个的算法及每一步含义,举例说明

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-25 23:19
    关注

    引自免费微信小程序:皆我百晓生

    在线LPT(Longest Processing Time First)是一种解决单机或多机流水线调度问题的策略。在单机情况下,当机器空闲时,它会从已知的待处理任务列表中选择具有最长处理时间的任务进行加工。对于多机情况,可以采用贪心策略,即每次将新来的任务分配给当前空闲机器中处理时间最长的任务的机器。

    下面是一个简单的C++实现,用于单机的在线LPT算法:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    struct Job {
        int arrival_time;
        int processing_time;
    };
    
    bool compare(const Job& a, const Job& b) {
        return a.processing_time > b.processing_time;
    }
    
    void onlineLPT(std::vector<Job>& jobs) {
        std::sort(jobs.begin(), jobs.end(), compare);
    
        int current_time = 0;
        for (const auto& job : jobs) {
            // 模拟任务的到达
            while (current_time < job.arrival_time) {
                std::cout << "Machine idle until time: " << current_time << std::endl;
                current_time++;
            }
    
            // 开始处理任务
            std::cout << "Processing job " << job.id << " at time " << current_time << std::endl;
            current_time += job.processing_time;
        }
    }
    
    int main() {
        std::vector<Job> jobs = {
            {1, 5}, // 到达时间1,处理时间5
            {2, 3}, // 到达时间2,处理时间3
            {4, 7}  // 到达时间4,处理时间7
        };
    
        onlineLPT(jobs);
        return 0;
    }
    

    在这个例子中,我们首先定义了一个结构体Job,包含任务的到达时间和处理时间。然后我们创建了一个比较函数compare,用于根据处理时间对任务进行降序排列。

    在线LPT函数接受一个任务列表,并对其进行排序。接着,我们初始化当前时间为0,遍历每个任务。对于每个任务,我们在达到其到达时间之前让机器保持空闲状态。一旦到达了任务的到达时间,我们就开始处理该任务,并更新当前时间。

    例如,考虑上述的main函数中的任务列表。按照在线LPT算法,执行过程如下:

    1. 第一个任务(ID:1,到达时间:1,处理时间:5)到达,立即开始处理。

      Machine idle until time: 1
      Processing job 1 at time 1
      
    2. 当任务1正在处理时,第二个任务(ID:2,到达时间:2,处理时间:3)到达,因为机器正在处理任务1,所以等待。

    3. 完成任务1后,当前时间是6,此时第二个任务(ID:2,处理时间:3)开始处理。

      Processing job 1 finished at time 6
      Processing job 2 at time 6
      
    4. 完成任务2后,当前时间是9,这时第三个任务(ID:3,到达时间:4,处理时间:7)已经到达,开始处理。

      Processing job 2 finished at time 9
      Processing job 3 at time 9
      
    5. 最终完成所有任务,当前时间是16。

    注意:这个实现仅适用于单机环境。对于多机环境,你需要维护一个表示每个机器当前处理任务的队列,并且在每个时间单位检查哪些机器空闲,然后将新的任务分配给空闲机器中处理时间最长的那个任务的机器。这可以通过一个优先队列(最大堆)来实现,其中堆顶元素始终代表当前最空闲的机器上的任务。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月3日
  • 已采纳回答 4月25日
  • 创建了问题 4月25日

悬赏问题

  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询
  • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
  • ¥30 关于R语言运行分区生存模型中的问题!
  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀