ga.c is not related to gopher clustering. - brcon2024-hackathons - Bitreichcon 2024 Hackathons
(HTM) 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
(HTM) 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);
-}