作业车间调度问题:P还是NP

在这里插入图片描述

获取更多资讯,赶快关注上面的公众号吧!

文章目录

  • 基本概念
    • 多项式时间
    • 指数时间
  • P问题(多项式问题)
  • NP问题(非确定性多项式问题)
    • 暴力穷举法
    • 动态规划
  • P与NP关系:
  • 作业车间调度问题是典型的NP难问题

P和NP问题是计算机科学中的两个重要的问题,涉及到计算问题的复杂性和可解性。这两个问题都与算法的效率和时间复杂度有关。

基本概念

多项式时间

多项式时间指的是算法的运行时间与问题规模之间存在多项式关系。更具体地说,如果一个算法的运行时间可以表示为问题规模的某个多项式函数,那么这个算法在多项式时间内运行。通常用 O ( n k ) O(n^k) O(nk)来表示多项式时间,其中n是问题的输入规模(通常表示为输入的大小),k是一个常数。

例子:

  • O ( n ) O(n) O(n)表示线性时间,算法的运行时间与输入规模成线性关系。
  • O ( n 2 ) O(n^2) O(n2)表示平方时间,算法的运行时间与输入规模的平方成正比。
  • O ( n 3 ) O(n^3) O(n3)表示立方时间,算法的运行时间与输入规模的立方成正比。

多项式时间算法通常被认为是高效的,因为它们在处理大规模问题时的运行时间增长相对较慢

指数时间

指数时间指的是算法的运行时间与问题规模之间存在指数关系。如果一个算法的运行时间增长迅速,超过了问题规模的指数函数,那么这个算法就是指数时间的。通常用 O ( 2 n ) O(2^n) O(2n)表示指数时间,其中n是问题的输入规模。

例子:

  • O ( 2 n ) O(2^n) O(2n)表示指数时间,算法的运行时间随着输入规模的增加呈指数级增长。

指数时间算法通常非常慢,特别是在处理大规模问题时,因为它们的运行时间增长非常迅猛。在实际应用中,指数时间算法通常只适用于小规模问题,因为对于大规模问题,它们的运行时间可能会变得不切实际。

P问题(多项式问题)

P问题(Polynomial Problem)是指那些可以在多项式时间内(即问题规模的多项式函数时间内)解决的问题。简单来说,如果一个问题是P问题,那么存在一个算法,其运行时间的上限是输入规模的多项式函数,也就是说,对于P问题,存在一个多项式函数 f ( n ) f(n) f(n),其中n是输入规模,算法的运行时间是 O ( f ( n ) ) O(f(n)) O(f(n))。大多数常见的计算问题,例如排序、搜索和数学运算,都属于P问题。这些问题可以有效地通过计算机算法来解决,而且在合理的时间内。

假设有一个排序问题,你需要对一个包含n个整数的数组进行排序。一个典型的排序算法是冒泡排序。在冒泡排序中,每次比较相邻的两个元素并交换它们,然后再次遍历数组,重复这个过程,直到整个数组排序完成。这个算法的时间复杂度是 O ( n 2 ) O(n^2) O(n2),其中n是数组的大小。这意味着算法的运行时间与数组大小的平方成正比。这个问题是一个P问题,因为存在一个多项式函数 n 2 n^2 n2来描述算法的运行时间。

冒泡排序的基本思想是从左到右不断比较相邻两个元素,如果它们的顺序不正确(即前面的元素大于后面的元素),则交换它们,将较大的元素“冒泡”到右侧。这个过程一直重复,直到没有需要交换的元素为止。下面为冒泡排序的Python代码。

def bubble_sort(arr):
    n = len(arr)
    # 遍历数组元素,执行n-1次
    for i in range(n - 1):
        # 每次遍历从头开始,将较大的元素逐个向后交换
        for j in range(0, n - 1 - i):
            if arr[j] > arr[j + 1]:
                # 交换arr[j]和arr[j + 1]的值
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

