tscommons-esm-algorithms 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/classes/astar-maze-search.d.mts +18 -0
- package/dist/classes/astar-maze-search.mjs +134 -0
- package/dist/classes/astar-maze-search.mjs.map +1 -0
- package/dist/classes/astar-search.d.mts +17 -0
- package/dist/classes/astar-search.mjs +32 -0
- package/dist/classes/astar-search.mjs.map +1 -0
- package/dist/classes/binary-winner-mini-max.d.mts +25 -0
- package/dist/classes/binary-winner-mini-max.mjs +100 -0
- package/dist/classes/binary-winner-mini-max.mjs.map +1 -0
- package/dist/classes/bredth-first-search.d.mts +5 -0
- package/dist/classes/bredth-first-search.mjs +7 -0
- package/dist/classes/bredth-first-search.mjs.map +1 -0
- package/dist/classes/constraint-satisfaction.d.mts +52 -0
- package/dist/classes/constraint-satisfaction.mjs +314 -0
- package/dist/classes/constraint-satisfaction.mjs.map +1 -0
- package/dist/classes/depth-first-search.d.mts +5 -0
- package/dist/classes/depth-first-search.mjs +7 -0
- package/dist/classes/depth-first-search.mjs.map +1 -0
- package/dist/classes/greedy-best-first-search.d.mts +6 -0
- package/dist/classes/greedy-best-first-search.mjs +20 -0
- package/dist/classes/greedy-best-first-search.mjs.map +1 -0
- package/dist/classes/hill-climb-local-search.d.mts +18 -0
- package/dist/classes/hill-climb-local-search.mjs +60 -0
- package/dist/classes/hill-climb-local-search.mjs.map +1 -0
- package/dist/classes/local-search.d.mts +8 -0
- package/dist/classes/local-search.mjs +29 -0
- package/dist/classes/local-search.mjs.map +1 -0
- package/dist/classes/random-restart.d.mts +11 -0
- package/dist/classes/random-restart.mjs +17 -0
- package/dist/classes/random-restart.mjs.map +1 -0
- package/dist/classes/search.d.mts +23 -0
- package/dist/classes/search.mjs +107 -0
- package/dist/classes/search.mjs.map +1 -0
- package/dist/enums/ebinary-player.d.mts +4 -0
- package/dist/enums/ebinary-player.mjs +6 -0
- package/dist/enums/ebinary-player.mjs.map +1 -0
- package/dist/enums/elocal-search-orientation.d.mts +4 -0
- package/dist/enums/elocal-search-orientation.mjs +6 -0
- package/dist/enums/elocal-search-orientation.mjs.map +1 -0
- package/dist/enums/emaze-heuristic.d.mts +4 -0
- package/dist/enums/emaze-heuristic.mjs +6 -0
- package/dist/enums/emaze-heuristic.mjs.map +1 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.mjs +16 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types/tmaze-search-node.d.mts +10 -0
- package/dist/types/tmaze-search-node.mjs +2 -0
- package/dist/types/tmaze-search-node.mjs.map +1 -0
- package/dist/types/tsearch-node.d.mts +3 -0
- package/dist/types/tsearch-node.mjs +2 -0
- package/dist/types/tsearch-node.mjs.map +1 -0
- package/dist/types/tstart-with-score.d.mts +4 -0
- package/dist/types/tstart-with-score.mjs +2 -0
- package/dist/types/tstart-with-score.mjs.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { commonsArrayRemove, commonsArrayRemoveAll, commonsArrayShuffle, commonsBase62GenerateRandomId } from 'tscommons-esm-core';
|
|
2
|
+
export class CommonsAlgorithmConstraintSatisfactionNode {
|
|
3
|
+
internalDomain;
|
|
4
|
+
isDomainValueEqual;
|
|
5
|
+
internalUid;
|
|
6
|
+
saved;
|
|
7
|
+
constructor(internalDomain, isDomainValueEqual) {
|
|
8
|
+
this.internalDomain = internalDomain;
|
|
9
|
+
this.isDomainValueEqual = isDomainValueEqual;
|
|
10
|
+
this.internalUid = commonsBase62GenerateRandomId();
|
|
11
|
+
}
|
|
12
|
+
saveDomains() {
|
|
13
|
+
if (this.saved)
|
|
14
|
+
throw new Error('Save collision');
|
|
15
|
+
this.saved = [...this.internalDomain];
|
|
16
|
+
}
|
|
17
|
+
revertDomains() {
|
|
18
|
+
if (!this.saved)
|
|
19
|
+
throw new Error('No save to revert to');
|
|
20
|
+
this.internalDomain = this.saved; // not clone
|
|
21
|
+
this.saved = undefined;
|
|
22
|
+
}
|
|
23
|
+
get domain() {
|
|
24
|
+
return [...this.internalDomain];
|
|
25
|
+
}
|
|
26
|
+
set domain(values) {
|
|
27
|
+
this.internalDomain = [...values];
|
|
28
|
+
}
|
|
29
|
+
removeFromDomain(value) {
|
|
30
|
+
commonsArrayRemove(this.internalDomain, value, this.isDomainValueEqual);
|
|
31
|
+
}
|
|
32
|
+
get uid() {
|
|
33
|
+
return this.internalUid;
|
|
34
|
+
}
|
|
35
|
+
isEqual(b) {
|
|
36
|
+
return this.internalUid === b.internalUid;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export class CommonsAlgorithmConstraintSatisfactionEdge {
|
|
40
|
+
xNode;
|
|
41
|
+
yNode;
|
|
42
|
+
edgeData;
|
|
43
|
+
constructor(xNode, yNode, edgeData) {
|
|
44
|
+
this.xNode = xNode;
|
|
45
|
+
this.yNode = yNode;
|
|
46
|
+
this.edgeData = edgeData;
|
|
47
|
+
}
|
|
48
|
+
get x() {
|
|
49
|
+
return this.xNode;
|
|
50
|
+
}
|
|
51
|
+
get y() {
|
|
52
|
+
return this.yNode;
|
|
53
|
+
}
|
|
54
|
+
get data() {
|
|
55
|
+
return this.edgeData;
|
|
56
|
+
}
|
|
57
|
+
isEqual(edge) {
|
|
58
|
+
return edge.xNode.isEqual(this.xNode) && edge.yNode.isEqual(this.yNode);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class CommonsAlgorithmConstraintSatisfactionGraph {
|
|
62
|
+
internalNodes = [];
|
|
63
|
+
internalEdges = [];
|
|
64
|
+
get nodes() {
|
|
65
|
+
return [...this.internalNodes];
|
|
66
|
+
}
|
|
67
|
+
get edges() {
|
|
68
|
+
return [...this.internalEdges];
|
|
69
|
+
}
|
|
70
|
+
addNode(node) {
|
|
71
|
+
const existing = this.internalNodes
|
|
72
|
+
.find((n) => n.isEqual(node));
|
|
73
|
+
if (existing)
|
|
74
|
+
return existing;
|
|
75
|
+
this.internalNodes.push(node);
|
|
76
|
+
return node;
|
|
77
|
+
}
|
|
78
|
+
removeNode(node) {
|
|
79
|
+
const existing = this.internalNodes
|
|
80
|
+
.find((n) => n.isEqual(node));
|
|
81
|
+
if (!existing)
|
|
82
|
+
return false;
|
|
83
|
+
commonsArrayRemove(this.internalNodes, existing);
|
|
84
|
+
const edgeMatches = this.internalEdges
|
|
85
|
+
.filter((edge) => edge.x.uid === existing.uid || edge.y.uid === existing.uid);
|
|
86
|
+
commonsArrayRemoveAll(this.internalEdges, edgeMatches);
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
join(a, b, data) {
|
|
90
|
+
const existingA = this.internalNodes
|
|
91
|
+
.find((n) => n.isEqual(a));
|
|
92
|
+
if (!existingA)
|
|
93
|
+
throw new Error('Node A has not been added yet');
|
|
94
|
+
const existingB = this.internalNodes
|
|
95
|
+
.find((n) => n.isEqual(b));
|
|
96
|
+
if (!existingB)
|
|
97
|
+
throw new Error('Node B has not been added yet');
|
|
98
|
+
if (existingA.uid === existingB.uid)
|
|
99
|
+
throw new Error('Nodes cannot be equal');
|
|
100
|
+
const edge = new CommonsAlgorithmConstraintSatisfactionEdge(existingA, existingB, data);
|
|
101
|
+
const existing = this.internalEdges
|
|
102
|
+
.find((e) => e.isEqual(edge));
|
|
103
|
+
if (existing)
|
|
104
|
+
return existing;
|
|
105
|
+
this.internalEdges.push(edge);
|
|
106
|
+
return edge;
|
|
107
|
+
}
|
|
108
|
+
unjoin(a, b) {
|
|
109
|
+
const existingA = this.internalNodes
|
|
110
|
+
.find((n) => n.isEqual(a));
|
|
111
|
+
if (!existingA)
|
|
112
|
+
throw new Error('Node A has not been added yet');
|
|
113
|
+
const existingB = this.internalNodes
|
|
114
|
+
.find((n) => n.isEqual(b));
|
|
115
|
+
if (!existingB)
|
|
116
|
+
throw new Error('Node B has not been added yet');
|
|
117
|
+
if (existingA.uid === existingB.uid)
|
|
118
|
+
throw new Error('Nodes cannot be equal');
|
|
119
|
+
const edge = this.internalEdges
|
|
120
|
+
.find((e) => e.x.uid === a.uid && e.y.uid === b.uid);
|
|
121
|
+
if (edge)
|
|
122
|
+
commonsArrayRemove(this.internalEdges, edge);
|
|
123
|
+
this.unjoin(b, a);
|
|
124
|
+
}
|
|
125
|
+
listEdges(x) {
|
|
126
|
+
return this.internalEdges
|
|
127
|
+
.filter((e) => e.x.isEqual(x));
|
|
128
|
+
}
|
|
129
|
+
listRemoteNodes(x) {
|
|
130
|
+
return this.listEdges(x)
|
|
131
|
+
.map((e) => e.y);
|
|
132
|
+
}
|
|
133
|
+
revise(x, y) {
|
|
134
|
+
let isRevised = false;
|
|
135
|
+
const edge = this.internalEdges
|
|
136
|
+
.find((e) => e.x.isEqual(x) && e.y.isEqual(y));
|
|
137
|
+
for (const xValue of x.domain) {
|
|
138
|
+
let satisfied = false;
|
|
139
|
+
for (const yValue of y.domain) {
|
|
140
|
+
if (this.satisfies(xValue, yValue, edge)) {
|
|
141
|
+
satisfied = true;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (!satisfied) {
|
|
146
|
+
x.removeFromDomain(xValue);
|
|
147
|
+
isRevised = true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return isRevised;
|
|
151
|
+
}
|
|
152
|
+
applyUnaryConsistency() {
|
|
153
|
+
for (const node of this.internalNodes) {
|
|
154
|
+
node.applyUnaryConsistency();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
applyAc3() {
|
|
158
|
+
const edges = [...this.internalEdges];
|
|
159
|
+
while (edges.length > 0) {
|
|
160
|
+
const edge = edges.shift();
|
|
161
|
+
if (!edge)
|
|
162
|
+
throw new Error('Empty edges array. Should not be possible');
|
|
163
|
+
if (this.revise(edge.x, edge.y)) {
|
|
164
|
+
if (edge.x.domain.length === 0)
|
|
165
|
+
return false;
|
|
166
|
+
const zs = this.listRemoteNodes(edge.x);
|
|
167
|
+
commonsArrayRemove(zs, edge.y);
|
|
168
|
+
for (const z of zs) {
|
|
169
|
+
const zEdge = new CommonsAlgorithmConstraintSatisfactionEdge(z, edge.x);
|
|
170
|
+
edges.push(zEdge);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
saveSnapshot() {
|
|
177
|
+
for (const node of this.nodes)
|
|
178
|
+
node.saveDomains();
|
|
179
|
+
}
|
|
180
|
+
revertSnapshot() {
|
|
181
|
+
for (const node of this.nodes)
|
|
182
|
+
node.revertDomains();
|
|
183
|
+
}
|
|
184
|
+
snapshotForInference() {
|
|
185
|
+
const map = new Map();
|
|
186
|
+
for (const node of this.nodes) {
|
|
187
|
+
map.set(node.uid, [...node.domain]);
|
|
188
|
+
}
|
|
189
|
+
return map;
|
|
190
|
+
}
|
|
191
|
+
isUnsolvable() {
|
|
192
|
+
for (const node of this.nodes) {
|
|
193
|
+
if (node.domain.length === 0)
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
isComplete() {
|
|
199
|
+
if (!this.isConsistent())
|
|
200
|
+
return false;
|
|
201
|
+
for (const node of this.nodes) {
|
|
202
|
+
if (node.domain.length > 1)
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
isConsistent() {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
get mostConnecteds() {
|
|
211
|
+
const clone = this.nodes
|
|
212
|
+
.map((node) => ({
|
|
213
|
+
node: node,
|
|
214
|
+
edgeCount: this.listEdges(node).length
|
|
215
|
+
}));
|
|
216
|
+
if (clone.length === 0)
|
|
217
|
+
return [];
|
|
218
|
+
clone
|
|
219
|
+
.sort((a, b) => {
|
|
220
|
+
if (a.edgeCount < b.edgeCount)
|
|
221
|
+
return -1;
|
|
222
|
+
if (a.edgeCount > b.edgeCount)
|
|
223
|
+
return 1;
|
|
224
|
+
return 0;
|
|
225
|
+
})
|
|
226
|
+
.reverse();
|
|
227
|
+
const best = clone[0];
|
|
228
|
+
const bests = clone
|
|
229
|
+
.filter((c) => c.edgeCount === best.edgeCount);
|
|
230
|
+
return bests
|
|
231
|
+
.map((c) => c.node);
|
|
232
|
+
}
|
|
233
|
+
get mostConnected() {
|
|
234
|
+
const choices = this.mostConnecteds;
|
|
235
|
+
if (choices.length === 0)
|
|
236
|
+
return undefined;
|
|
237
|
+
return choices[Math.floor(Math.random() * choices.length)];
|
|
238
|
+
}
|
|
239
|
+
get smallestNonSingularDomains() {
|
|
240
|
+
const clone = this.nodes
|
|
241
|
+
.map((node) => ({
|
|
242
|
+
node: node,
|
|
243
|
+
domainCount: node.domain.length
|
|
244
|
+
}))
|
|
245
|
+
.filter((node) => node.domainCount > 1);
|
|
246
|
+
if (clone.length === 0)
|
|
247
|
+
return [];
|
|
248
|
+
clone
|
|
249
|
+
.sort((a, b) => {
|
|
250
|
+
if (a.domainCount < b.domainCount)
|
|
251
|
+
return -1;
|
|
252
|
+
if (a.domainCount > b.domainCount)
|
|
253
|
+
return 1;
|
|
254
|
+
return 0;
|
|
255
|
+
});
|
|
256
|
+
const best = clone[0];
|
|
257
|
+
const bests = clone
|
|
258
|
+
.filter((c) => c.domainCount === best.domainCount);
|
|
259
|
+
return bests
|
|
260
|
+
.map((c) => c.node);
|
|
261
|
+
}
|
|
262
|
+
get smallestNonSingularDomain() {
|
|
263
|
+
const choices = this.smallestNonSingularDomains;
|
|
264
|
+
if (choices.length === 0)
|
|
265
|
+
return undefined;
|
|
266
|
+
return choices[Math.floor(Math.random() * choices.length)];
|
|
267
|
+
}
|
|
268
|
+
applyBacktrack(chooseNextNode = () => this.smallestNonSingularDomain) {
|
|
269
|
+
if (this.isComplete())
|
|
270
|
+
return true;
|
|
271
|
+
if (this.isUnsolvable())
|
|
272
|
+
return false;
|
|
273
|
+
const choice = chooseNextNode();
|
|
274
|
+
if (!choice)
|
|
275
|
+
return false;
|
|
276
|
+
const available = [...choice.domain];
|
|
277
|
+
commonsArrayShuffle(available);
|
|
278
|
+
for (const value of available) {
|
|
279
|
+
this.saveSnapshot();
|
|
280
|
+
choice.domain = [value];
|
|
281
|
+
if (this.isConsistent()) {
|
|
282
|
+
const valid = this.applyAc3();
|
|
283
|
+
const map = this.snapshotForInference();
|
|
284
|
+
this.revertSnapshot();
|
|
285
|
+
const preInference = this.snapshotForInference();
|
|
286
|
+
if (valid) {
|
|
287
|
+
// inference
|
|
288
|
+
for (const node of this.nodes) {
|
|
289
|
+
const match = map.get(node.uid);
|
|
290
|
+
if (match)
|
|
291
|
+
node.domain = [...match];
|
|
292
|
+
}
|
|
293
|
+
choice.domain = [value];
|
|
294
|
+
const recurse = this.applyBacktrack();
|
|
295
|
+
if (recurse)
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
choice.removeFromDomain(value);
|
|
299
|
+
for (const node of this.nodes) {
|
|
300
|
+
const match = preInference.get(node.uid);
|
|
301
|
+
if (!match)
|
|
302
|
+
throw new Error('No preInference to revert to');
|
|
303
|
+
node.domain = match;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.revertSnapshot();
|
|
308
|
+
choice.removeFromDomain(value);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=constraint-satisfaction.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint-satisfaction.mjs","sourceRoot":"","sources":["../../src/classes/constraint-satisfaction.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { TCommonsAlgorithmSearchNode } from '../types/tsearch-node.mjs';
|
|
2
|
+
import { CommonsAlgorithmSearch, TCommonsAlgorithmInternalNode } from './search.mjs';
|
|
3
|
+
export declare abstract class CommonsAlgorithmDepthFirstSearch<ActionT, NodeT extends TCommonsAlgorithmSearchNode<ActionT>> extends CommonsAlgorithmSearch<ActionT, NodeT> {
|
|
4
|
+
protected get next(): TCommonsAlgorithmInternalNode<ActionT, NodeT> | undefined;
|
|
5
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depth-first-search.mjs","sourceRoot":"","sources":["../../src/classes/depth-first-search.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAiC,MAAM,cAAc,CAAC;AAErF,MAAM,OAAgB,gCAGpB,SAAQ,sBAAsC;IAC/C,IAAc,IAAI;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC;CACD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TCommonsAlgorithmSearchNode } from '../types/tsearch-node.mjs';
|
|
2
|
+
import { CommonsAlgorithmSearch, TCommonsAlgorithmInternalNode } from './search.mjs';
|
|
3
|
+
export declare abstract class CommonsAlgorithmGreedyBestFirstSearch<ActionT, NodeT extends TCommonsAlgorithmSearchNode<ActionT>> extends CommonsAlgorithmSearch<ActionT, NodeT> {
|
|
4
|
+
protected abstract heuristic(node: NodeT): number;
|
|
5
|
+
protected get next(): TCommonsAlgorithmInternalNode<ActionT, NodeT> | undefined;
|
|
6
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CommonsAlgorithmSearch, commonsAlgorithmDeInternalise } from './search.mjs';
|
|
2
|
+
export class CommonsAlgorithmGreedyBestFirstSearch extends CommonsAlgorithmSearch {
|
|
3
|
+
get next() {
|
|
4
|
+
if (this.frontier.length === 0)
|
|
5
|
+
return undefined;
|
|
6
|
+
let bestScore;
|
|
7
|
+
let bestIndex;
|
|
8
|
+
for (let i = 0; i < this.frontier.length; i++) {
|
|
9
|
+
const score = this.heuristic(commonsAlgorithmDeInternalise(this.frontier[i]));
|
|
10
|
+
if (bestScore === undefined || score < bestScore) {
|
|
11
|
+
bestScore = score;
|
|
12
|
+
bestIndex = i;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (bestIndex === undefined)
|
|
16
|
+
return undefined;
|
|
17
|
+
return this.frontier.splice(bestIndex, 1)[0];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=greedy-best-first-search.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greedy-best-first-search.mjs","sourceRoot":"","sources":["../../src/classes/greedy-best-first-search.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAiC,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAEpH,MAAM,OAAgB,qCAGpB,SAAQ,sBAAsC;IAG/C,IAAc,IAAI;QACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAEjD,IAAI,SAA2B,CAAC;QAChC,IAAI,SAA2B,CAAC;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAW,IAAI,CAAC,SAAS,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtF,IAAI,SAAS,KAAK,SAAS,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBAClD,SAAS,GAAG,KAAK,CAAC;gBAClB,SAAS,GAAG,CAAC,CAAC;YACf,CAAC;QACF,CAAC;QAED,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAE9C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;CACD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TCommonsAlgorithmStateWithScore } from '../types/tstart-with-score.mjs';
|
|
2
|
+
import { ECommonsAlgorithmOrientation } from '../enums/elocal-search-orientation.mjs';
|
|
3
|
+
import { CommonsAlgorithmLocalSearch } from './local-search.mjs';
|
|
4
|
+
export declare abstract class CommonsAlgorithmHillClimbLocalSearch<StateT> extends CommonsAlgorithmLocalSearch<StateT> {
|
|
5
|
+
protected orientation: ECommonsAlgorithmOrientation;
|
|
6
|
+
constructor(orientation: ECommonsAlgorithmOrientation);
|
|
7
|
+
protected abstract chooseFromValids(valids: TCommonsAlgorithmStateWithScore<StateT>[]): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
8
|
+
protected choose(state: TCommonsAlgorithmStateWithScore<StateT>, potentials: TCommonsAlgorithmStateWithScore<StateT>[]): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare abstract class CommonsAlgorithmSteepestHillClimbLocalSearch<StateT> extends CommonsAlgorithmHillClimbLocalSearch<StateT> {
|
|
11
|
+
protected chooseFromValids(valids: TCommonsAlgorithmStateWithScore<StateT>[]): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
12
|
+
}
|
|
13
|
+
export declare abstract class CommonsAlgorithmStochasticHillClimbLocalSearch<StateT> extends CommonsAlgorithmHillClimbLocalSearch<StateT> {
|
|
14
|
+
protected chooseFromValids(valids: TCommonsAlgorithmStateWithScore<StateT>[]): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare abstract class CommonsAlgorithmFirstChoiceHillClimbLocalSearch<StateT> extends CommonsAlgorithmHillClimbLocalSearch<StateT> {
|
|
17
|
+
protected chooseFromValids(valids: TCommonsAlgorithmStateWithScore<StateT>[]): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
18
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ECommonsAlgorithmOrientation } from '../enums/elocal-search-orientation.mjs';
|
|
2
|
+
import { CommonsAlgorithmLocalSearch } from './local-search.mjs';
|
|
3
|
+
export class CommonsAlgorithmHillClimbLocalSearch extends CommonsAlgorithmLocalSearch {
|
|
4
|
+
orientation;
|
|
5
|
+
constructor(orientation) {
|
|
6
|
+
super();
|
|
7
|
+
this.orientation = orientation;
|
|
8
|
+
}
|
|
9
|
+
choose(state, potentials) {
|
|
10
|
+
const orientationClosure = this.orientation;
|
|
11
|
+
const valids = potentials
|
|
12
|
+
.filter((potential) => {
|
|
13
|
+
switch (orientationClosure) {
|
|
14
|
+
case ECommonsAlgorithmOrientation.MAXIMUM:
|
|
15
|
+
return potential.score > state.score;
|
|
16
|
+
case ECommonsAlgorithmOrientation.MINIMUM:
|
|
17
|
+
return potential.score < state.score;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
const choice = this.chooseFromValids(valids);
|
|
21
|
+
if (!choice)
|
|
22
|
+
return undefined;
|
|
23
|
+
return choice;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class CommonsAlgorithmSteepestHillClimbLocalSearch extends CommonsAlgorithmHillClimbLocalSearch {
|
|
27
|
+
chooseFromValids(valids) {
|
|
28
|
+
if (valids.length === 0)
|
|
29
|
+
return undefined;
|
|
30
|
+
valids
|
|
31
|
+
.sort((a, b) => {
|
|
32
|
+
if (a.score < b.score)
|
|
33
|
+
return -1;
|
|
34
|
+
if (a.score > b.score)
|
|
35
|
+
return 1;
|
|
36
|
+
return 0;
|
|
37
|
+
});
|
|
38
|
+
switch (this.orientation) {
|
|
39
|
+
case ECommonsAlgorithmOrientation.MAXIMUM:
|
|
40
|
+
return valids[valids.length - 1];
|
|
41
|
+
case ECommonsAlgorithmOrientation.MINIMUM:
|
|
42
|
+
return valids[0];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class CommonsAlgorithmStochasticHillClimbLocalSearch extends CommonsAlgorithmHillClimbLocalSearch {
|
|
47
|
+
chooseFromValids(valids) {
|
|
48
|
+
if (valids.length === 0)
|
|
49
|
+
return undefined;
|
|
50
|
+
return valids[Math.floor(Math.random() * valids.length)];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class CommonsAlgorithmFirstChoiceHillClimbLocalSearch extends CommonsAlgorithmHillClimbLocalSearch {
|
|
54
|
+
chooseFromValids(valids) {
|
|
55
|
+
if (valids.length === 0)
|
|
56
|
+
return undefined;
|
|
57
|
+
return valids[0];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=hill-climb-local-search.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hill-climb-local-search.mjs","sourceRoot":"","sources":["../../src/classes/hill-climb-local-search.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAEtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,OAAgB,oCAA6C,SAAQ,2BAAmC;IAEjG;IADZ,YACY,WAAyC;QAEpD,KAAK,EAAE,CAAC;QAFG,gBAAW,GAAX,WAAW,CAA8B;IAGrD,CAAC;IAIkB,MAAM,CAAC,KAA8C,EAAE,UAAqD;QAC9H,MAAM,kBAAkB,GAAiC,IAAI,CAAC,WAAW,CAAC;QAE1E,MAAM,MAAM,GAA8C,UAAU;aACjE,MAAM,CAAC,CAAC,SAAkD,EAAW,EAAE;YACvE,QAAQ,kBAAkB,EAAE,CAAC;gBAC5B,KAAK,4BAA4B,CAAC,OAAO;oBACxC,OAAO,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBACtC,KAAK,4BAA4B,CAAC,OAAO;oBACxC,OAAO,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACvC,CAAC;QACF,CAAC,CAAC,CAAC;QAEL,MAAM,MAAM,GAAsD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAE9B,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAED,MAAM,OAAgB,4CAAqD,SAAQ,oCAA4C;IACpH,gBAAgB,CAAC,MAAiD;QAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAE1C,MAAM;aACH,IAAI,CAAC,CAAC,CAA0C,EAAE,CAA0C,EAAU,EAAE;YACxG,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;gBAAE,OAAO,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;gBAAE,OAAO,CAAC,CAAC;YAChC,OAAO,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;QAEL,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1B,KAAK,4BAA4B,CAAC,OAAO;gBACxC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClC,KAAK,4BAA4B,CAAC,OAAO;gBACxC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACF,CAAC;CACD;AAED,MAAM,OAAgB,8CAAuD,SAAQ,oCAA4C;IACtH,gBAAgB,CAAC,MAAiD;QAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAE1C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;CACD;AAED,MAAM,OAAgB,+CAAwD,SAAQ,oCAA4C;IACvH,gBAAgB,CAAC,MAAiD;QAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAE1C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TCommonsAlgorithmStateWithScore } from '../types/tstart-with-score.mjs';
|
|
2
|
+
export declare abstract class CommonsAlgorithmLocalSearch<StateT> {
|
|
3
|
+
protected abstract score(state: StateT): number;
|
|
4
|
+
protected abstract neighbours(state: StateT): StateT[];
|
|
5
|
+
protected abstract choose(state: TCommonsAlgorithmStateWithScore<StateT>, potentials: TCommonsAlgorithmStateWithScore<StateT>[]): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
6
|
+
computeNext(current: TCommonsAlgorithmStateWithScore<StateT>): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
7
|
+
computeOptimial(initial: StateT): TCommonsAlgorithmStateWithScore<StateT>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class CommonsAlgorithmLocalSearch {
|
|
2
|
+
computeNext(current) {
|
|
3
|
+
const neighbours = this.neighbours(current.state);
|
|
4
|
+
const potentials = neighbours
|
|
5
|
+
.map((s) => ({
|
|
6
|
+
state: s,
|
|
7
|
+
score: this.score(s)
|
|
8
|
+
}));
|
|
9
|
+
if (potentials.length === 0)
|
|
10
|
+
return undefined;
|
|
11
|
+
const choice = this.choose(current, potentials);
|
|
12
|
+
if (!choice)
|
|
13
|
+
return undefined;
|
|
14
|
+
return choice;
|
|
15
|
+
}
|
|
16
|
+
computeOptimial(initial) {
|
|
17
|
+
let current = {
|
|
18
|
+
state: initial,
|
|
19
|
+
score: this.score(initial)
|
|
20
|
+
};
|
|
21
|
+
while (true) {
|
|
22
|
+
const next = this.computeNext(current);
|
|
23
|
+
if (!next)
|
|
24
|
+
return current;
|
|
25
|
+
current = next;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=local-search.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-search.mjs","sourceRoot":"","sources":["../../src/classes/local-search.mts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,2BAA2B;IAOzC,WAAW,CAAC,OAAgD;QAClE,MAAM,UAAU,GAAa,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE5D,MAAM,UAAU,GAA8C,UAAU;aACrE,GAAG,CAAC,CAAC,CAAS,EAA2C,EAAE,CAAC,CAAC;YAC5D,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;SACrB,CAAC,CAAC,CAAC;QACN,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAE9C,MAAM,MAAM,GAAsD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACnG,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAE9B,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,eAAe,CAAC,OAAe;QACrC,IAAI,OAAO,GAA4C;YACrD,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;SAC3B,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,IAAI,GAAsD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI;gBAAE,OAAO,OAAO,CAAC;YAE1B,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TCommonsAlgorithmStateWithScore } from '../types/tstart-with-score.mjs';
|
|
2
|
+
import { ECommonsAlgorithmOrientation } from '../enums/elocal-search-orientation.mjs';
|
|
3
|
+
import { CommonsAlgorithmLocalSearch } from './local-search.mjs';
|
|
4
|
+
export declare abstract class CommonsAlgorithmRandomRestartSearch<StateT, SearchT extends CommonsAlgorithmLocalSearch<StateT>> {
|
|
5
|
+
private orientation;
|
|
6
|
+
constructor(orientation: ECommonsAlgorithmOrientation);
|
|
7
|
+
protected abstract constructLocalSearch(orientation: ECommonsAlgorithmOrientation): SearchT;
|
|
8
|
+
protected abstract generateInitial(): StateT;
|
|
9
|
+
protected abstract choose(potentials: TCommonsAlgorithmStateWithScore<StateT>[], orientation: ECommonsAlgorithmOrientation): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
10
|
+
computeOptimial(max: number): TCommonsAlgorithmStateWithScore<StateT> | undefined;
|
|
11
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class CommonsAlgorithmRandomRestartSearch {
|
|
2
|
+
orientation;
|
|
3
|
+
constructor(orientation) {
|
|
4
|
+
this.orientation = orientation;
|
|
5
|
+
}
|
|
6
|
+
computeOptimial(max) {
|
|
7
|
+
const optimals = [];
|
|
8
|
+
for (let i = max; i-- > 0;) {
|
|
9
|
+
const search = this.constructLocalSearch(this.orientation);
|
|
10
|
+
const initial = this.generateInitial();
|
|
11
|
+
const optimal = search.computeOptimial(initial);
|
|
12
|
+
optimals.push(optimal);
|
|
13
|
+
}
|
|
14
|
+
return this.choose(optimals, this.orientation);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=random-restart.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random-restart.mjs","sourceRoot":"","sources":["../../src/classes/random-restart.mts"],"names":[],"mappings":"AAMA,MAAM,OAAgB,mCAAmC;IAK9C;IADV,YACU,WAAyC;QAAzC,gBAAW,GAAX,WAAW,CAA8B;IAChD,CAAC;IAQG,eAAe,CAAC,GAAW;QACjC,MAAM,QAAQ,GAA8C,EAAE,CAAC;QAE/D,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;YAC5B,MAAM,MAAM,GAAY,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpE,MAAM,OAAO,GAAW,IAAI,CAAC,eAAe,EAAE,CAAC;YAE/C,MAAM,OAAO,GAA4C,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACzF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;CACD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { TCommonsAlgorithmSearchNode } from '../types/tsearch-node.mjs';
|
|
2
|
+
export type TCommonsAlgorithmInternalNode<ActionT, NodeT extends TCommonsAlgorithmSearchNode<ActionT>> = NodeT & {
|
|
3
|
+
parent: TCommonsAlgorithmInternalNode<ActionT, NodeT> | undefined;
|
|
4
|
+
};
|
|
5
|
+
export declare function commonsAlgorithmDeInternalise<ActionT, NodeT extends TCommonsAlgorithmSearchNode<ActionT>, InternalNodeT extends TCommonsAlgorithmInternalNode<ActionT, NodeT>>(node: InternalNodeT): NodeT;
|
|
6
|
+
export declare abstract class CommonsAlgorithmSearch<ActionT, NodeT extends TCommonsAlgorithmSearchNode<ActionT>> {
|
|
7
|
+
private actions;
|
|
8
|
+
private shuffle;
|
|
9
|
+
protected frontier: TCommonsAlgorithmInternalNode<ActionT, NodeT>[];
|
|
10
|
+
private explored;
|
|
11
|
+
constructor(actions: ActionT[], shuffle?: boolean);
|
|
12
|
+
protected abstract get next(): TCommonsAlgorithmInternalNode<ActionT, NodeT> | undefined;
|
|
13
|
+
protected abstract isEqual(a: Omit<NodeT, 'action'>, b: Omit<NodeT, 'action'>): boolean;
|
|
14
|
+
protected abstract isGoal(node: NodeT): boolean;
|
|
15
|
+
protected abstract applyActionIfPossible(node: NodeT, action: ActionT): NodeT | undefined;
|
|
16
|
+
private inArray;
|
|
17
|
+
private inFrontier;
|
|
18
|
+
private inExplored;
|
|
19
|
+
protected transition(node: TCommonsAlgorithmInternalNode<ActionT, NodeT>, action: ActionT): TCommonsAlgorithmInternalNode<ActionT, NodeT> | undefined;
|
|
20
|
+
protected transitions(node: TCommonsAlgorithmInternalNode<ActionT, NodeT>): TCommonsAlgorithmInternalNode<ActionT, NodeT>[];
|
|
21
|
+
computeRoute(start: Omit<NodeT, 'action'>, progressCallback?: (frontierLength: number, exploredLength: number) => void, progressBlockSize?: number): NodeT[] | undefined;
|
|
22
|
+
listExplored(): NodeT[];
|
|
23
|
+
}
|