算法 Hw9

Hw 9

  • 1 Scheduling with profits and deadlines
    • 1
    • 2
    • 3
    • 4
    • 5
  • 2 Parallel machine
    • 1
    • 2
    • 3
    • 4

1 Scheduling with profits and deadlines

1

决策问题表述:

给定一个利润值 P P P,是否存在一个任务调度方案使得完成所有任务的总利润至少为 P P P


2

在 NP 类中:
给定一个任务调度方案,可以在多项式时间内验证该方案的总利润是否至少为 P P P。验证过程包括检查每个任务是否在截止日期前完成,并计算总利润。因此,该问题在 NP 类中。

对于 NP 完全性:
- 给定一个 0/1 背包问题实例,其中有 n n n 个物品,每个物品有一个重量 w i w_i wi 和价值 v i v_i vi,以及一个总重量限制 W W W

  • 对应于调度问题中的每个任务 a j a_j aj,设置其处理时间 t j = w i t_j = w_i tj=wi,利润 p j = v i p_j = v_i pj=vi,并设置截止日期 d j = W d_j = W dj=W,保证任务必须在总时间 W W W 内完成。
  • 利润值 P P P 设为背包问题中的价值总和的要求。

通过归约,若能在调度问题中找到一个利润至少为 P P P 的方案,则在 0/1 背包问题中可以找到一个总价值至少为 P P P 且总重量不超过 W W W 的物品选择方案。因此,调度问题的决策版本是 NP 完全的。


3

  • 状态定义:设 d p [ t ] [ k ] dp[t][k] dp[t][k] 表示在总时间 t t t 内,选择前 k k k 个任务能获得的最大利润。

  • 状态转移方程:
    对于每个任务 a j a_j aj,有两种选择:

    • 不选择任务 a j a_j aj d p [ t ] [ k ] = d p [ t ] [ k − 1 ] dp[t][k] = dp[t][k-1] dp[t][k]=dp[t][k1]
    • 选择任务 a j a_j aj(前提是 t ≥ t j t \geq t_j ttj t ≤ d j t \leq d_j tdj): d p [ t ] [ k ] = max ⁡ ( d p [ t ] [ k − 1 ] , d p [ t − t j ] [ k − 1 ] + p j ) dp[t][k] = \max(dp[t][k-1], dp[t-t_j][k-1] + p_j) dp[t][k]=max(dp[t][k1],dp[ttj][k1]+pj)
  • 初始状态:

    • d p [ 0 ] [ 0 ] = 0 dp[0][0] = 0 dp[0][0]=0,表示没有时间且没有任务时的利润为 0。
  • 算法步骤:

    • 初始化 d p dp dp 数组为 0。
    • 遍历所有任务,根据上述状态转移方程更新 d p dp dp 数组。
    • 最终检查 d p [ T ] [ n ] dp[T][n] dp[T][n] 是否大于等于 P P P,其中 T T T 是计算机的总时间。

4

  • 状态定义:设 d p [ t ] dp[t] dp[t] 表示在总时间 t t t 内能获得的最大利润。

  • 状态转移方程:
    对于每个任务 a j a_j aj,有两种选择:

    • 不选择任务 a j a_j aj d p [ t ] = d p [ t ] dp[t] = dp[t] dp[t]=dp[t]
    • 选择任务 a j a_j aj(前提是 t ≥ t j t \geq t_j ttj t ≤ d j t \leq d_j tdj): d p [ t ] = max ⁡ ( d p [ t ] , d p [ t − t j ] + p j ) dp[t] = \max(dp[t], dp[t-t_j] + p_j) dp[t]=max(dp[t],dp[ttj]+pj)
  • 初始状态:

    • d p [ 0 ] = 0 dp[0] = 0 dp[0]=0,表示没有时间时的利润为 0。
  • 算法步骤:

    • 初始化 d p dp dp 数组为 0。
    • 遍历所有任务,根据上述状态转移方程更新 d p dp dp 数组。
    • 最终 d p [ T ] dp[T] dp[T] 即为最大利润,其中 T T T 是计算机的总时间。