可以看到,上述代码包含两层循环。

外层循环迭代n-1次,表示当剩余一个元素时就没有必要移动了。

内层循环迭代的次数是不同的。在第一次迭代中,它需要比较n-1次。在第二次迭代中,它需要比较n-2次,依此类推。

因此,总的比较次数可以表示为:

(n-1) + (n-2) + (n-3) + ... + 1= n(n-1)/2

对于每一次比较,如果需要交换,就会执行一次交换操作。最坏情况下,每次比较都需要交换,因此交换的次数与比较的次数相等,都是 O ( n 2 ) O(n^2) O(n2)

所以冒泡排序的时间复杂度是 O ( n 2 ) O(n^2) O(n2)

NP问题(非确定性多项式问题)

NP问题(Non-deterministic Polynomial Problem)是指那些可以在多项式时间内验证给定解的问题。也就是说,如果你有一个候选解,你可以在多项式时间内检查它是否是正确的解。然而,尚未找到一种有效的算法来在多项式时间内解决所有NP问题。如果某个问题是NP问题,那么如果你提供一个猜测的解,你可以在多项式时间内验证它是否正确。典型的NP问题包括旅行商问题和背包问题。

旅行商问题(Traveling Salesman Problem,TSP)是一个组合优化问题,它的时间复杂度在一般情况下是指数级别的。TSP的时间复杂度取决于问题的规模(城市数量)和求解方法。

暴力穷举法

如果使用暴力穷举法来解决TSP,需要尝试所有可能的城市排列,计算每个排列的路径长度,然后选择最短路径,其时间复杂度为 O ( n ! ) O(n!) O(n!),其中n是城市的数量。

这个很好理解,首次选择时有n个城市可选,第二次选择时从剩下的n-1个城市中选择,第三次选择时从剩下的n-2个城市中选择,以此类推,直到最后一次选择时就剩下1个城市。所以就是 n × ( n − 1 ) × ( n − 2 ) × . . . × 2 × 1 = n ! n\times(n-1)\times(n-2)\times...\times2\times1=n! n×(n1)×(n2)×...×2×1=n!

动态规划

动态规划是一种用于解决TSP的有效方法,但它的时间复杂度也取决于问题的规模,其时间复杂度为 O ( n 2 ∗ 2 n ) O(n^2 * 2^n) O(n22n),其中n是城市的数量,推导过程如下:

求解旅行商问题(Traveling Salesman Problem,TSP)的动态规划算法的时间复杂度取决于问题规模和算法的具体实现方式。TSP是一个NP-hard问题,因此不存在多项式时间复杂度的解决方案,但动态规划可以用来求解相对较小规模的TSP实例。下面是一个简单的TSP动态规划算法的时间复杂度分析:

假设有N个城市,我们要找到一条经过所有城市一次且回到起点的最短路径。

  1. 状态空间的大小:动态规划的核心是定义状态和状态转移方程。通常,我们可以使用一个二进制位向量来表示当前哪些城市已经访问过,例如,如果n=4,可以使用0001、0010、0100、1000来表示不同的状态,其中每个位代表一个城市是否被访问,所有这些状态构成了S。

  2. 状态转移方程:动态规划的关键在于状态之间的转移。对于TSP,状态转移方程通常是:

    dp[S][i] = min(dp[S][i], dp[S-{i}][j] + dist[j][i])
    

d p [ S ] [ i ] dp[S][i] dp[S][i]表示从起始城市出发,经过集合S中的城市,最后到达城市i的最短路径长度。 d i s t [ j ] [ i ] dist[j][i] dist[j][i]表示城市j到城市i的距离。

  1. 时间复杂度分析:对于每个状态mask,需要遍历所有的城市i和找到一个城市j,因此状态转移的时间复杂度是 O ( n 2 ) O(n^2) O(n2)。对于每个状态mask,都需要计算 d p [ m a s k ] [ i ] dp[mask][i] dp[mask][i],一共有 2 n 2^n 2n个状态(每个状态都对应一个mask),所以总的时间复杂度是 O ( n 2 ∗ 2 n ) O(n^2 * 2^n) O(n22n)

