批处理调度C语言

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
int *x;
int **M;
int *best;
int *f2;
int f1;
int f;
int bestf;
int n;

void init() {
	f = 0;
	f1 = 0;
	bestf = INT_MAX;
	printf("请输入作业数");
	scanf("%d", &n);
	x = (int*)malloc(sizeof(int) * (n + 1));
	best = (int*)malloc(sizeof(int) * (n + 1));
	f2 = (int*)malloc(sizeof(int) * (n + 1));
	M = (int**)malloc(sizeof(int*) * (n + 1));
	for (int i = 1; i <= n; ++i) {
		M[i] = (int*)malloc(sizeof(int) * 3);
	}
	for (int i = 1; i <= n; ++i) {
		printf("请输入%d个作业机器一处理的时间", i);
		scanf("%d", &M[i][1]);
		printf("请输入%d个作业机器二处理的时间", i);
		scanf("%d", &M[i][2]); 
	}
	for (int i = 1; i <= n; ++i) {
		x[i] = i;
	}
	f2[0] = 0;
} 

void backtrack(int i) {
	if (i > n) {
		bestf = f;
		memcpy(best + 1, x + 1, sizeof(int) * n);
		return; 
	}
	for (int j = i; j <= n; ++j) {
		f1 += M[x[j]][1];
		f2[i] = (f2[i - 1] > f1 ? f2[i - 1] : f1) + M[x[j]][2];
		f += f2[i];
		if (f < bestf) {
			int temp;
			temp = x[i];
			x[i] = x[j];
			x[j] = temp;
			backtrack(i + 1);
			temp = x[i];
			x[i] = x[j];
			x[j] = temp;
		}
		f1 -= M[x[j]][1];
		f -= f2[i];
	}
}

void show() {
	printf("调度顺序为"); 
	for (int i = 1; i <= n; ++i) {
		printf("%d ", best[i]);
	}
	printf("\n最小时间为%d", bestf);
}

int main() {
	init();
	backtrack(1);
	show();
	return 0;
}

在这里插入图片描述

分支限界法(Branch and Bound)是一种用于求解离散优化问题的算法,它在整数规划和搜索问题中特别有效,包括某些类型的作业调度问题。在作业调度中,假设每个作业有一个开始时间和结束时间,目标可能是找到一种最优的作业安排,使得完成所有作业的时间最短或者满足特定的资源约束。 对于批处理作业调度问题,其中涉及到多个任务或作业,每个任务有一个执行时间和优先级。分支限界法可以应用于以下场景: 1. **任务排序**:决定哪些任务应该首先执行,然后根据剩余的任务调整策略,比如采用最早开始时间(EDF, Earliest Deadline First)或最迟结束时间(LDF, Latest Finish Time)策略。 2. **资源分配**:如果有共享资源,如何分配这些资源以最大化效率或最小化截止日期违反。 3. **动态规划**:通过构建决策树,将问题分解为子问题,并利用上一阶段的结果来指导当前阶段的选择。 分支限界法的工作流程大致如下: - **节点生成**:从初始状态开始,生成所有可能的子状态(即可能的作业执行顺序)。 - **剪枝**:评估每个节点的上界(upper bound)或下界(lower bound),如果当前节点的目标值肯定超过最优解,就直接舍弃。 - **分支**:选择具有最大潜力提升的子节点进行深入。 - **回溯**:当达到某个节点没有更好的解决方案时,回溯到父节点并尝试其他分支。 - **递归终止条件**:当找到满足目标条件的解或者搜索树被完全探索后,算法停止。 **相关问题--:** 1. 作业调度问题中的具体优化目标是什么? 2. 在批处理作业调度中,如何定义节点的剪枝条件? 3. 分支限界法如何处理优先级变化或资源限制对任务顺序的影响?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值