diff --git a/TODO.md b/TODO.md index 026fbbf..2035b66 100644 --- a/TODO.md +++ b/TODO.md @@ -1,9 +1,11 @@ +[cps] `problem-solver/` -- 用单个的 `Solver` class 来实现 -- 而不是 `ProblemSpace` + `Searching` + [cps] [problem-space] [subway] `SubwayProblemSpace` & `createSubwayProblemSpace` -- Problem = `Station` +- Problem = Station - 这里读起来有点问题, - 因为 Station 本身不是问题, + 虽然这里写的是 Problem = Station, + 但是其实 Station 本身不是问题, 到达某个 Station 才是问题。 - Branch = `TakeLine: { oldStation, line, newStation }` @@ -18,12 +20,8 @@ # later +[cps] [problem-space] `Searching` 的 API 应该是 `take` 之类的。 + [cps] 也许用深圳的地铁作为例子,并且写一个模仿《百度地图》的前端出来试试。 [cps] 实现第三章的代数例子 - -[cps] `problem-solver/` -- 用单个的 `Solver` class 来实现 -- 而不是 `ProblemSpace` + `Searching` - -- 因为 `ProblemSpace` + `Searching` 这两个 class 看来太复杂了, - 比如 `searching.space.problemIsSolved(path.current)` - v.s. `solver.problemIsSolved(path.current)` diff --git a/docs/diary/2024-08-25-space-and-searching-vs-solver.md b/docs/diary/2024-08-25-space-and-searching-vs-solver.md new file mode 100644 index 0000000..ea96284 --- /dev/null +++ b/docs/diary/2024-08-25-space-and-searching-vs-solver.md @@ -0,0 +1,30 @@ +--- +title: Space and Searching v.s. Solver +date: 2024-08-25 +--- + +在实现 Problem Space Model 的时候, +发现有两种组织 class 的方式: + +- 一、用单个的 `Solver` class 来实现。 +- 二、将 `Solver` 分解为 `ProblemSpace` + `Searching` 这两个 class 来实现。 + +对比二者的 API: + +```typescript +solver.problemIsSolved(path.current) +searching.space.problemIsSolved(path.current) +``` + +一个 `Solver` class 的 API 更简单。 +但是实际上描述一个问题空间的 interface 是 `ProblemSpace`, +而 `Searching` 是 search 运行是所需要的搜索状态。 + +书中的实现是只有 `ProblemSpace`, +search 函数的搜索状态没有作为一个 `Searching` class 暴露出来。 + +我将同时做出这两种风格的实现,作为一个 API 设计的练习。 + +我怀疑,Space + Searching 是更好的设计, +但是 Space 的所有 interface 好像都是为了 search 来服务的, +所以也许 Space 和 Space 应该合并为 Solver。 diff --git a/src/cps/problem-solver/Solver.ts b/src/cps/problem-solver/Solver.ts new file mode 100644 index 0000000..ba02709 --- /dev/null +++ b/src/cps/problem-solver/Solver.ts @@ -0,0 +1,11 @@ +export type Solver = { + name: string + problemIsSolved: (problem: Problem) => boolean + problemEqual: (left: Problem, right: Problem) => boolean + validBranches: (problem: Problem) => Array + branchApply: (branch: Branch, problem: Problem) => Problem + + problem: Problem + queue: Array> + solved: Array> +} diff --git a/src/cps/problem-solver/index.ts b/src/cps/problem-solver/index.ts new file mode 100644 index 0000000..c0a7ccb --- /dev/null +++ b/src/cps/problem-solver/index.ts @@ -0,0 +1 @@ +export * from "./Solver.js"