5

由于上述动态规划算法是一个精确算法(在多项式时间内找到最优解),因此它的近似比为 1,即它能够找到最优解。


2 Parallel machine

1

考虑所有工作中处理时间最长的工作 J k J_k Jk,其处理时间为 p k = max ⁡ { p j : 1 ≤ j ≤ n } p_k = \max\{p_j : 1 \leq j \leq n\} pk=max{pj:1jn}

由于该工作必须在某台机器上连续运行 p k p_k pk 时间单位,且在此期间不能有其他工作在同一台机器上运行,因此该工作的完工时间至少为 p k p_k pk

因此,最优完工时间 C max ∗ C^*_{\text{max}} Cmax 必须至少为 p k p_k pk,即 C max ∗ ≥ max ⁡ { p k : 1 ≤ k ≤ n } C^*_{\text{max}} \geq \max\{p_k : 1 \leq k \leq n\} Cmaxmax{pk:1kn}


2

设所有工作的总处理时间为 P = ∑ k = 1 n p k P = \sum_{k=1}^{n} p_k P=k=1npk

对于最优调度,每台机器在总时间 C max ∗ C^*_{\text{max}} Cmax 内处理一部分工作。

由于共有 m m m 台机器,总的工作负载 P P P 必须分配给这 m m m 台机器。因此,平均每台机器的负载为 P m \frac{P}{m} mP

在最优调度中,任意机器的完工时间不能少于其分配到的工作负载时间,即最优完工时间 C max ∗ C^*_{\text{max}} Cmax 不能小于平均机器负载 P m \frac{P}{m} mP,即 C max ∗ ≥ 1 m ∑ k = 1 n p k C^*_{\text{max}} \geq \frac{1}{m} \sum_{k=1}^{n} p_k Cmaxm1k=1npk


3

def GreedyParallelScheduling(jobs, m):# jobs 是一个由元组 (p_k, job_id) 组成的作业列表# m 是机器的数量# 初始化了一个大小为m的空列表schedules,# 用于记录每台机器分配的作业schedules = [[] for _ in range(m)]# 初始化了一个大小为m的数组machine_completion_times,# 用于记录每台机器的完工时间,初始值为0machine_completion_times = [0] * m# 对作业列表按照处理时间的非递增顺序进行排序jobs.sort(reverse=True, key=lambda x: x[0])# 对每个已排序的作业进行调度for (p_k, job_id) in jobs:# 找到完工时间最小的机器 Mimin_machine = machine_completion_times.index(min(machine_completion_times))# 将作业分配给机器 Mischedules[min_machine].append(job_id)# 更新机器 Mi 的完工时间,增加该作业的处理时间machine_completion_times[min_machine] += p_kreturn schedules

运行时间:

  • 初始化和读取输入需要 O ( n ) O(n) O(n) 时间。
  • 对作业按处理时间排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 时间。
  • 遍历每个作业并找到具有最小结束时间的机器需要 O ( n log ⁡ m ) O(n \log m) O(nlogm) 时间,因为可以使用最小堆来跟踪机器的结束时间。

总体运行时间为 O ( n log ⁡ n + n log ⁡ m ) = O ( n log ⁡ n ) O(n \log n + n \log m) = O(n \log n) O(nlogn+nlogm)=O(nlogn),因为通常情况下 n ≥ m n \geq m nm


4

设所有工作的总处理时间为 P = ∑ k = 1 n p k P = \sum_{k=1}^{n} p_k P=k=1npk,处理时间最长的工作为 p max = max ⁡ { p k : 1 ≤ k ≤ n } p_{\text{max}} = \max\{p_k : 1 \leq k \leq n\} pmax=max{pk:1kn}

在贪心算法中,任何时刻将未分配的工作分配给当前空闲时间最少的机器,这种策略确保每台机器的负载是尽可能均衡的。

假设最坏情况下某台机器上的负载时间为 L L L,即 L ≤ P m + p max L \leq \frac{P}{m} + p_{\text{max}} LmP+pmax
其中, P m \frac{P}{m} mP 是平均每台机器分配到的负载时间, p m a x p_{max} pmax 是任何单个工作可能增加的最大负载时间。

