From c6d9dcaa37fee5e0789275e1b0875bbd42a6cc28 Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Mon, 10 Mar 2025 11:58:45 +0300 Subject: [PATCH 1/2] removed __pycache__ --- .gitignore | 1 + __pycache__/gameobjects.cpython-311.pyc | Bin 4417 -> 0 bytes genetic_alg.py | 0 3 files changed, 1 insertion(+) create mode 100644 .gitignore delete mode 100644 __pycache__/gameobjects.cpython-311.pyc create mode 100644 genetic_alg.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba0430d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ \ No newline at end of file diff --git a/__pycache__/gameobjects.cpython-311.pyc b/__pycache__/gameobjects.cpython-311.pyc deleted file mode 100644 index bcafb15660d2aef960d5450ebf933ac296c50bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4417 zcmd57fK6rNr0+G~>#0^UGO3!(f(PG~|>K!gI~Cn|p;l%^GmIwA{6b==qzBij)udz#skgATe z-_E}G=I_04-b{XMYzz=6-~9R8$g)VtANXMx_-1822d_Dz5|vAm2;s>^qVo5M>RI3k zc?^$LA{^5Qpb<50!2>#YHgr7Gc|qr^(Rr9o0-e7`C#c*Y2?w5HHv{pF-q_0?cl{K6 z&Jm47IF&?rm5X@b5mZ0Sk&B3`=N^f8RhU)8r;31*3bTm#RUcqLm9Td+a4|NnUB5M^ z#WNK9jSH@ku#O8^{{>)p8*lT(xrbl4urkEIyjcBHjOvhAH z8qqQe1z(r~!v-C`C(?Q%lSrq+f+^@)a@Y*8Cdx!CGiq{ECO56)wA!G&xEenh{Y2NO z9@WMZ$=>Mol-5rZceH4~rr(CaqZiU@A~g~n%uK4&(Sges@KHXbX$(LVCzNKf(7Pt4 zO-WG_sYFImvO6kK>avBne0>mLhWsw?eh@9ohl=u{eAbYAOLFh5a6hmb-1Xo}IoMtd zwl6m?_biKrV7n1KUJ4!ut$$T&C`+wHsdawe{0&3eTaxw`?7wyNY1|!HhYBBnW{%{z zJet&$9I1pB>P`=JL&6P&J*IFgnaEH-^h6r~!aUsyFVm+_(&1QK)3J-THo6^!f=Xj| zvrR5%pa9$IZ2&W5RciXS;p>L)K7J6%2Y+Zaq|TDmS+M_T5RBq(!eN~e{3MVQR|Rth zkyY{zVQmS%7vOp92vjb+g^(;{68CBqXAGdDyGQh5O?j;z9kRdK9RG1+nGaSD4`AWc7Rqq_+;GsUjRVJTXxPLc-T=6brnNhM(9W>bY!{52pu(Ajv~wNZ*dH|i=l2K)Kd!e zET1z%$BdR^8wSnWkuYUBT$ICx+*y)4AH@v0+i30v1Mljq)wAANZ!NLVJ&ahxPyu3* zJiKcQki&6&WwYeCESOg5T!cbhz3oI>KoJ(0<0@`c$xkTjivPAG#xiZJswMH zR`x*86GmGM;$o7Kiwb)k3{y0Rj# z+*#Rb$QMiUMc`>wwh#W)vLZb3E;q4^f3_4ni&US5pA{Y_FGJ6`G)C1uEC+7tkaxKp z9O{IkzWWzopi1Thl0z`6S~}fuG>H*NxiwuKePk5~W#~@V0qR6Q_#{;ByH@PGX7pVz z^<6J~bkpd&Ss41XG!!onrHVr-V`!o@G*Qr}jG?K*iD^U5mgMXvi827kF>-}LcnjW0 zQgBC66f>YG<7ssgrm2_>it^cHENN+6TVMyaY(>CiPWK_SBZL7K38SKw>~XtN1RPBN z9AL)ztxEoxa}3sakJz?GszKt!!)wF=K@g9u5eEXCcm}l_An@WjZjHFm>#DoutZvN^ z=M{&?DfaGJ-vgpAA*I;wh8K$=$L**i6>*at|&Ur z2M*r087mstD7%$S+qrEbz1I%{`~_T;8o%=0_m!nxMQPW3D1YM-XGk3-siR>3F~`BU z9ngSwA{<7*j?Ko6apPJtsVIvaJql7C9dOnfz8g&ucEhuN0szLee``D^c49-hCg12z#;8 zhro}F(&?S8^KXUfBYpq? diff --git a/genetic_alg.py b/genetic_alg.py new file mode 100644 index 0000000..e69de29 From 1dac1cb6654bf227ed45acad57d42e4470e6cf1f Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Mon, 10 Mar 2025 19:08:35 +0300 Subject: [PATCH 2/2] add: demo genetic algorithm --- genetic_alg.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/genetic_alg.py b/genetic_alg.py index e69de29..59993d9 100644 --- a/genetic_alg.py +++ b/genetic_alg.py @@ -0,0 +1,60 @@ +import torch +import torch.nn as nn +import numpy as np + +class NeuralNetwork(nn.Module): + def __init__(self): + super(NeuralNetwork, self).__init__() + self.hidden = nn.Linear(5, 10) + self.output = nn.Linear(10, 3) + + def forward(self, x): + x = torch.relu(self.hidden(x)) + x = self.output(x) + return torch.log_softmax(x) + +class GeneticAlgorithm: + def __init__(self, populationSize: int, mutationRate: float, percentageBest): + self.populationSize = populationSize + self.mutationRate = mutationRate + self.percentageBest = percentageBest + self.initialize_population() + + def initialize_population(self): + self.population = [NeuralNetwork() for _ in range(self.populationSize)] + + def crossover(self, parent1: NeuralNetwork, parent2: NeuralNetwork): + child1 = NeuralNetwork() + child2 = NeuralNetwork() + point = len(child1.hidden.weight.data) // 2 + print([x for x in child1.parameters()]) + child1.hidden.weight.data = torch.cat((parent1.hidden.weight.data[:point], parent2.hidden.weight.data[point:]), dim=0) + child2.hidden.weight.data = torch.cat((parent2.hidden.weight.data[:point], parent1.hidden.weight.data[point:]), dim=0) + child1.output.weight.data = parent1.output.weight.data.clone().detach() + child2.output.weight.data = parent2.output.weight.data.clone().detach() + return child1, child2 + + # Mutation operator: Random mutation + def mutate(self, model: NeuralNetwork): + for param in model.parameters(): + if torch.rand(1).item() < self.mutationRate: + param.data += torch.randn_like(param.data) * 0.1 + return model + + def learn(self, fitness: list): + self.population = [self.population[x] for x in np.argsort(fitness)] + numBest = int(self.populationSize * self.percentageBest) + self.population = self.population[:numBest] + while len(self.population) < self.populationSize: + parent1, parent2 = np.random.choice(self.population), np.random.choice(self.population) + child1, child2 = self.crossover(parent1, parent2) + child1 = self.mutate(child1) + child2 = self.mutate(child2) + self.population.extend([child1, child2]) + while len(self.population) > self.populationSize: self.population.pop() + + def predict(self, data: list): + result = [] + for i in range(self.populationSize): + result.append(self.population[i](data[i])) + return result \ No newline at end of file