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

运筹学排序算法中的时间在线排序

在线排序中有个时间在线排序,求关于时间在线排序的在线LPT算法,其含义是在任何时刻当有机器出现空闲,就从当前已经就绪的还没有加工工件中选择加工时间最大的工件安排到这台机器上加工

  • 写回答

4条回答 默认 最新

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

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

    在运筹学中,时间在线排序(Online Scheduling)是一种处理任务调度的问题,其中任务的到达时间和持续时间是未知的,但必须实时做出决策。在线LPT(Longest Processing Time First)算法是一种用于解决这个问题的方法,它总是选择剩余工作时间最长的任务进行分配。

    以下是C++实现在线LPT算法的一个示例:

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <algorithm>
    
    struct Job {
        int id;
        int arrival_time;
        int processing_time;
    
        bool operator<(const Job& other) const {
            return processing_time > other.processing_time;
        }
    };
    
    void online_lpt(std::vector<Job>& jobs, std::vector<int>& machine_status) {
        std::priority_queue<Job> pq;
        
        for (int i = 0; i < jobs.size(); ++i) {
            // 如果所有机器都在工作,等待最早完成的机器
            while (!machine_status.empty() && machine_status.back() != -1) {
                machine_status.pop_back();
            }
    
            if (machine_status.empty()) {
                machine_status.push_back(jobs[i].id);
            } else {
                machine_status[machine_status.size() - 1] = jobs[i].id;
            }
    
            pq.push(jobs[i]);
        }
    
        while (!pq.empty()) {
            Job job = pq.top();
            pq.pop();
    
            // 假设每个任务完成后会立即释放机器
            machine_status[std::find(machine_status.begin(), machine_status.end(), job.id) - machine_status.begin()] = -1;
        }
    }
    
    int main() {
        std::vector<Job> jobs = {{1, 2, 5}, {2, 4, 3}, {3, 1, 7}};
        std::vector<int> machine_status;
    
        online_lpt(jobs, machine_status);
    
        std::cout << "Machine status: ";
        for (int status : machine_status) {
            std::cout << status << " ";
        }
        std::cout << std::endl;
    
        return 0;
    }
    

    在这个例子中,我们首先定义了一个结构体Job来存储任务的ID、到达时间和处理时间。然后我们实现了一个名为online_lpt的函数,它接收一个任务列表和一个表示机器状态的向量作为输入。机器状态向量中,正值表示正在工作的任务ID,-1表示空闲的机器。

    在主函数中,我们创建了一个任务列表和一个初始为空的机器状态向量,并调用online_lpt函数。运行这段代码后,你会看到机器的状态输出,反映出LPT策略是如何将任务分配给机器的。

    注意:这个简单的实现没有考虑任务的到达时间,而是假定所有任务同时到达。在实际应用中,你可能需要修改代码来处理不同到达时间的情况。此外,这个例子也没有考虑到多个机器并行处理任务的情况,如果你需要处理多台机器,可以为每个机器维护一个优先队列,并根据机器的可用情况来决定将任务分配给哪一台机器。

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

报告相同问题?

问题事件

  • 系统已结题 5月4日
  • 已采纳回答 4月26日
  • 创建了问题 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 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