uva690題目完完全全就是流水線模擬
,給出指令的時序圖,要你算出10條指令並行執行的最優流水線開銷,
我在紫書上找到的這道題,劉大爺把它放在了第七章:暴力求解法
,那我們就來用暴力莽一發
不管什麼流水線排程的高階演算法,直接暴力模擬流水線的執行,列舉所有指令的分配情況
那麼我們很容易想到: 流水線執行的最壞情況實際上就是所有指令全部序列執行
那麼這個時候的開銷就是
m ax
d×
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...