動態規劃 《演算法導論》中的裝配線排程問題實現

2021-04-17 13:07:52 字數 1695 閱讀 8722

問題描述:

某汽車工廠有2個裝配線,每個裝配線有n 個裝配站(按順序編號1~n ),兩個裝配線對應的裝配站執行相同的功能,但所用的時間可能不同。經過第i條流水線(i=1,2)的第j 個裝配站所花的時間為aij。從第i條流水線的第j 個裝配站移到第j+1個裝配站的時間可以忽略,而移到另外乙個流水線的下乙個裝配站則需要一定的時間tij。

汽車進入流水線不需要花時間,出流水線時需要花時間tin。

汽車的裝配需要按順序經過所有裝配站。

現在已知裝配時間aij 和轉移時間tij,要求輸出裝配一輛汽車所需要的最短時間。 

動態規劃演算法思想:

動態規劃與貪心策略類似,將乙個問題的解決方案視為一系列決策的結果。不同的是,貪心演算法每採用一次貪心選擇便做出乙個不可撤回的決策,而在動態規劃中,還要考察每個最優決策序列中是否包含乙個最優決策自序列。使用動態規劃時,所求問題應具有以下兩種性質。

1.最優子結構性質

所求問題的最優子結構性質是採用動態規劃演算法的條件之一,這種性質又被稱為最優化原理。動態規劃方法採用最優化原理來建立用於計算最優解的遞迴式。所謂最優化原理即不管前面的策略如何,此後的決策必須是基於當前狀態(由上一次決策產生)的最優決策。由於對於有些問題的某些遞迴式來說並不一定能保證最優原則,因此在求解問題時有必要對它進行驗證。若不能保持最優原則,則不可應用動態規劃方法。在得到最優解的遞迴式之後,需要執行回溯以構造最優解。當最優決策序列中包含最優決策子串行時,可建立動態規劃遞迴方程,它可以幫助我們高效地解決問題。

2.子結構重迭性質

人們總希望編寫乙個簡單的遞迴程式來求解動態規劃遞迴方程。然而,如果不努力地去避免重複計算,遞迴程式的複雜性將非常可觀。如果在遞迴程式設計中解決了重複計算問題,複雜性將大幅度下降。這種方法的思想是:由程式設定「備忘錄」,每計算出乙個新的子結構的解時,都儲存起來。當遇到一次遞迴時,判斷是否已經計算,如果已經計算,只需取出先前儲存的結果既可。動態規劃遞迴方程也可用迭代方式來求解,這時很自然地避免了重複計算。儘管迭代程式與避免重複計算的遞迴程式有相同的複雜性,但迭代程式不需要附加的遞迴棧空間,因此將比避免重複計算的遞迴程式更快。

#include

#define n 6

#define min(a, b) (a) < (b) ? (a) : (b);

int main()

;const int b[n] = ;

const int a2b[n-1] = ;

const int b2a[n-1] = ;

char ra[n], rb[n];

int min_a = 2;

int min_b = 4;

int station;

int ai, aj;

int bi, bj;

min_a += a[0];

min_b += b[0];

printf("sa=%d sb=%d/n", min_a, min_b);

int i;

for(i = 1; i < n; i++)

min_a += 3;

min_b += 2;

printf("sa=%d sb=%d/n", min_a, min_b);

station = (min_a < min_b);

printf("last station is %c/n", (min_a < min_b) ? 'a' : 'b');

for(i = n - 2; i > -1; i--)

else}}

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

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

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

前言 動態規劃的概念 動態規劃 dynamic programming 是通過組合子問題的解而解決整個問題的。分治演算法是指將問題劃分為一些獨立的子問題,遞迴的求解各個問題,然後合併子問題的解而得到原問題的解。例如歸併排序,快速排序都是採用分治演算法思想。本書在第二章介紹歸併排序時,詳細介紹了分治演...

演算法導論 15 1裝配線排程

總共有n個裝配站 底盤進入到裝配線1和裝配線2的時間記錄在二元陣列e 2 上 底盤在裝配線1和裝配線2上每個站的時間記錄在陣列a1 n 和a2 n 上 底盤在每個站上換裝配線的時間記錄在t1 n 1 t2 n 2 上 在最後乙個站時候,不需要換裝配線了,所以陣列只有n 1個資料 底盤離開裝配線的時間...