因此,贪心算法的完工时间 C m a x C_{max} Cmax 满足
C max ≤ 1 m ∑ k = 1 n p k + max ⁡ { p k : 1 ≤ k ≤ n } C_{\text{max}} \leq \frac{1}{m} \sum_{k=1}^{n} p_k + \max\{p_k : 1 \leq k \leq n\} Cmaxm1k=1npk+max{pk:1kn}

由于最优完工时间 C m a x ∗ C^*_{max} Cmax 至少为这两个量中的最大值,即:
C m a x ∗ ≥ max ⁡ ( 1 m ∑ k = 1 n p k , max ⁡ { p k : 1 ≤ k ≤ n } ) C^*_{max} \geq \max \left(\frac{1}{m} \sum_{k=1}^{n} p_k, \max\{p_k : 1 \leq k \leq n\}\right) Cmaxmax(m1k=1npk,max{pk:1kn})

结合以上两个不等式,可得
C m a x ≤ 2 C m a x ∗ C_{max} \leq 2C^*_{max} Cmax2Cmax

因此,贪心算法是一个多项式时间的 2-近似算法。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32学习-软件I2C读取MPU6050

接线 SDAPB11SCLPB10 I2C 对操作端口的库函数进行封装 void MyI2C_W_SCL(uint8_t BitValue)//写 {GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)BitValue);Delay_us(10); }void MyI2C_W_SDA(uint8_t BitValue)//写 {GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)BitValu…

Redis 7.x 系列【4】命令手册

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 说明2. 命令手册2.1 Generic2.2 数据类型2.2.1 String2.2.2 Hash2.2.3 List2.2.4 S…

docker入门——镜像命令、容器命令及其他常用命令

