ga.c is not related to gopher clustering. - brcon2024-hackathons - Bitreichcon 2024 Hackathons HTML git clone git://bitreich.org/brcon2024-hackathons git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/brcon2024-hackathons DIR Log DIR Files DIR Refs DIR Tags DIR Submodules --- DIR commit 9cb289429418cc40ef9018ce164351cbd0581530 DIR parent 7227ea069b87678e2804e054e2f49960b4b61145 HTML Author: Christoph Lohmann <20h@r-36.net> Date: Sun, 4 Aug 2024 08:36:30 +0200 ga.c is not related to gopher clustering. Diffstat: D gopher/gopher-clustering/ga.c | 206 ------------------------------- 1 file changed, 0 insertions(+), 206 deletions(-) --- DIR diff --git a/gopher/gopher-clustering/ga.c b/gopher/gopher-clustering/ga.c @@ -1,206 +0,0 @@ -#include <stdint.h> -#include <stdio.h> -#include <stddef.h> -#include <stdlib.h> -#include <string.h> - -struct machine { - uint8_t a; - - uint8_t loads; - uint8_t adds; - uint8_t subs; - uint8_t times; - uint8_t noops; - - uint8_t instr; -}; - -enum { - LOAD, - ADD, - SUB, - TIMES, - END, -}; - -#define CODE_LENGTH 16 -#define POOL_LENGTH 16 -struct genome { - uint8_t code[CODE_LENGTH + 1]; /* +1 sentinal (0) */ - uint16_t fitness; -} pool[POOL_LENGTH]; - -uint8_t newcode[CODE_LENGTH]; - -void -execute(struct machine *m, size_t l, uint8_t code[]) -{ - size_t ip; - int16_t c; - - for (ip = 0; ip < l;) { - switch (code[ip++] & 0x7) { - case LOAD: - m->loads++; - m->a = code[ip++]; - break; - case ADD: - m->adds++; - c = (int16_t)m->a + code[ip++]; - if (c > 255) - m->a = 0; - else - m->a = c; - break; - case SUB: - m->subs++; - c = (int16_t)m->a - code[ip++]; - if (c < 0) - m->a = 0; - else - m->a = c; - break; - case TIMES: - m->times++; - m->a = (uint16_t)m->a * code[ip++] / 255; - break; - case END: - m->instr++; - return; - break; - default: - m->noops++; - break; - } - m->instr++; - } -} - -void -mutate(uint8_t code[], size_t l) -{ - uint8_t i, bi, j; - - for (j = 0; j < 4; j++) { - if (rand() % 100 >= 50) - continue; - - i = rand() % CODE_LENGTH; - bi = rand() % 8; - - code[i] ^= 1 << bi; - } -} - -#define min(a, b) (((a) < (b)) ? (a) : (b)) - -void -cross(uint8_t a[], size_t al, uint8_t b[], size_t bl, uint8_t c[], size_t cl) -{ - uint8_t i, si, sl; - uint8_t *one, *two; - - if (rand() % 2) { - one = a; - two = b; - } else { - one = b; - two = a; - } - - si = rand() % (min(al, bl) + 1); - sl = rand() % (min(al, bl) - si + 1); - - for (i = 0; i < si; i++) - c[i] = one[i]; - - for (; i < si + sl; i++) - c[i] = two[i]; - - for (; i < cl; i++) - c[i] = one[i]; -} - -void -cross2(uint8_t a[], size_t al, uint8_t b[], size_t bl, uint8_t c[], size_t cl) -{ - uint8_t i; - - for (i = 0; i < al; i++) - c[i] = a[i] + b[i]; -} - -void -printcode(uint8_t code[], size_t l) -{ - uint8_t i; - - for (i = 0; i < l;) { - switch (code[i++] & 0x7) { - case LOAD: - printf("LOAD %d ", code[i++]); - break; - case ADD: - printf("ADD %d ", code[i++]); - break; - case SUB: - printf("SUB %d ", code[i++]); - break; - case TIMES: - printf("TIMES %d ", code[i++]); - break; - case END: - printf("END "); - return; - break; - default: - printf("NOOP "); - break; - } - } -} - -int -main(void) -{ - struct machine m; - struct genome *g1, *g2, *w1; - size_t i, j; - - for (i = 0; i < POOL_LENGTH; i++) { - for (j = 0; j < CODE_LENGTH; j++) - pool[i].code[j] = rand(); - pool[i].code[j] = 0; - } - - do { - g1 = g2 = w1 = NULL; - - for (i = 0; i < POOL_LENGTH; i++) { - memset(&m, 0, sizeof(m)); - - execute(&m, CODE_LENGTH, pool[i].code); - pool[i].fitness = m.a * 255 / (m.instr + m.loads); - - if (!g1 || g1->fitness < pool[i].fitness) { - g2 = g1; - g1 = &pool[i]; - } else if (!g2 || g2->fitness < pool[i].fitness) { - w1 = g2; - g2 = &pool[i]; - } else if (!w1 || w1->fitness > pool[i].fitness) { - w1 = &pool[i]; - } - } - - printf("g1->fitness = %d, g2->fitness = %d, w1->fitness = %d\n", g1->fitness, g2->fitness, w1->fitness); - cross(g1->code, CODE_LENGTH, g2->code, CODE_LENGTH, newcode, CODE_LENGTH); - mutate(newcode, CODE_LENGTH); - - printcode(newcode, CODE_LENGTH); - puts(""); - - memcpy(w1->code, newcode, CODE_LENGTH); - } while (1); -}