前幾個晚上,我在滑一個很有趣的網站。
那是一個無限畫布的圖片 Gallery,你可以往任意方向拖曳,八個方向都可以走,沒有盡頭。那種感覺有點像在一個沒有邊界的房間裡漫遊,你不知道下一個轉角會出現什麼,但你知道你可以一直走下去。
我一邊玩,一邊開始想:如果這個空間不只是裝飾性的呢?如果往哪個方向走,不只是「到達那裡」,而是「靠近某種東西」呢?
就這樣,我想到多年前的專案,同時也開始推演這一個概念。
從穿搭照片開始想
最初的場景是這樣的:一面牆,放滿了穿搭照片。你站在中間,可以往八個方向走。
普通的做法是:左邊放「休閒風」,右邊放「正式風」,上面放「深色系」,下面放「淺色系」。這是一個固定的二維座標系,每張照片釘在地圖上的某個位置。
但這樣的問題是,風格是多維的。一件衣服可以是「寬鬆的正裝」,也可以是「緊身的街頭風」。你沒辦法把它平攤在一個二維平面上而不失去什麼。
所以我換了一個思路:不要把照片釘在地圖上,而是讓照片本身決定鄰居是誰。
每張照片在八個方向上各有一個數值。你往右走,找的是「右方向數值相同」的照片。你再往上走,找的是「右方向 AND 上方向都相同」的照片。條件越多,交集越小,你越接近某個特定的風格群。
一個很關鍵的差異
當我開始推演這個邏輯的時候,我在思考:如果用方向來鎖定篩選的值呢?
你往右走,同時鎖定當前照片的右方向值,然後找所有右方向也是這個值的照片。
這裡有個微妙但重要的地方:鎖定的值不是你決定的,而是你走到的那張照片決定的。你不是在設定篩選條件,你是在跟著照片走。每一步都是上一張照片給你的提示。
這個機制有個名字,我後來把它叫做:方向約束鎖定(Directional Constraint Locking,DCL)。
DCL 是什麼
用最簡單的語言說:
每個節點在八個方向各有一個唯一數值(預設是 1 到 8 的排列,不重複;值域可擴展)。你第一次往某個方向移動,就鎖定那個方向的值。之後的每一步,都必須符合所有已鎖定的條件。
四個核心規則:
- 規則一:方向即維度。 八個方向代表八個固定的語意維度。往右永遠是同一個維度,往上永遠是另一個維度。
- 規則二:移動即鎖定。 第一次往某個方向移動時,當前節點在那個方向的數值被鎖定。這個值來自你踩到的節點,不是你預先指定的。
- 規則三:條件累積。 已鎖定的條件只增不減。你往右再往上,就同時鎖定了兩個維度。最多可以累積八個條件,覆蓋所有方向。
- 規則四:FIFO 解鎖。 當累積的條件太多,找不到符合所有條件的節點時,最早鎖定的條件優先釋放。先進先出,永遠不會卡死。
它和現有的演算法有什麼不同
這個問題我研究了一下。
最接近的既有概念是 Faceted Search(分面搜尋),電商網站的多條件篩選,左側欄有品牌、顏色、價格,你勾選,結果就縮小。相似度大約三到四成。
DCL 和 Faceted Search 的本質差異有三個:
第一,Faceted Search 的篩選值是你主動選擇的;DCL 的鎖定值是你走到那裡才知道的。你不需要事先知道你想要什麼,你只需要開始走。
第二,Faceted Search 的條件是靜態的,你可以隨時勾選或取消;DCL 的條件是由移動軌跡決定的,帶有時序關係,FIFO 解鎖也依照這個時序。
第三,Faceted Search 沒有「循環池」的概念,符合條件的節點會形成一個可以無限循環的集合,在同一方向持續移動就在這個池子裡繞,永遠不會走到死路。
另一個接近的框架是 CSP(約束滿足問題),但那是一次性求解演算法,遇到死路採用回溯(撤銷最近的決定),而 DCL 撤銷的是最早的決定,完全不同的邏輯。
研究後的結論是:DCL 的六個核心機制分散存在於不同領域,但這個特定的組合在已知文獻中沒有被命名或形式化過。
數學結構長這樣
如果用符號來寫,核心邏輯是這四步:
候選池函數:P(L, cₜ) = { c ∈ C | c ≠ cₜ ∧ ∀(d, v) ∈ L : A(c, d) = v }導航函數 nav(d):1. 若 d 未鎖定:L ← L ∪ {(d, A(cₜ, d))},Q.enqueue(d)2. P ← P(L, cₜ)3. 若 P = ∅:FIFO 解鎖直到 P ≠ ∅4. cₜ ← P[ k mod |P| ],k ← k + 1
其中 A(c, d) 是節點 c 在方向 d 的值,L 是目前鎖定的條件集合,Q 是鎖定的先後順序佇列。
這個系統有幾個可以證明的性質:無死路(FIFO 保證)、最大鎖定數為 8、符合條件的節點形成有限循環群。
一個實務上值得注意的地方:在預設的 1–8 排列下,鎖定兩個條件後期望候選池已不足 1 張(數學上約 0.71 張)。實際部署時,資料集至少需要 56 個節點才能讓雙重鎖定有流暢的體驗;如果希望支撐三重鎖定,至少需要 336 個節點。擴大值域(N > 8)可以在不增加資料量的情況下改善這個問題。
可以回頭,也可以模糊匹配
演算法目前已實作兩個擴充:
記憶(undo):透過插件機制,引擎可以記錄移動歷史,讓使用者退回上一步,鎖定條件保持不變,只換回前一張節點。適合「走錯了想回頭看看」的場景。
DCL.use(engine, 'memory');engine.navigate('right');engine.undo(); // 退回上一張,條件不變engine.canUndo(); // true / false
模糊匹配:嚴格等值匹配可以放寬為容差窗口(±ε),讓數值接近但不完全相同的節點也能進入候選池。這在小資料集或連續數值場景下特別有用。
它可以拿來做什麼
最直接的應用是探索型介面,任何需要多維探索、但不想讓使用者面對複雜篩選條件的場景:
穿搭探索:八個方向代表版型、色調、風格、場合等維度。你不是在設定「我要找正式的寬鬆款」,你是在漂流,讓照片帶著你走,直到你覺得「對,就是這個感覺」。
音樂發現:節奏、情緒、樂器、年代。你從一首歌出發,往某個方向走,找到和它在某個維度共鳴的歌。
選品工具:材質、價格帶、風格、品牌調性。不是用篩選條件找商品,而是在商品空間裡漫遊。
更有趣的延伸是:如果八個方向的維度語意不是人工定義的,而是由 AI(例如 CLIP 的視覺 embedding)自動從圖片內容提取呢?你不需要為每張圖打標籤,模型自己決定什麼是「相似」,你只是在這個自動生成的語意空間裡漫遊。
最後
我不是學者,也沒有在學術機構工作。這個演算法其實是我多年前的一個 idea,當時跟工程師討論,但沒人理解我在說什麼,直到有 AI 後,這個演算法被我實現了,或許這篇文章沒什麼人在意,但如果 DCL 是一個有意義的概念,它就值得被記錄下來;如果它已經有人想過了,我也想知道是誰、在哪裡。
附上可以玩的 Demo 和完整的演算法規格書,歡迎試試看這個邏輯在互動上是什麼感覺。
DCL Demo:dcl-demo-alpha.vercel.app GitHub Demo:reidevbx.github.io/dcl GitHub:github.com/reidevbx/dcl 如果你對這個概念有興趣,或知道相關的既有研究,歡迎聯絡。






