size_t karmed_choose_best(struct karmed *p) { size_t head, i, j, best; double mean, max; if (p->k == 1) return 0; /* * Bootstrap: choose the first lever that has not yet * been tested. */ for (i = 0; i < p->k; i++) { if (p->arms[i].effort == 0) return i; } /* * Exploration: choose a random lever. */ best = randinterval(0, p->k - 1); /* * Exploitation: choose the lever with the greatest * expectation of reward. */ if (rand01() >= BANDIT_E_GREEDY) { head = best; max = 0; for (j = 0; j < p->k; j++) { i = (head + j) % p->k; mean = p->arms[i].reward / p->arms[i].effort; if (max < mean) { best = i; max = mean; } } } return best; }
int main() { srand(1234); val_t* xs = malloc(n * sizeof(val_t)); if (xs == NULL) { fprintf(stderr, "Cannot allocate %zu bytes", n * sizeof(val_t)); return 1; } size_t i; for (i = 0; i < n; ++i) { xs[i] = randval(); } vector_t* vec = vector_create(xs, n); if (vec == NULL) { fprintf(stderr, "Failed to create vector."); return 1; } idx_t u, v; for (i = 0; i < m; ++i) { randinterval(n, &u, &v); val_t true_sum = dense_sum(xs, u, v); val_t sparse_sum = vector_sum(vec, u, v); if (true_sum != sparse_sum) { fprintf(stderr, "Incorrect sum.\n"); return 1; } } vector_free(vec); free(xs); return 0; }