我只是想编写一个算法。在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');
}
答案 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算法深入挖掘并计算更复杂的替代品,尽可能少的完工时间。稍后您可以将整个时间线导出为excel或pdf格式以供进一步使用。
该工具完全免费使用https://job-sequencing.appspot.com 随意尝试!