summaryrefslogtreecommitdiffstats
path: root/src/random_heuristic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/random_heuristic.c')
-rw-r--r--src/random_heuristic.c66
1 files changed, 32 insertions, 34 deletions
diff --git a/src/random_heuristic.c b/src/random_heuristic.c
index 0076728..529a186 100644
--- a/src/random_heuristic.c
+++ b/src/random_heuristic.c
@@ -9,12 +9,13 @@ struct front_item * random_heuristic(struct data * data) {
struct front_item * front_last = front;
struct tree_item * tree = new_tree_item(0, 0, 0, 0, NULL, NULL);
long int tree_size = 1;
+
+ /* Choose tree node randomly */
+ long int position = rand() % tree_size;
+ struct tree_item * node = tree;
+ for(int i = 0; i < position; i++,node=node->next);
do {
- /* Choose tree node randomly */
- long int position = rand() % tree_size;
- struct tree_item * node = tree;
- for(int i = 0; i < position; i++,node=node->next);
/* Check if node is leaf */
if(node->depth == data->N) {
@@ -35,6 +36,13 @@ struct front_item * random_heuristic(struct data * data) {
free(old);
/* Reduce tree_size */
tree_size--;
+
+ if(tree != NULL) {
+ /* Select new random node */
+ position = rand() % tree_size;
+ node = tree;
+ for(int i = 0; i < position; i++,node=node->next);
+ }
continue;
}
@@ -73,6 +81,13 @@ struct front_item * random_heuristic(struct data * data) {
tree = left;
}
free(old);
+
+ /* Choose left or right randomly for node */
+ if(rand() % 2 == 0) {
+ node = left;
+ } else {
+ node = right;
+ }
/* Increment tree_size */
tree_size++;
@@ -87,8 +102,6 @@ struct front_item * random_heuristic(struct data * data) {
}
struct online_return random_heuristic_online(struct data * data, struct front_item * front, struct tree_item * tree) {
-
-
if(front == NULL) {
front = new_front_item(0, 0, NULL, NULL);
}
@@ -100,7 +113,7 @@ struct online_return random_heuristic_online(struct data * data, struct front_it
}
long int tree_size = 0;
for(struct tree_item * tree_node = tree; tree_node != NULL; tree_node = tree_node->next, tree_size++);
-
+
/* Choose tree node randomly */
long int position = rand() % tree_size;
struct tree_item * node = tree;
@@ -112,18 +125,12 @@ struct online_return random_heuristic_online(struct data * data, struct front_it
front_last->next = new_front_item(node->values.p, node->values.w, front_last, NULL);
front_last = front_last->next;
- struct tree_item * old = node;
- if(tree == old) {
- tree = node->next;
- }
+ if(node->prev != NULL) node->prev->next = node->next;
+ if(node->next != NULL) node->next->prev = node->prev;
+
+ if(tree == node) tree = node->next;
+ free(node);
- if(node->next != NULL) {
- node->next->prev = node->prev;
- }
- if(node->prev != NULL) {
- node->prev->next = node->next;
- }
- free(old);
/* Reduce tree_size */
tree_size--;
@@ -146,9 +153,6 @@ struct online_return random_heuristic_online(struct data * data, struct front_it
node->prev,
node
);
- if(node->prev != NULL){
- node->prev->next = left;
- }
/* Make right node (do not select item) */
struct tree_item * right = new_tree_item(
@@ -159,28 +163,22 @@ struct online_return random_heuristic_online(struct data * data, struct front_it
left,
node->next
);
- if(node->next != NULL) {
- node->next->prev = right;
- }
/* Adjust left->next to right */
left->next = right;
- struct tree_item * old = node;
- if(node == tree) {
- tree = left;
- }
- free(old);
+ if(node->prev != NULL) node->prev->next = left;
+ if(node->next != NULL) node->next->prev = right;
+
+ if(tree == node) tree = left;
+ free(node);
/* Choose left or right randomly for node */
- if(rand() % 2 == 0) {
- node = left;
- } else {
- node = right;
- }
+ node = rand() % 2 == 0 ? left : right;
/* Increment tree_size */
tree_size++;
+
} while(tree != NULL);
struct online_return ret;