UVA690 最優性剪枝 估價函式

2021-10-09 05:17:21 字數 3521 閱讀 8148

uva690題目完完全全就是流水線模擬,給出指令的時序圖,要你算出10條指令並行執行的最優流水線開銷,

我在紫書上找到的這道題,劉大爺把它放在了第七章:暴力求解法,那我們就來用暴力莽一發

不管什麼流水線排程的高階演算法,直接暴力模擬流水線的執行,列舉所有指令的分配情況

那麼我們很容易想到: 流水線執行的最壞情況實際上就是所有指令全部序列執行

那麼這個時候的開銷就是

m ax

n(1)

maxd \times n \tag

maxd×n

(1)

其中m ax

dmaxd

maxd

為指令條數,n

nn為單條指令占用的時間片長度

假設c ur

curcu

r為當前放置指令的時間片標號,那麼最後一條指令(也就是第10條指令)的時間片範圍為

c ur

∈[(m

axd−

1)×n

,max

d×n−

1]

(2)cur\in[(maxd-1) \times n,maxd \times n - 1] \tag

cur∈[(

maxd

−1)×

n,ma

xd×n

−1](

2)那麼我們只需要列舉遍歷 [1,

(max

d−1)

×n

][1,(maxd-1)\times n]

[1,(ma

xd−1

)×n]

的時間片範圍,統計出所有可行解,然後輸出最小值即可

那麼我們到這裡就水到渠成的tle

假設列舉到第 d

dd 個時間片,那麼我們可以大致估算一下隨後 max

d−

dmaxd-d

maxd−d

的最小開銷, 假如這個最小開銷加上當前開銷都小於最優答案,就剪枝

於是就有了如下的估價函式

c ur

+f⁡(

maxd

−d)≥

best

(3)cur+\operatorname(maxd-d) \geq best \tag

cur+f(

maxd

−d)≥

best

(3)

其中c ur

curcu

r位當前列舉到時間片,bes

tbest

best

為cur的上界(由上文上界得知 bes

tbest

best

初始值為 (ma

xd−1

n(maxd-1)\times n

(maxd−

1)×n

), f⁡(

maxd

−d

)\operatorname(maxd-d)

f(maxd

−d) 為剩餘指令最小開銷

於是,我們只需要找到這個開銷即可,這裡可以直接用 ida* 的模板,當然演算法並不是 ida*,我們可以從算出 [2,

9]

[2,9]

[2,9

]比如: max

d=

4maxd=4

maxd=4

時,我們已經擁有了 f⁡(

1),f

⁡(2)

,f⁡(

3)

\operatorname(1),\operatorname(2),\operatorname(3)

f(1),f

(2),

f(3)

的最小開銷,直接用其剪枝即可.用時大概:20ms

但這多麻煩啊

先用下面這個莽一發再說,因為我們發現:

f ⁡(

maxd

−d)≥

(max

d−d)

×f⁡(

1)

(4)\operatorname(maxd-d) \geq (maxd-d)\times\operatorname(1) \tag

f(maxd

−d)≥

(max

d−d)

×f(1

)(4)

因為一條指令調入後可能會之前的多條指令搶奪單元部件從而衝突,需要多間隔一些時間片,所以上述條件存在,可以畫畫圖啥的

然後開始莽**,嗯,然後過了, 1.19s, uva 的資料還是太弱

/* *uva690. 暴力搜尋版本

*tle版本 + 小剪枝 = 過了?

*/#include

#include

#include

#include

using

namespace std;

const

int maxn =21;

// 樣例最大19

const

int inf =

220;

// 最大是 maxd * n - 1, 反正空間不值錢

int table[5]

[inf]

;//暴力模擬·保留表·

int minstep, n, maxd,best;

vector<

int> pos[maxn]

;// 乙個時間片可能使用多個單元部件

void

print_t()

//除錯用列印保留表

putchar

('\n');

}bool

check

(int cur)

//檢查該個時間片內能不能放指令, 可以使用二進位制位表示用到的單元

return

true;}

voidgo(

int cur,

int val)

// 放入指令更改保留表,val為0時回溯

void

dfs(

int d,

int cur)

for(

int i = cur; i <= best;

++i)

}int

main()

// 儲存單個時間片用到的所有單元

}getchar()

;}// 最後一段座標範圍 [(maxd - 1) * n, maxd * n -1]

for(

int i =

1; i <= n;

++i)if(

check

(i))

//找到最小步長f(1)

best =

9* n , maxd =10;

dfs(2,

1);printf

("%d\n"

,best + n );}

return0;

}

最優性原理

看了很多有關最優性原理的解釋,總是感覺不清晰 不透徹,以下是我個人的理解 我們先給出定義 最優性原理 對於多階段決策過程的最優決策序列具有如下性質 不論初始狀態和初始決策如何,對於前面決策所造成的某一狀態而言,其後各階段的決策序列必須構成最優策略 它看上去很討厭,如同與你玩文字遊戲,我們單看冒號前的...

最優性原理

最優性原理是指 多階段決策過程中的最優決策序列具有如下性質 不論初始狀態和初始決策如何,對於前面決策所造成的某一狀態而言,其後各階段的決策序列必須構成最優策略 最優性原理是動態規劃的基礎。簡而言之,最優性原理的含義就是 最優策略的任何一部分子策略都必須是最優的。舉個例子,如下圖所示,如果給定從a到c...

uva140 dfs(回溯)最優性剪枝

題解 1.原書中已經說明,如果兩個節點的頻寬 最小頻寬,無論如何也不可能比原解更優,應該剪掉。2.注意此題讀入的時候一定要按字典序儲存,這樣計算出的最小值才是符合要求的 3.注意strtok的用法 include include include include include include inc...