如何在n台机器上编写n个作业的排序算法?

时间:2016-10-06 15:24:10

标签: javascript arrays algorithm sorting

我只是想编写一个算法。在n台机器上排序n个作业。 例如: -

 job1->2s;
 job2->1s;
 job3->5s;

首先我们必须按时间(desc)对该工作进行排序

 job3->5s;
 job1->1s;
 job2->2s;

假设我们有2台机器

machine1->job3
machine2->job2

工作2将首先完成下一步应该是

machine1->job3 => 5s
machine2->job2+job1(2s+1s) => 3s

我希望那台机器完全正常工作1 这是5s它是最长的工作机器我想要答案。 如何为此编写算法... 到目前为止我所做的是按时间顺序排序对象...... 那么我不知道如何改进这个算法来处理n个具有n个作业的机器..

提前致谢

run.js

 var sorty = require('sorty');
    var njobs = [
        {
            jobname:"j1",
            time:42
        },
        {
            jobname:"j2",
            time:56
        },
        {
            jobname:"j3",
            time:78
        },
        {
            jobname:"j4",
            time:68
        },
        {
            jobname:"j5",
            time:43
        },
        {
            jobname:"j6",
            time:99
        },
        {
            jobname:"j7",
            time:88
        }
    ];
    var machines = 4;
    //sort desc with time
    var order = sorty([
        {name:'time',dir: 'desc',type:'number'}

    ],njobs);

    for(i=0;i<order.length;i++){
            console.log('job Name :'+order[i].jobname+' job Time to finish :'+order[i].time+' alloting machines to job');


    }

2 个答案:

答案 0 :(得分:0)

javascript中给出here答案的示例实现(在评论中由用户BeyelerStudios链接。

  • 按时间排序作业,从最高
  • 开始
  • 创建计算机列表
  • 对于每台计算机,存储其所有作业的总作业时间
  • 循环作业,将作业分配给最低总作业时间的机器

正如链接的答案所述:这绝不是为您提供完美,最佳的解决方案。此外,如果我们正在讨论成千上万的作业和机器,那么您需要针对性能进行优化...如果您正在处理问题中提供的数据集,则下面的示例实现可能对您有用。

sizeof

(注意:对于旧浏览器支持,您可能需要填充var njobs = [{ jobname: "j1", time: 42 }, { jobname: "j2", time: 56 }, { jobname: "j3", time: 78 }, { jobname: "j4", time: 68 }, { jobname: "j5", time: 43 }, { jobname: "j6", time: 99 }, { jobname: "j7", time: 88 }]; var sorted = njobs.sort((a, b) => b.time - a.time); var machines = Array(4).fill().map((m, i) => { return { id: i, value: 0, jobs: [] } }); sorted.forEach(job => { var minMachine = machines .slice(1) .reduce((res, cur) => res.value < cur.value ? res : cur, machines[0]); minMachine.jobs.push(job); minMachine.value += job.time; }); console.log(machines.map(m => "Machine " + m.id + ", time: " + m.value + ", jobs: " + m.jobs.map(j => j.jobname).join(", ")));

答案 1 :(得分:-1)

@ user3297291很棒的实现,但是你的技术只考虑(n)个工作数,而不是(m)个机器数。

这是另一种能够计算任何数量的作业(n)或机器(m)的实施方式,其中(n&amp; m&gt; 1)。它验证给定的数据集,不仅应用约翰逊的规则,而且还使用CDS算法深入挖掘并计算更复杂的替代品,尽可能少的完工时间。稍后您可以将整个时间线导出为ex​​cel或pdf格式以供进一步使用。

该工具完全免费使用https://job-sequencing.appspot.com 随意尝试!