总之,TSP的动态规划算法的时间复杂度是指数级的,随着城市数量的增加,计算复杂度急剧增加,因此在实际应用中,通常需要考虑其他算法来处理大规模TSP实例。

P与NP关系:

P问题是NP问题的子集,也就是说,所有P问题都是NP问题。这是因为如果一个问题可以在多项式时间内解决,那么你也可以在多项式时间内验证解是否正确。但至今尚未知道P问题和NP问题是否相等,即P = NP或P ≠ NP。

如果P = NP,这意味着对于所有NP问题,都存在一个多项式时间的算法来解决它们,这将改变计算机科学和密码学的面貌,因为许多加密算法和安全协议都依赖于NP问题的难解性。但如果P ≠ NP,那么一些NP问题可能是非常难解的,这将保持当前的计算机科学理论和实际应用的基础。

总之,P和NP问题是计算机科学中复杂性理论的核心概念,它们关注了在多项式时间内解决问题的可行性和难度。这两个问题的解决与许多计算和优化问题的解决方式以及计算机科学的未来发展密切相关。

作业车间调度问题是典型的NP难问题

作业车间调度问题(Job Shop Scheduling Problem)被认为是一个NP难问题,这意味着它至少与NP问题一样难以求解。有几个原因解释了为什么作业车间调度问题被归类为NP难问题:

  1. 组合爆炸:在作业车间调度问题中,通常有多个作业(jobs)需要在一台或多台机器上执行,并且每个作业都有一系列的工序(operations)必须按照特定的顺序执行。这导致了组合爆炸,因为可能有许多不同的工序排列,每一种排列都需要评估其总执行时间。随着作业数量和机器数量的增加,问题的规模呈指数增长,这使得求解问题的所有可能解变得非常困难。

  2. 搜索空间巨大:对于作业车间调度问题,要找到最优解需要在所有可能的解中搜索,这个搜索空间通常非常大,因此暴力搜索所有可能的解是不现实的。这是NP难问题的一个典型特征,因为NP难问题的解决方案往往需要在庞大的搜索空间中进行搜索。

  3. 缺乏多项式时间算法:迄今为止,尚未发现一种能够在多项式时间内解决所有作业车间调度问题的算法。虽然有一些启发式方法和近似算法用于尝试找到接近最优解的解决方案,但对于大规模问题,这些算法也可能需要较长的计算时间。

咱们通过一个例子,直观地观察一下这种指数级的爆炸。

考虑一个3x3的JSP问题,即有3个工件和3台机器,每个工件各有3道工序恰好对应不同机器,那么每台机器均可加工3道工序,每台机器的不同工序排序数有3!=6种,那么3台机器就有3!x3!x3!=720种排序,看起来也不多。

接着考虑6x6的问题,排序数有 ( 6 ! ) 6 = 373248000 (6!)^6=373248000 (6!)6=373248000,一下子有点数不过来了,这也是我们为什么经常说6x6的问题人已经很难找到最优解了。

再看10x10的问题,排序数有 ( 10 ! ) 10 ≈ 4 × 1 0 65 (10!)^{10}≈4\times 10^{65} (10!)104×1065,这会彻底蒙了!

如用完全枚举法,2022年排名世界第一的美国超级计算机Frontier运算速度达到每秒1.1百亿亿≈$1.1\times 10^{18} $次,那也需要 1.1 × 1 0 40 1.1\times 10^{40} 1.1×1040年,而地球年龄也仅为 45.5 亿年 ≈ 4.55 ∗ 1 0 9 45.5亿年≈4.55*10^9 45.5亿年4.55109年。

