前沿——線上、串流、參數化與超越最壞情況

核心化(kernelization)

在著手一道難題之前,明智的解題者會先把被「逼死」的部分劃掉——那些只有一種可能答案的步——直到剩下一個小而棘手、真正需要思考的核心。核心化把這個直覺變成定理。它是參數化問題的一個預處理步驟,在多項式時間內,把任何實例縮成一個等價的實例,其大小僅由參數 k 的某個函數所界定——無論原本多麼龐大。縮小後的實例稱為「核心(kernel)」。

精確地說,參數化問題(參數 k)的一個核心化,是一個多項式時間程序,把實例 (I, k) 變換成新實例 (I', k'),使得 (I', k') 是 YES-實例「當且僅當」(I, k) 是,而且 I' 的大小最多為某個只依賴 k 的函數 g(k)。這項工作由「化簡規則」完成:簡單、可證明安全、反覆套用的簡化。對頂點覆蓋,有兩條經典規則:(1) 任何孤立頂點都可刪除,它什麼都不覆蓋;(2) 任何度數大於 k 的頂點「必」在任何大小為 k 的覆蓋中(否則它那許多邊就各需一個不同的覆蓋頂點,超過 k),於是把它放入並把 k 減 1。徹底套用這些規則後,若仍剩超過 k^2 條邊,你可以立即回答 NO;否則你剩下一個最多 k^2 條邊的核心——其大小只依賴 k,而非原本的 n。

核心化之所以重要,是因為它是實務求解的嚴謹骨幹:這正是為何預處理常能把一個怪物般的 NP 困難實例,變成小到能用暴力法攻破的東西。一條核心定理把它與 FPT 緊緊綁在一起:一個參數化問題是固定參數可解的,「當且僅當」它有核心化。所以核心不只是啟發式——它等價於固定參數可解,而更小的核心意味著更快的求解。誠實的提醒:核心化只保證一個「小」實例,不是一個「平凡」的——你仍得解那個核心(常用指數方法,但現在是在微小輸入上);核心大小界 g(k) 可能很大(對 k 多項式甚至指數);而化簡規則必須被證明正確,因為一條會改變答案的不安全規則會毀掉一切。

頂點覆蓋,參數 k。規則 A:刪除孤立頂點(它們不覆蓋任何邊)。規則 B:若頂點 v 度數 > k,它必在覆蓋中,於是加入 v 並令 k := k-1。兩條都套用到卡住為止。若剩下的圖仍有超過 k*k 條邊,立即回答 NO(k 個頂點每個最多覆蓋其中 k 條)。否則核心有 <= k^2 條邊——小到能暴力解。

多項式時間化簡規則把實例縮到大小 g(k);然後解這個小核心。

一條定理:一個問題是 FPT「當且僅當」它有核心化。但核心仍必須被解(常在如今微小的輸入上用指數方法),而大小界 g(k) 可能對 k 是多項式或更糟。化簡規則必須「被證明」保留答案——一條不安全的規則會悄悄破壞正確性。

又称
preprocessing with a guaranteeinstance reduction問題壓縮預處理