首页 > 编程语言 >生产运作——多机调度问题(Python)

生产运作——多机调度问题(Python)

时间:2023-04-16 21:45:42浏览次数:48  
标签:结点 Python 作业 调度 len 多机 best

多机调度问题是生产管理与控制的一个基本问题。按照加工设备数量和加工作业的流云方式,一般可分为单机调度、并行机调度、Flowshop调度、可重入式调度和Jobshop调度会多种类型。作业调度中的许多问题,不仅具有随机性、约束复杂、规模大及多目标冲突等点,而且许多都属于NP完全问题,即使在单机情形也是如此。因此,如何寻求有效可行的度求解方案,一直是生产管理与控制研究的热点和难点。

一、多机调度问题

多机调度问题是个NP完全问题,到目前为止没有有效的算法(求得最优解的有效的算法),但是利用贪心算法可以近似求出最优解,采用最长处理时间作业优先的贪心选择策略,可以设计出较好的解。在n<m时,我们大可以为每个作业分配一台机器,而在n>m时,我们选择将所有的作用按处理时间从大到小排序,按照这个顺序给每个作业分配最先空闲的机器。对于每一个任务i,m个机器都可以选择执行或不执行,对于每一种情况进行递归回溯,在这个过程中更新最优解,剪枝策略:默认完成全部任务的时间为最长时间即best=INF,当执行当前任务需要的时间小于best时进行回溯,否则不进行递归出口,当回溯到第n个任务时结束,更新最优解。
设有\(n\)个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理,作业\(i\)所需时间为\(T_i\)。约定:任何作业可以在任何一台机器上加工处理,但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。要求给出一种作业执行次序,使所给的\(n\)个作业在尽可能短的时间内由\(m\)台机器加工处理完成,计算\(n\)由\(m\)台机器处理的最短时间,并给出作业加工顺序。

二、算法思想

设计思路:
(1)搜索从开始节点(根节点)出发,以深度优先搜索搜索整个解空间。
(2)每搜索完一条路径则记录下T和best序列,开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处向纵深方向移至一个新结点后并成为一个新的活结点,也成为当前扩展结点。
(3)如果在当前的扩展结点处不能再向纵深方向扩展,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点;直至找到一个解或全部解。

贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。按照最长处理时间作业优先的贪心策略,当m≥n时,只要将机器i的[0,ti)时间区间分配给作业i即可;当m<n时,首先将n个作业依其所需的处理时间从大到小排序,然后依此顺序将作业分配给空闲的处理机。

三、算法Python实现

# 多机调度问题——最佳调度问题
n = 9  # 任务数
k = 4  # 机器数
best = 99999  # 最优值(完成全部任务的最早时间)
len = []  # 每台机器已安排的时间
t = [10,14,3,9,21,6,18,16,5]  # 每个任务所需的时间
x = []  # 当前路径(调度)
bestx = []  # 最优路径(调度)

# 计算任务完成的时间
def comp():
    tmp = 0
    for i in range(k):
        if len[i] > tmp:
            tmp = len[i]
    return tmp

# 以深度优先遍历方式遍历解空间树
def search(dep, len, t):
    global best
    if dep == n:
        tmp = comp()
        if tmp < best:
            best = tmp
            for i in range(n):
                bestx[i] = x[i]
        return

    for i in range(k):
        len[i] += t[dep]
        x[dep] = i + 1
        if len[i] < best:
            search(dep + 1, len, t)
        len[i] -= t[dep]

if __name__=="__main__":
    len = [0 for _ in range(k)]    # k长度
    x = [0 for _ in range(n)]      # n长度
    bestx = [0 for _ in range(n)]  # n长度

    search(0, len, t)
    print("最优值:", best)
    print("最优解:", bestx)
最优值: 26
最优解: [1, 2, 2, 2, 3, 4, 4, 1, 3]

参考文献

  1. 多机调度问题
  2. 回溯法解最佳调度问题(python实现)

标签:结点,Python,作业,调度,len,多机,best
From: https://www.cnblogs.com/haohai9309/p/17320484.html

相关文章

  • python中的魔术方法
    魔法方法(MagicMethod)是python内置方法,格式为:“__方法名__”,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写这些python的内置函......
  • 半期复习——第三章:处理机调度(3.1~3.4)
    3.1处理机调度的层次和调度算法的目标 一、处理机调度的层次(3)  1.高级调度(作业调度、长程调度)    ①用于决定把外存上处于后备队列中的哪些作业调入内存,并为它们创建进程、分配必要的资源,然后,再将新创建的进程排在就绪队列上,准备执行。主要用于多道批处理系统......
  • python 音频处理
    1.音频波形图可视化   可以看到运行的收已经可以从mic中获取数据了    有点奇怪 不知都是不是声卡驱动问题......
  • python中如何对程序运行时长进行计时?
      在python中对程序运行的是时长进行计时这里主要介绍两种方式:自定义和TimePinner。1、自定义计时  自定义计时,我们这里只需要简单记录开始时间和结束时间,计算出时差进行打印。  首先导入datetime库importdatetime  记录开始时间和结束时间#开始时间start_time......
  • python程序中如何结束程序的运行?
    结束程序运行主要的方式有四种:sys.exit()threading.Thread._stop()os._exit()os.kill(os.getpid(),signal.SIGTERM)1、单线程或单进程结束程序。(1)sys.exit()  sys.exit()指令可以直接结束整个Python程序的运行,包括所有线程。(2)threading.Thread._stop()  threading......
  • [oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
    语义分析_抽象语法树_反汇编回忆上次回顾了一下历史python是如何从无到有的看到Guido长期的坚持和努力python究竟是如何理解print("hello")的?这些ascii字母如何被组织起来执行?纯文本首先编写Guido的简历print("1982------Guidoincwi")print("1995------Guidoincnri")pri......
  • python安装配置
    Python简介Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。Python是一种解释型语言:这意味着开发过程中没有了编译这个环节......
  • [oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree
    语义分析_抽象语法树_反汇编回忆上次回顾了一下历史python是如何从无到有的看到Guido长期的坚持和努力 ​ 添加图片注释,不超过140字(可选) python究竟是如何理解print("hello")的?这些ascii字母如何被组织起来执行? ......
  • 使用Python代码远程连接服务器
    目录一、paramiko模块的介绍二、基本使用(用户名密码登录)三、用公钥私钥连接一、paramiko模块的介绍模块介绍使用Python的第三方模块paramiko实现远程连接服务器功能:通过python代码连接服务器并执行相关操作并且支持用户名密码连接和公钥私钥连接模块安装pipinstall......
  • PYTHON 读STATA
    #导入stata_setup模块frompandasimportjson_normalizeimportpandasaspdimportstata_setup,json#通过stata_setup.config关联Stata17stata_setup.config(r"D:\Stata17","mp")#填入Stata17的本地路径及版本类型frompystataimportstata#stata.run(r&......