镜像命令 dockers images [-a | -q] 查看镜像 -a: 显示所有细腻些 -q: 只显示镜像ID docker search [–filter]搜索命令 –filter字段值 docker pull 镜像名[:tag] 下载镜像不加tag默认下载最新镜像 docker rmi [options] 删除镜像 ​ -f 容器ID [,容器ID,容…

如何在纯内网环境下,将EasyCVR视频汇聚网关通过4G与第三方公网云平台级联?

EasyCVR视频汇聚网关是TSINGSEE青犀软硬一体的一款产品,可提供多协议的接入、音视频采集、处理,能实现海量前端设备的轻量化接入/转码/分发、视频直播、云端录像、云存储、检索回看、智能告警、平台级联等,兼容多种操作系统,轻松扩…

HTTP/2 协议学习

HTTP/2 协议介绍 ​ HTTP/2 (原名HTTP/2.0)即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。…

速盾:海外网站cdn加速免费

随着互联网的快速发展和全球化的趋势,海外网站的重要性也日益增加。然而,由于地理位置等各种因素的限制,海外访问海外网站的速度往往较慢,给用户的体验带来了不便。为了解决这个问题,许多网站开始采用CDN加速技术。 C…

HTML 实体字符简介

在网页设计与开发中,HTML 实体字符扮演着重要的角色,它们帮助我们在HTML文档中安全地插入特殊字符,避免浏览器解析时产生错误或意外的布局效果。实体字符通过特定的编码方式来表示,使得浏览器能够正确识别并展示这些特殊字符。下面…

在云服务器上安装配置和调优Zerotier服务器的详细教程

Hey,朋友们!今天我要在服务器上部署和调优Zerotier服务器。使用三丰云提供的免费服务器,配置为1核CPU、1G内存、10G硬盘和5M带宽。虽然配置不高,但三丰云的免费云服务器已经足够应付我们今天的项目。👍 Zerotier服务器…

阻塞锁和自旋锁的理解

阻塞锁和自旋锁的理解 文章目录 阻塞锁和自旋锁的理解阻塞锁自旋锁阻塞锁自旋锁各自的优缺点自旋锁阻塞锁 选择自旋锁还是阻塞锁 想象你和你的朋友们一起玩一个游戏,但是每次只能一个人玩。为了决定谁先玩,你们可以用两种方法来排队: 阻塞锁…

小程序-生命周期(2) 应用周期/页面周期

一.应用周期 应用周期指的是小程序:启动->运行->销毁的整个过程。 应用周期伴随一些函数来进行控制,这些函数卸载app.js里面的App方法里。 分别由onLaunch, onShow,onHide依次进行。 onLaunch:初始化的时候运行…

第3讲:关于Pixi的Text、Container、Sprite、Graphics组件功能作用

首先这里提供一个公用代码: 下部分各种组件基于这个公用代码直接往下添加代码即可。 import {Application, Text, Container, Sprite, BaseTexture, Texture, Graphics} from pixi.js import ./style.css import testImageUrl from ./images/test.jpg // 指明Appli…

3.1、前端异步编程(超详细手写实现Promise;实现all、race、allSettled、any;async/await的使用)

前端异步编程规范 Promise介绍手写Promise(resolve,reject)手写Promise(then)Promise相关 API实现allraceallSettledany async/await和Promise的关系async/await的使用 Promise介绍 Promise是一个类,可以翻…

HTML静态网页成品作业(HTML+CSS)—— 家乡成都介绍网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

【玩转google云】实战:如何在GKE上使用Helm安装和配置3节点的RabbitMQ集群

需求 因项目需要需要在Google Kubernetes Engine (GKE) 中使用Helm安装一个3节点的RabbitMQ集群,配置用户名和密码,开通公网访问的Web管理界面,指定namespace为mq,并使用5G的硬盘存储MQ的数据。 前提条件 GKE集群:确保你有一个运行中的GKE集群。Helm工具:确保已安装Hel…

Qt 插件框架

在Qt框架中实现插件系统主要涉及到使用Qt的插件机制来动态加载和卸载插件模块。 1、定义插件接口 首先,你需要定义一个或多个接口类,这些类将作为插件和主程序之间的契约。这些接口类通常包含纯虚函数,插件需要实现这些函数。 // MyPlug…

C语言 | Leetcode C语言题解之第164题最大间距

题目&#xff1a; 题解&#xff1a; int maximumGap(int* nums, int numsSize) {if (numsSize < 2) {return 0;}int maxVal INT_MIN, minVal INT_MAX;for (int i 0; i < numsSize; i) {maxVal fmax(maxVal, nums[i]);minVal fmin(minVal, nums[i]);}int d fmax(1,…

计算机网络:3数据链路层

数据链路层 概述封装成帧和透明传输帧透明传输&#xff08;填充字节或比特&#xff09;差错检测奇偶校验循环冗余校验CRC Cyclic Redundancy Check 可靠传输停止-等待协议回退n帧协议&#xff08;滑动窗口协议&#xff09;选择重传协议 点对点协议PPP共享式以太网网络适配器&am…

ubuntu版本升级命令记录

小版本升级(如22.04.3到22.04.4) 具体的版本控制并不常用于小版本升级&#xff0c;因为这些版本升级通常涵盖了安全补丁和错误修复。确保 /etc/apt/sources.list 中的软件源是正确的&#xff0c;并定期运行升级命令&#xff0c;系统将自动升级到最新的小版本。 # 检查当前版本…

java本地缓存(map,Guava,echcache,caffeine)优缺点,以及适用场景

前言 在高并发系统环境下&#xff0c;jvm本地缓存扮演着至关重要的角色&#xff0c;合理的应用能够使系统响应迅速&#xff0c;提高用户体验感&#xff0c;而分布式缓存redis则存在着网络io&#xff0c;以及流量消耗问题&#xff0c;需要和本地缓存搭配使用&#xff0c;才能使…

机器学习算法 —— K近邻(KNN分类)

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 目录 KNN的介绍和应用KNN的介绍1) KNN建立过程2) 类别的判定KNN的优点KNN的缺点KNN的应用实战KNN分类数据集 —— KNN分类库函数导入数据导入模型训练&可视化原理简析莺尾花数据集 —— KNN分…