2 3 4 5 6 7 8 9 10 11 12

最佳调度问题(回溯法)

一、实验内容
运用回溯法解决0-1背包问题(或装载问题、或批处理作业调度、或旅行售货员问题)
使用回溯法解决批处理作业调度问题

二、所用算法基本思想及复杂度分析
1.算法基本思想
从一条路往前走,能进则进,不能进则退回来,换一条路再试。确定了解空间的组织结构后,回溯法从根节点出发,以深度优先搜索方式搜索整个解空间。回溯法以这种工作方式递归地在解空间中搜索,直到找到所要求的解或解空间所有解都被遍历过为止。
2.问题分析及算法设计
问题分析:
(1)给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。
(2)对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。
(3)所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。
(4)批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。
算法设计:

  1. 算法复杂度分析
    由于回溯算法在每一个结点处耗费O(1)计算时间,故在最坏情况下,整个算法的时间复杂性为O(n!).

三、源程序核心代码及注释(截图)

四、运行结果

五、调试和运行程序过程中产生的问题及解决方法,实验总结(5行以上)
调试和运行程序时没有多大的问题,主要是调试的步骤多,容易看错,从而理解错,解决方法:我是为每一个变量都添加了监视,一个一个的调试下去,再结合自己画的草图,一个的去分析,当正确的分析出一个分支后,就会发现,后面基本上都是重复的实现着前面的基本操作。经过这次实验对于回溯法解问题时,首先应该明确问题的解空间,一般说来,解任何问题都有一个目标,在约束条件下使目标达到最优的可行解称为该问题的最优解。

#include<bits/stdc++.h>

using namespace std;

int n, k;
int a[25];//任务完成的时间
int x[25];//当前任务完成的时间
int result = 410;//完成全部任务的最早时间

void  Backtrack(int num, int t)
{
	if (num > n)//到达叶子节点
	{
		if (t < result)
		{//将最少时间赋值给result
			result = t;
		}
	}
	if (t >= result)
	{//当大于时,直接跳出递归
		return;
	}

	for (int i = 0; i < k; i++)
	{
		if (x[i] + a[num] < result)
		{//看是否剪枝
		//当前任务完成时间+前面任务完成时间小于总时间时
			x[i] += a[num];//继续搜索下去
			Backtrack(num + 1, max(t, x[i]));//回溯
			x[i] -= a[num];//返回最初的状态
		}
	}
}

int main()
{
	cin >> n >> k;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	Backtrack(0, 0);
	cout << result << endl;
	return 0;
}

posted @   MrDevil  阅读(1264)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示