演算法分析 動態規劃 裝配線排程

2022-01-21 23:50:47 字數 2534 閱讀 1980

前言:動態規劃的概念

動態規劃(dynamic programming)是通過組合子問題的解而解決整個問題的。分治演算法是指將問題劃分為一些獨立的子問題,遞迴的求解各個問題,然後合併子問題的解而得到原問題的解。例如歸併排序,快速排序都是採用分治演算法思想。本書在第二章介紹歸併排序時,詳細介紹了分治演算法的操作步驟,詳細的內容請參考:而動態規劃與此不同,適用於子問題不是獨立的情況,也就是說各個子問題包含有公共的子問題。如在這種情況下,用分治演算法則會重複做不必要的工作。採用動態規劃演算法對每個子問題只求解一次,將其結果存放到一張表中,以供後面的子問題參考,從而避免每次遇到各個子問題時重新計算答案。

動態規劃與分治法之間的區別:

(1)分治法是指將問題分成一些獨立的子問題,遞迴的求解各子問題

(2)動態規劃適用於這些子問題不是獨立的情況,也就是各子問題包含公共子問題

動態規劃通常用於最優化問題(此類問題一般有很多可行解,我們希望從這些解中找出乙個具有最優(最大或最小)值的解)。動態規劃演算法的設計分為以下四個步驟:

(1)描述最優解的結構

(2)遞迴定義最優解的值

(3)按自低向上的方式計算最優解的值

(4)由計算出的結果構造乙個最優解

動態規劃最重要的就是要找出最優解的子結構。書中接下來列舉4個問題,講解如何利用動態規劃方法來解決。動態規劃的內容比較多,我計畫每個問題都認真分析,寫成日誌。今天先來看第乙個問題:裝配線排程問題

2、問題描述

乙個汽車公司在有2條裝配線的工廠內生產汽車,每條裝配線有n個裝配站,不同裝配線上對應的裝配站執行的功能相同,但是每個站執行的時間是不同的。在裝配汽車時,為了提高速度,可以在這兩天裝配線上的裝配站中做出選擇,即可以將部分完成的汽車在任何裝配站上從一條裝配線移到另一條裝配線上。裝配過程如下圖所示:

裝配過程的時間包括:進入裝配線時間e、每裝配線上各個裝配站執行時間a、從一條裝配線移到另外一條裝配線的時間t、離開最後乙個裝配站時間x。舉個例子來說明,現在有2條裝配線,每條裝配線上有6個裝配站,各個時間如下圖所示:

從圖中可以看出按照紅色箭頭方向進行裝配汽車最快,時間為38。分別現在裝配線1上的裝配站1、3和6,裝配線2上裝配站2、4和5。

3、動態規劃解決步驟

(1)描述通過工廠最快線路的結構

對於裝配線排程問題,乙個問題的(找出通過裝配站si,j的最快線路)最優解包含了子問題(找出通過s1,j-1或s2,j-1的最快線路)的乙個最優解,這就是最優子結構。觀察一條通過裝配站s1,j的最快線路,會發現它必定是經過裝配線1或2上裝配站j-1。因此通過裝配站的最快線路只能以下二者之一:

a)通過裝配線s1,j-1的最快線路,然後直接通過裝配站si,j;

b)通過裝配站s2,j-1的最快線路,從裝配線2移動到裝配線1,然後通過裝配線s1,j。

為了解決這個問題,即尋找通過一條裝配線上的裝配站j的最快線路,需要解決其子問題,即尋找通過兩條裝配線上的裝配站j-1的最快線路。

(2)乙個遞迴的解

最終目標是確定底盤通過工廠的所有路線的最快時間,設為f*,令fi[j]表示乙個底盤從起點到裝配站si,j的最快時間,則f* = min(f1[n]+x1,f2[n]+x2)。逐步向下推導,直到j=1。

當j=1時:f1[1] = e1+a1,1,f2[1] = e2+a2,1

當j>1時:f1[j] = min(f1[j-1]+a1,j,f2[j-1]+t2,j-1+a1,j),f2[j] = min(f2[j-1]+a2,j,f1[j-1]+t1,j-1+a2,j)

演算法導論 動態規劃 裝配線排程

動態規劃 dynamic programming 是通過組合子問題的解而解決整個問題的。分治演算法是指將問題劃分為一些獨立的子問題,遞迴地求解各子問題,然後合併子問題的解而得到原問題的解。動態規劃適用於子問題不是獨立的情況,也就是各子問題包含公共的子子問題。在這種情況下,若用分治法則會做許多不必要的...

動態規劃 裝配線排程問題

這個問題是在演算法導論的動態規劃章節有提到,由於問題敘述起來太繁雜就直接省略。命名規則與書上的偽 是一致的,只是用c 具體語言實現了而已。動態規劃問題 裝配線排程問題 pragma once class asl include alspro.h include include using names...

動態規劃 裝配線排程問題

具體題目詳見 演算法導論 第15章 動態規劃 利用動態規劃解決裝配線排程問題 配置檔案名稱是 stationinfo.txt 第一行為進入兩條線各花費的時間 第二行為離開兩條線個花費的時間 接下來六行為第一條線每個站點停留時間 每個站點到本線下一站點時間 每個站點到另一條線下乙個站點時間 最後六行為...