【回溯与分支限界法】最优调度问题

简介: 【回溯与分支限界法】最优调度问题

 一、问题如下:

问题描述:

       假设有 n 个任务由 k 个可并行工作的机器来完成。完成任务 i 需要时间为ti ,设计完成这 n 个任务的最佳调度算法,使得完成全部任务的时间最早。

编程任务:

       对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1,2,…,n。编程计算完成这n个任务的最佳调度。

输入样例:

       (第一行为任务数n,第二行为可并行工作的机器数k,第三行为机器完成任务i所需的单位时间)

10

7

67 45 80 32 59 95 37 46 28 20

输出样例:(第一行是完成所有任务的最优化时间)

95

二、回溯剪枝关键步骤

剪枝关键步骤一/代码中第15行:

              if(y>MaxNum) return;        //大于最大时间上限,放弃此调度安排;

剪枝关键步骤二/代码第21段:

               if(time[x]+MachineTime[i]<=MaxNum)        仍然是放弃大于MaxNum的调度安排。

三、代码如下:

#include <iostream>
#include <algorithm>//max()函数头文件 
using namespace std;
#define N 1000
//求最优化问题,即最小调度 
int MaxNum=100000;
int n;//任务数 
int k;//机器数 
int time[N];//存放任务时间 
int MachineTime[N]={0};//存放机器的运行时间 
void DFS(int x,int y){//x为已放入机器的任务数,y为目前耗费的最大时间 
  if(y>MaxNum) return;//大于最大时间上限,放弃此调度安排;(剪枝关键步骤1)
  if(x==n){//n个任务皆放入机器执行完毕 
    if(y<MaxNum) MaxNum=y; //(更新需要的最大调度时间MaxNum)
    return; 
  } 
  for(int i=1;i<=k;i++){//对k台机器遍历 
    if(time[x]+MachineTime[i]<=MaxNum){//(剪枝关键步骤二)
      MachineTime[i]=MachineTime[i]+time[x];//把任务x放入机器i执行 
      DFS(x+1,max(y,MachineTime[i]));//递归调用
      MachineTime[i]=MachineTime[i]-time[x];//回溯
    }
  }
  return;
}
int main(){
  cin>>n>>k; 
  for(int i=0;i<n;i++){//输入任务时间 
    cin>>time[i];
  }
  DFS(0,0);//调用 
  cout<<MaxNum<<endl;//输出 
  return 0;
}

image.gif


目录
相关文章
|
小程序
微信小程序项目实例——狼人杀
微信小程序项目实例——狼人杀
|
SQL 运维 分布式计算
Dataphin离线数据开发规范
目前,用户在Dataphin上进行数据开发时,风格各异,缺乏一致性。为此,我们整理了一份开发规范文档,旨在帮助所有用户实现更高效和一致的开发流程。
586 4
|
8月前
|
传感器 人工智能 边缘计算
当无人机遇上5G:远程控制再也不卡了
当无人机遇上5G:远程控制再也不卡了
351 8
|
Unix Linux 虚拟化
VMware Workstation 17.6.2 发布下载,现在完全免费无论个人还是商业用途
VMware Workstation 17.6.2 发布下载,现在完全免费无论个人还是商业用途
55261 16
VMware Workstation 17.6.2 发布下载,现在完全免费无论个人还是商业用途
|
存储 NoSQL 关系型数据库
【赵渝强老师】MongoDB的存储结构
MongoDB 是一个可移植的 NoSQL 数据库,支持跨平台运行。其逻辑存储结构包括数据库、集合和文档,而物理存储结构则由命名空间文件、数据文件和日志文件组成。视频讲解和示意图进一步解释了这些概念。
504 5
|
机器学习/深度学习 人工智能 监控
智能建筑管理系统:建筑能效的优化
【10月更文挑战第23天】智能建筑管理系统(IBMS)通过集成信息技术、自动化和通信技术,实现对建筑内设施的综合监控与管理,优化能效,提升舒适性和安全性。本文介绍IBMS的功能特点、应用成效及未来发展趋势,展示其在建筑能效优化中的重要作用。
|
Web App开发 JavaScript 前端开发
nvm 安装、卸载与使用(详细步骤)
nvm 安装、卸载与使用(详细步骤)
5677 0
|
API 开发者
淘宝官方商品、交易、订单、物流、插旗接口接入说明
这些接口涉及淘宝店铺订单管理的关键方面,包括订单列表、订单详情及订单物流信息的获取。订单列表接口(如`taobao.trades.sold.get`和`taobao.topats.trades.sold.get`)帮助商家快速了解订单概览,进行基本管理和统计。订单详情接口(如`taobao.trade.fullinfo.get`和`taobao.topats.trades.fullinfo.get`)提供单个订单的全面信息,便于发货准备和服务支持。订单物流接口则允许跟踪订单的物流状态,确保配送顺畅。使用这些接口需遵循淘宝开放平台的规定,并关注API调用限制与更新。
1044 0