Neale Pickett
·
2024-11-05
evolve.ml
1type sensor = (int * int * int * bool)
2
3type tank = (
4 string
5 * sensor
6 * sensor
7 * sensor
8 * sensor
9 * sensor
10 * sensor
11 * sensor
12 * sensor
13 * sensor
14 * sensor
15 * string list
16)
17
18let symbols = [
19 "~";
20 "!";
21 "+";
22 "-";
23 "*";
24 "/";
25 "%";
26 "&";
27 "|";
28 "^";
29 "<<";
30 ">>";
31 ">";
32 ">=";
33 "<";
34 "<=";
35 "=";
36 "<>";
37 "abs";
38 "dup";
39 "pop";
40 "exch";
41 "if";
42 "ifelse";
43 "mset";
44 "mget";
45 "{";
46 "}";
47 "fire-ready?";
48 "fire!";
49 "set-speed!";
50 "get-turret";
51 "set-turret!";
52 "sensor?";
53 "set-led!";
54 "random";
55]
56
57let make_nucleotide () =
58 Random.int ((List.length symbols) + 360 + 360)
59
60
61let rec make_dna = function
62 | 0 ->
63 []
64 | n ->
65 (make_nucleotide ()) :: (make_dna (n - 1))
66
67
68let rec program_of_dna = function
69 | [] ->
70 []
71 | i :: tl ->
72 let s =
73 try
74 List.nth symbols i
75 with
76 | Failure _
77 | Invalid_argument _ ->
78 string_of_int (i - (List.length symbols) - 360)
79 in
80 s :: (program_of_dna tl)
81
82let tank_of_dna d =
83 let color_of_dna = function
84 | r :: g :: b :: tl ->
85 (tl, (Format.sprintf "%02x%02x%02x"
86 ((abs r) mod 256)
87 ((abs g) mod 256)
88 ((abs b) mod 256)))
89 | tl ->
90 (tl, "cccccc")
91 in
92 let sensor_of_dna = function
93 | a :: b :: c :: d :: tl ->
94 (tl, (a, b, c, (d != 0)))
95 | tl ->
96 (tl, (0, 0, 0, false))
97 in
98 let d, color = color_of_dna d in
99 let d, s0 = sensor_of_dna d in
100 let d, s1 = sensor_of_dna d in
101 let d, s2 = sensor_of_dna d in
102 let d, s3 = sensor_of_dna d in
103 let d, s4 = sensor_of_dna d in
104 let d, s5 = sensor_of_dna d in
105 let d, s6 = sensor_of_dna d in
106 let d, s7 = sensor_of_dna d in
107 let d, s8 = sensor_of_dna d in
108 let d, s9 = sensor_of_dna d in
109 let p = program_of_dna d in
110 (color, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, p)
111
112
113let print_tank t =
114 let print_sensor (a, b, c, d) =
115 Format.printf "Sensor: %d %d %d %d\n" a b c (if d then 1 else 0)
116 in
117 match t with
118 | (color, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, p) ->
119 Format.printf "Color: #%s\n" color;
120 print_sensor s0;
121 print_sensor s1;
122 print_sensor s2;
123 print_sensor s3;
124 print_sensor s4;
125 print_sensor s5;
126 print_sensor s6;
127 print_sensor s7;
128 print_sensor s8;
129 print_sensor s9;
130 print_endline (String.concat " " p)
131
132let write_tank i t =
133 let fnprint fn str =
134 let filename = Format.sprintf "tank.%d/%s" i fn in
135 let chan = open_out filename in
136 output_string chan str;
137 close_out chan
138 in
139 let print_sensor n (a, b, c, d) =
140 fnprint
141 (Format.sprintf "sensor%d" n)
142 (Format.sprintf "Sensor: %d %d %d %d\n" a b c (if d then 1 else 0))
143 in
144 match t with
145 | (color, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, p) ->
146 fnprint "color" color;
147 print_sensor 0 s0;
148 print_sensor 1 s1;
149 print_sensor 2 s2;
150 print_sensor 3 s3;
151 print_sensor 4 s4;
152 print_sensor 5 s5;
153 print_sensor 6 s6;
154 print_sensor 7 s7;
155 print_sensor 8 s8;
156 print_sensor 9 s9;
157 fnprint "program" (String.concat " " p)
158
159let _ = Random.self_init ()
160
161let _ =
162 let dnas =
163 let t = Array.make 20 500 in
164 Array.map make_dna t
165 in
166 let tanks = Array.map tank_of_dna dnas in
167 Array.mapi write_tank tanks