但是,如果仅仅是解空间大的问题,随着计算机速度的提升,终将也不是大问题。本质上在于,车间调度问题受制于很多要素的约束,比如日历、物料、夹具等,需要在众多解中寻找满足约束条件的解,而每个约束条件都会增加问题的复杂度,此时寻找一个可行解都比较困难。

综上所述,作业车间调度问题因其组合爆炸、庞大的搜索空间和缺乏多项式时间算法等特点,被认为是NP难问题。这意味着它属于那些尚未找到快速解决方法的复杂问题之一,通常需要使用近似算法来得到次优解,所以一种比较切合实际的方法就是,充分利用问题本身的特征,通过仿真的方式从大量数据中寻找次优解,建立特征与结果的映射关系,并固化为特定知识,从而在面对新问题时可快速匹配出合适策略。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将vite项目(vue/react)使用vite-plugin-pwa配置为pwa应用,只需要3分钟即可

将项目配置为pwa模式,就可以在浏览器里面看到安装应用的选项,并且可以将web网页像app一样添加到手机桌面或者pad桌面上,或者是电脑桌面上,这样带来的体验就像真的在一个app上运行一样。为了实现这个目的,我们可以为vue…

vue3-hand-mobile

当我写完手势移动事件后,我又通过svg的方法添加了一段文字和polygon。当我在这个蓝色的polygon上滑动手势的时候,会报错。 可能这个bug只是我个人的代码导致的。但是我觉得vue3-hand-mobile插件的这一段代码写的有问题。 我通过circular-json库修复了这…

vite+vue3+ts项目上线docker 配置反向代理API

这次重点的坑是反向代理。 1。项目中配置代理,为了跨域请求数据 项目根目录中新建vite.config.ts文件 在文件中添加配置代理 注意:其中 /api 和target 的地址后面没有 / 2。在项目根目录中新建Httprequest.ts文件,引入axios,并…

网诺安全文件上传总结

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件(木马、病毒、恶意脚本、webshell等),并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方,由于程序对用户上传…

VUE使用computed实现子父组件双向绑定数据

上面字符串文字是父级的数据,下面表单是父级传给子组件并实现双向绑定 // 这里是vue3写法,vue2 同样在computed里写 get(){} 即可 const form computed({get(){ // props.modelForm 就是父级传过来的对象const proxy new Proxy(props.modelForm,{get(t…

网络原理——传输层2

