Skip to content

Commit 31670d3

Browse files
✨ feat(knapsackApprox): First draft.
1 parent c573210 commit 31670d3

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
"url": "https://github.com/aureooms/js-knapsack/issues"
7878
},
7979
"dependencies": {
80+
"@aureooms/js-compare": "^1.4.8",
8081
"@aureooms/js-itertools": "^4.1.0"
8182
},
8283
"devDependencies": {

src/knapsackApprox.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import assert from 'assert';
2+
import {increasing} from '@aureooms/js-compare';
3+
import {max, map, filter, range} from '@aureooms/js-itertools';
4+
5+
import integerValuesKnapsack from './integerValuesKnapsack';
6+
7+
/**
8+
* (1-eps)-approx for the knapsack problem. Runs in O(N^3/eps) time.
9+
*
10+
* @param {Array} v Values.
11+
* @param {Array} w Weights.
12+
* @param {Array} n Size of the problem.
13+
* @param {Array} W Size of the knapsack.
14+
* @param {Array} eps Approximation constant.
15+
* @param {Number} P Any lower bound on OPT > 0.
16+
*/
17+
const knapsackApprox = (
18+
v,
19+
w,
20+
n,
21+
W,
22+
eps,
23+
P = max(
24+
increasing,
25+
map(
26+
(i) => v[i],
27+
filter((i) => w[i] <= W, range(n)),
28+
),
29+
),
30+
) => {
31+
assert(eps > 0 && eps < 1);
32+
assert(P > 0);
33+
assert(v.length === n);
34+
assert(w.length === n);
35+
const K = (eps * P) / n;
36+
const u = Uint32Array.from(v, (vi) => Math.floor(vi / K));
37+
// TODO reconstruct solution
38+
return K * integerValuesKnapsack(u, w, n, W);
39+
};
40+
41+
export default knapsackApprox;

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
dependencies:
1010
"@aureooms/js-error" "^4.0.1"
1111

12+
"@aureooms/js-compare@^1.4.8":
13+
version "1.4.8"
14+
resolved "https://registry.yarnpkg.com/@aureooms/js-compare/-/js-compare-1.4.8.tgz#c6bff1091f4a2e211f449299572d9f195146fc59"
15+
integrity sha512-Z26PU6OmuhS7ZJsELTKImmipF7J+KCOyN70wBhhVIhmqUhXY6C3JpJHAev6wNBkC4ThlQt3zO6p/OmBFIq76Qg==
16+
1217
"@aureooms/js-error@^4.0.1":
1318
version "4.0.1"
1419
resolved "https://registry.yarnpkg.com/@aureooms/js-error/-/js-error-4.0.1.tgz#be2740b3f31a337e0828930c9b70d38113b4dd77"

0 commit comments

Comments
 (0)