62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
const DEFAULT_EPSILON = 0.01;
|
|
|
|
function create_key(steps) {
|
|
return steps.join('');
|
|
}
|
|
|
|
export default class Daemon {
|
|
humanCount;
|
|
robotCount;
|
|
epsilon;
|
|
weights = {};
|
|
|
|
constructor(humanCount, robotCount, epsilon = DEFAULT_EPSILON) {
|
|
this.humanCount = humanCount;
|
|
this.robotCount = robotCount;
|
|
this.epsilon = epsilon;
|
|
}
|
|
|
|
predict(journal) {
|
|
const steps = this._getStepSlice(journal);
|
|
const w0 = this._getWeight([...steps, 0]);
|
|
const w1 = this._getWeight([...steps, 1]);
|
|
|
|
if (w1 > w0) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
adjust(movements, humanValue, stepNumber) {
|
|
const steps = this._getStepSlice(movements);
|
|
const weightAdjustment = this._getWeightAdjustment(stepNumber);
|
|
this._adjustWeight([...steps, humanValue], weightAdjustment);
|
|
}
|
|
|
|
_getStepSlice(movements) {
|
|
return movements.getLastMovements(this.humanCount, this.robotCount);
|
|
}
|
|
|
|
_getWeightAdjustment(stepNumber) {
|
|
return Math.pow(1 + this.epsilon, stepNumber);
|
|
}
|
|
|
|
_getWeight(steps) {
|
|
const key = create_key(steps);
|
|
const weight = this.weights[key];
|
|
return weight === undefined ? 0 : weight;
|
|
}
|
|
|
|
_setWeight(steps, value) {
|
|
const key = create_key(steps);
|
|
this.weights[key] = value;
|
|
}
|
|
|
|
_adjustWeight(steps, weight) {
|
|
const currentWeight = this._getWeight(steps);
|
|
const newWeight = currentWeight + weight;
|
|
this._setWeight(steps, newWeight);
|
|
}
|
|
}
|