动态规划解决流水作业问题
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
动态规划
1.要素
动态规划两大要素:最优子结构、重叠子问题
最优子结构:当问题的最优解包含了其子问题的最优解时,该问题具有最优子结构性质
重叠子问题:在用递归算法自底向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算,具有子问题重叠性质。这类问题称重叠子问题
2.基本思想
将待求解问题分解成若干个子问题,先求解子问题,然后结合这些子问题的解得到原问题的解。求解的问题经分解得到的子问题往往不是相互独立的
3.适用于解最优化问题步骤
1)找出最优解的性质,并刻画其结果特征(分析最优解结构)
2)递归地定义最优解(建立递归关系)
3)以自底向上的方法计算得到的信息,构造最优解(计算最优解)
4)根据计算最优值得到的信息,构造最优解(构造最优解)
1)2)3)为基本步骤
一、流水作业调度
设有n个工件需要在机器M1和M2上加工,每个工件的加工顺序都是先在M1上加工,然后在M2上加工。t1j,t2j分别表示工件j在M1,M2上所需的加工时间(j=1,2,···,n),确定其加工顺序
1.分析最优解结构
流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。在一般情况下,机器M2上会有机器空闲和作业积压两种情况。
设全部作业的集合为N={1,2,…,n},S⊆N,S是N的一个子集。在一般情况下,机器M1开始加工S中作业时,机器M2还在加工其他作业,要等时间t后才可利用。这种情况下,完成S中作业所需的最短时间记为T(S,t),流水作业调度问题的最优值为T(N,0)
二、解决问题
问题的描述:
n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。
流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
调度规则
(1 ) 把全部ai和bi分类成非降序列,ai和bi分别是第i个作业在两个机器上所需要的时间。
(2 ) 按照这一分类次序考察此序列: 如果序列中下一个数是aj 且作业j还没调度,那么在还没使用的最左位置调度作业j ; 如果下个数是bj 且作业j还没调度,那么在还没使用的最右位置调度作业j ; 如果已经调度了作业j,则转到该序列的下一个数。
算法主要利用Johnson不等式原理,对于所有的a步骤和b步骤的时间从小到大排序。如果合并序列中拿出的元素属于a集合,则将其所属的job作为第一个job执行;如果属于b集合,则将其所属的job作为最后一个job执行。进行下一个元素的判断,分别作为第二、倒数第二,依次类推;直到所有job被标记之后退出,获得的job数组就是job的执行序列。
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.例子
例子1
设 n=4,( a1,a2,a3,a4 ) =( 3,4,8,10 ) 和( b1,b2,b3,b4 ) =(6,2,9,15 ),对这些a和b分类后的序列是( b2,a1,a2,b1,a3,b3,a4,b4 ) =( 2,3,4,6,8,9,10,15),
设σ1,σ2,σ3,σ4是最优调度。
最小数是b2, 置σ4 = 2。
下一个最小数是a1, 置σ1 = 1。
接着的最小数是a2,由于作业2已被调度,转向再下一个数b1 。
作业1已被调度,再转向下一个数a3,置 σ2 = 3。
最后剩σ3 是空的,而作业4还没调度,从而σ3= 4
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。