作业调度-johnson算法

本文介绍了一个基于C++的任务调度算法实现。该算法通过定义结构体和比较函数来组织任务,并利用标准模板库中的sort函数进行任务排序。最终,程序输出最优的任务执行顺序及总完成时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <algorithm>
using namespace std;

#define M 100

struct aaa
{
	int n1t, n2t;
	int num;
}a[M];

int n1et[M], n2et[M];  //当前机器在n1 n2的结束时间

bool cmp(aaa a, aaa b)
{
	if (a.n1t < a.n2t&&b.n1t < b.n2t) return a.n1t < b.n1t; 
	else return a.n2t > b.n2t;
}

int main()
{
	int n;
	while (cout<<"作业数:",cin >> n)
	{
		cout << "在n1,n2作业时间:";
		for (int i = 1; i <=n; i++)
		{
			cin >> a[i].n1t >> a[i].n2t;
			a[i].num = i ;
		}
		sort(a+1, a + n+1, cmp);
		for (int i = 1; i <= n; i++)
		{
			n1et[i] = n1et[i - 1] + a[i].n1t;
			int m = max(n1et[i], n2et[i - 1]);
			n2et[i] = m + a[i].n2t;
		}
		cout << "作业顺序:" ;
		for (int i = 1; i <= n; i++) cout << a[i].num << " ";
		cout << endl;
		cout << "完成作业时间和:";
		for (int i = 1; i <= n; i++) n2et[i] += n2et[i - 1];
		cout << n2et[n] << endl;
	}
}


Johnson算法是一种用于流水作业调度的优化算法,特别适用于两台机器的流水作业调度问题。其主要目标是最小化总的完成时间。Johnson算法通过以下步骤来实现优化: 1. **确定任务序列**:将所有任务按照一定的规则排序,以便最小化总的完成时间。 2. **应用Johnson规则**:对于每个任务,计算其在两台机器上的处理时间,并根据这些时间确定任务的执行顺序。 以下是Johnson算法的具体步骤: 1. **初始化**:假设有n个任务,每个任务在机器A和机器B上的处理时间分别为a[i]和b[i]。 2. **找到最小处理时间**: - 在所有任务中,找到在机器A或机器B上处理时间最小的任务。 - 如果最小时间在机器A上,将该任务放在序列的最前面。 - 如果最小时间在机器B上,将该任务放在序列的最后面。 3. **更新任务列表**:将已安排的任务从任务列表中移除。 4. **重复步骤2和3**,直到所有任务都被安排。 5. **生成最终序列**:按照上述规则生成的序列即为最优的任务执行顺序。 ### 示例 假设有四个任务,任务在机器A和机器B上的处理时间如下: | 任务 | 机器A | 机器B | |------|-------|-------| | 1 | 3 | 2 | | 2 | 2 | 5 | | 3 | 1 | 4 | | 4 | 4 | 3 | 应用Johnson算法: 1. 找到最小处理时间:任务3在机器A上的处理时间为1,放到最前面。 2. 更新任务列表:任务3已安排,剩余任务为1, 2, 4。 3. 找到最小处理时间:任务2在机器A上的处理时间为2,放到最前面。 4. 更新任务列表:任务2已安排,剩余任务为1, 4。 5. 找到最小处理时间:任务1在机器B上的处理时间为2,放到最后面。 6. 更新任务列表:任务1已安排,剩余任务为4。 7. 任务4放在最后。 最终任务顺序为:3, 2, 4, 1。 ### Python实现 ```python def johnson_algorithm(tasks): n = len(tasks) sequence = [] a = [task[0] for task in tasks] b = [task[1] for task in tasks] while len(sequence) < n: min_time = min(a + b) if min_time in a: i = a.index(min_time) sequence.insert(0, tasks[i]) a[i] = b[i] = float('inf') else: i = b.index(min_time) sequence.append(tasks[i]) a[i] = b[i] = float('inf') return sequence tasks = [(3, 2), (2, 5), (1, 4), (4, 3)] optimal_sequence = johnson_algorithm(tasks) print("Optimal sequence:", [task for task, _ in optimal_sequence]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值