diff options
author | jacopo grandi <jak.sk8@hotmail.it> | 2021-03-04 12:40:52 +0100 |
---|---|---|
committer | jacopo grandi <jak.sk8@hotmail.it> | 2021-03-04 12:40:52 +0100 |
commit | 02e55b0647eb5c631e7d7669a13fd0d47ec26c15 (patch) | |
tree | 35a3017c62aeeec101af8ac43d0b5a22691c637e /gst/generate.c | |
parent | b0396bf70211adaad17ae0e2cf6e851b1467ae00 (diff) |
morning fixes and bruteforce unit generation
Diffstat (limited to 'gst/generate.c')
-rw-r--r-- | gst/generate.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/gst/generate.c b/gst/generate.c new file mode 100644 index 0000000..1d8a340 --- /dev/null +++ b/gst/generate.c @@ -0,0 +1,70 @@ +#include <stdlib.h> +#include <stdio.h> +#include <time.h> +#include <string.h> + +#include "generate.h" + +void generate_init () { + srand(time(NULL)); +} + +float calc_unit_cost (infos *info, info_unit *u) { + stats_unit base; + stats_unit_compute(info, u, &base); + return stats_compute_cost(&info->cost_weights, &base); +} + +int accept_cond (infos *info, info_unit *u, float cost_max) { + stats_unit base; + stats_unit_compute(info, u, &base); + float cost = stats_compute_cost(&info->cost_weights, &base); + if (base.frame.weight > base.frame.weight_max) return 0; + if (cost > cost_max) return 0; + return 1; +} + +// generates randomly a valid unit +void gen_unit_attempt (infos *info, info_unit *u, float cost_max) { + info_unit_init(u); + stats_unit base; + u->chassis = rand() % info->statslen[STATS_CHASSIS]; + u->battery = rand() % info->statslen[STATS_BATTERY]; + u->brain = rand() % info->statslen[STATS_BRAIN]; + stats_unit_compute(info, u, &base); + for (int i=0; i<base.frame.slot_weapon; i++) { + u->weapons[i] = rand() % info->statslen[STATS_WEAPONS]; + if (!accept_cond(info, u, cost_max)) { u->weapons[i] = -1; return; } + } + for (int i=0; i<base.frame.slot_armor; i++) { + u->armor[i] = rand() % info->statslen[STATS_ARMOR]; + if (!accept_cond(info, u, cost_max)) { u->armor[i] = -1; return; } + } + for (int i=0; i<base.frame.slot_aug; i++) { + u->augs[i] = rand() % info->statslen[STATS_AUGS]; + if (!accept_cond(info, u, cost_max)) { u->augs[i] = -1; return; } + } +} + +// selects the max cost generated unit +int generate_unit (infos *info, info_unit *u, float cost_max) { + info_unit cand = *u; + info_unit candmax; info_unit_init(&candmax); + float cost; + for (int i=0; i<GENERATE_UNIT_MAX_ATTEMPTS; i++) { + cand = *u; + gen_unit_attempt(info, &cand, cost_max); + if (accept_cond(info, &cand, cost_max)) { + if (calc_unit_cost(info, &cand) + > calc_unit_cost(info, &candmax)) { + candmax = cand; + printf("found: %f\n", calc_unit_cost(info, &cand)); + } + } + } + if (candmax.chassis != -1) { + *u = candmax; + return 0; + } + else return 1; +}
\ No newline at end of file |