1.TCP协议 TCP协议是工作中最常用到的协议。 TCP协议格式: 源端口号(16位):源端口标识发送方的应用程序。目的端口号(16位):目的端口标识接收方的应用程序。序列号(32位&#xf…

echarts 堆叠柱状图数据差值较大,导致显示图形差异很大

问题描述: echarts 堆叠柱状图数据差值较大,导致显示图形差异很大 如图: 解决方案 柱状图、折线图 给 y轴或者x轴type设置log 就可以 。饼图 设置 minAngle

kafka summary

最近整体梳理之前用到的一些东西,回顾Kafka的时候好多东西都忘记了,把一些自己记的比较模糊并且感觉有用的东西整理一遍并且记忆一遍,仅用于记录以备后续回顾 Kafka的哪些场景中使用了零拷贝 生产者发送消息:在 Kafka 生产者发送…

使用.NET6 Avalonia开发跨平台三维应用

本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD Rapid AvaloniaUI三维控件的过程。 0 初始化环境 安装Avalonia.Templates dotnet new install Avalonia.Templates若之前安装过可忽略此步骤。 1 创建项目 选择创建AvaloniaUI项目 选一下.NET6版本和Avalonia版…

RX-8564 LC实时时钟模块

.内置 32.768 kHz 晶体单元(频率精度调整完毕) .接口类型:I2C-Bus 接口 (400 kHz) .工作电压范围:1.8 V ~ 5.5 V .计时(保持)电压范围 :1.0 V ~ 5.5 V / -20 ˚C ~70 ˚C .低待机电流 :275 nA / 3.0…

基于BiLSTM-CRF对清华语料文本进行分类

安装TorchCRF !pip install TorchCRF1.0.6 构建BiLSTM-CRF # encoding:utf-8import torch import torch.nn as nn from TorchCRF import CRFfrom torch.utils.data import Dataset from sklearn.model_selection import train_test_split import numpy as npimport torch im…

python-自动化篇-运维-语音识别

文章目录 理论文本转换为语音使用 pyttsx使用 SAPI使用 SpeechLib 语音转换为文本 代码和效果01使用pyttsx实现文本_语音02使用SAPI实现文本_语音03使用SpeechLib实现文本_语音04使用PocketSphinx实现语音转换文本 理论 语音识别技术,也被称为自动语音识别&#xf…

Threejs 展示——点击模型指定部分添加高亮显示

文章目录 需求分析需求 如下图所示,点击模型指定部分添加高亮显示 分析 绘制一个 canvas将该 canvas 将渲染器挂载到dom<template><canvas id="three" /> </template><scr

基于C#制作一个俄罗斯方块小游戏

目录 引言游戏背景介绍游戏规则游戏设计与实现开发环境与工具游戏界面设计游戏逻辑实现游戏优化和测试性能优化测试工具和流程说明引言 俄罗斯方块是一款经典的益智游戏,深受玩家喜爱。本文将介绍如何使用C#编程语言制作一个简单的俄罗斯方块小游戏,并探讨其设计与实现过程。…

从公有云对象存储迁移到回私有化 MinIO需要了解的所有信息

我们上一篇文章《如何从 AWS S3 遣返到 MinIO》的反响非常出色 - 我们已经接到了数十个企业的电话&#xff0c;要求我们提供遣返建议。我们已将这些回复汇总到这篇新文章中&#xff0c;其中我们更深入地研究了与遣返相关的成本和节省&#xff0c;以便您更轻松地进行自己的分析。…

递归、分治

递归 Recursion 函数自身调用自身通过函数体来进行的循环以自相似的方法重复进行的过程递归的三个关键 定义需要递归的问题&#xff08;重叠子问题&#xff09;- 数学归纳法思维确定递归边界保护与还原现场 递归形式时间复杂度规模问题举例指数型 2 n 2^n 2n子集排列型 n ! …

基于BERT模型实现文本相似度计算

配置所需的包 !pip install transformers2.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install HanziConv -i https://pypi.tuna.tsinghua.edu.cn/simple 数据预处理 # -*- coding: utf-8 -*-from torch.utils.data import Dataset from hanziconv import Han…

统计学-R语言-7.3

文章目录 前言总体方差的检验一个总体方差的检验两个总体方差比的检验 非参数检验总体分布的检验正态性检验的图示法Shapiro-Wilk和K-S正态性检验总体位置参数的检验 练习 前言 本篇文章继续对总体方差的检验进行介绍。 总体方差的检验 一个总体方差的检验 在生产和生活的许多…

Hypermesh中模型抽取中面的方法

一、自动抽取中面 二、手动抽取中面 offsetplanessweeps会记录所抽取的中面由哪两个面形成的 planes&#xff1a;所识别的对面是两个平面&#xff0c;就会在两平面中间区域插入一个中面 sweeps&#xff1a;所识别的对面是两个曲面时&#xff0c;就会在两个曲面中间区域插入一个…

esp32 操作DS1307时钟芯片

电气参数摘要 有VCC供电&#xff0c;IIC活动状态是1.5mA&#xff0c;待机状态200μA&#xff0c;电池电流5nA(MAX50nA&#xff09;无VCC供电的时候&#xff0c;电池电流&#xff0c;300nA&#xff08;时钟运行&#xff09;&#xff0c;10nA&#xff08;时钟停止&#xff09;供…
最新文章