added a brain, need to listen to it
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -11,4 +11,4 @@ pyvenv.cfg
|
|||||||
dump.rdb
|
dump.rdb
|
||||||
kivy/.buildozer/
|
kivy/.buildozer/
|
||||||
.vscode
|
.vscode
|
||||||
|
pybrain/
|
||||||
2
Pipfile
2
Pipfile
@@ -10,6 +10,8 @@ ipdb = "*"
|
|||||||
|
|
||||||
[packages]
|
[packages]
|
||||||
pygame = "*"
|
pygame = "*"
|
||||||
|
deap = "*"
|
||||||
|
numpy = "*"
|
||||||
|
|
||||||
[requires]
|
[requires]
|
||||||
python_version = "3.7"
|
python_version = "3.7"
|
||||||
|
|||||||
146
Pipfile.lock
generated
146
Pipfile.lock
generated
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"hash": {
|
"hash": {
|
||||||
"sha256": "9e729783b1676a1f7c9e39d75fab1737d322566c636815580677a93a1d9cd02e"
|
"sha256": "4264f0b1967f21ebf488bb5f545bb64df6d48c34efac23b2f8ff215e4c04e2bd"
|
||||||
},
|
},
|
||||||
"pipfile-spec": 6,
|
"pipfile-spec": 6,
|
||||||
"requires": {
|
"requires": {
|
||||||
@@ -16,33 +16,90 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"default": {
|
"default": {
|
||||||
"pygame": {
|
"deap": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:0dc21c1463189362423cbb3a5adf405db1b7560e865a1d5e4c37ca94ca72ba41",
|
"sha256:01ab6067af3c86bd3a00a0d5e0c9860220c7cf412031f9cce18a6d08ec25b808",
|
||||||
"sha256:1065beaa4915e0f27cea65fbe4dbef480b7ecd15662c7642e93a61167d48db34",
|
"sha256:0dc11a5521f661a7c7f475466d932b056fbfee8447ad73b007d69ef75c924355",
|
||||||
"sha256:120ad1260fd9df40e1d973913e3e62df275bc418c3f81c0afbe8cf0a13b43023",
|
"sha256:11162ae0343a25f5a8625f683ce16bad5757812d71db6b80a5ac7c25799a1a88",
|
||||||
"sha256:15619768b80ed73dc77818b4eae6bae0d23d6bc7129705dcde84af9e1859d26d",
|
"sha256:1873f5e2a55ff61dac965b55cc042b2fe5529edbd54fc0fc1061664ddb4b75db",
|
||||||
"sha256:1e3a02037aecf5f651bc792c1f5ff19989949c6823a466b5a82fe77bbfa53148",
|
"sha256:19f6a60c91313cb1f39a9687bc54efab8abc599e5f81b87faedf583efc388602",
|
||||||
"sha256:30e4f917e7b3641ac6b5209963a105e674155cd98e17e3f0472bb4f044e78720",
|
"sha256:21787af1e4a56345bbffa6d1b07f5611d3ef7b299e5e832e6ab28dbab5c5c10e",
|
||||||
"sha256:4eb7724e07b0b8ecd3d21d4f9e0ca54332ea6c90c5ebfed2e8ec8558b1958c3b",
|
"sha256:2f50f38ae0c82554a476d6c6013c85da4a8d7cac102edc4ec460a658200bd832",
|
||||||
"sha256:5b2b7325a4e77076ee6342dafac7ba7b75c48b05a25b5d102b37c93cf15e8f59",
|
"sha256:31ed6220068e703d3f54c53046b8f25b85a9225c64e1e50172c2172c4bd8a7fe",
|
||||||
"sha256:6935f5a3ba3c7bd94b043e13f6d4d229ba97ec3d2e22829e3c38be6a5b9d8aa8",
|
"sha256:34594ba2f417ccb622b0ff54c25850fde80e12ca89fde6f242b15029e846be29",
|
||||||
"sha256:7c962ba83c413fea20ad1ff8a4989396f0194d744d33b38e85b50e416b82911d",
|
"sha256:3603c91779c276588884321637212511962b2f0668cec56b2b5664d28f28eee7",
|
||||||
"sha256:7da134fc9c17b3d0ac3100d1bb46139913a6e9b7c52fabdbde6fe9be1f612c35",
|
"sha256:5ee3cee4eac683237915bf570ede65047224ac6f392970fed029e3404935647c",
|
||||||
"sha256:81fbe388f6748b9f6989287dcc2b2fccb0b87c5119b066640b9a4ba649637ae9",
|
"sha256:600e95e745cee25fda8c9a67219c9f46c4661da636a5af9f5e924230e7a3aeac",
|
||||||
"sha256:b74e67d0af10ee6563cedcabc6ec48f5f342bd01e26f5f478727703df613e698",
|
"sha256:6102d8bca425ff5d704f7631b69c22e33782e33020ce059cc88085746444ebfe",
|
||||||
"sha256:b8691d839217fc1cd1d433c153869111e8c0e1eddbf17e2a5808635c571b8391",
|
"sha256:669840720da9c4571efd9d0efdf90267009686b7a4c43dd4ab124e33e9cc153a",
|
||||||
"sha256:b93c3af698b0e7e017d73c622ace80df9166b803723414b419bb2745982a1fe2",
|
"sha256:6c5ef3b6c387cd28c7aab0297b05a9994b9c88dfd8a89236866c14703d55f9dc",
|
||||||
"sha256:b9f5a25c9886d0b58b4dadfd99819a219128a355e659a6d1a27c226631656746",
|
"sha256:a0a0e56bd52a262ee12f84fa883b7ec5367532b784e2a6e83b1f7126b69d2300",
|
||||||
"sha256:c6714c859e5652e04a94645bb495b61b6ec00d9f1b7b976ea952261581b196c3",
|
"sha256:a1cc5fc4a2735ec5560ddef84f80beb84540d3221a147b53bba5e6a8718c8a55",
|
||||||
"sha256:d15e18591093f717844482b24846e42394f302f3c2d1ff02b649f9c297802576",
|
"sha256:b05f607041c3f8aac5364055cb9632714bc62fe93e53283fbafea9ba91e13a69",
|
||||||
"sha256:ddca4355896f9c6343b4273e1e9bc7e5987aa484f4973a3a3fd29aaa8678d8a7",
|
"sha256:cd0fd7bccf7837b9e6a666b75e1c3a629fa3f5bc346cb90a9edd8cd56f085980",
|
||||||
"sha256:ea3660b2a43d0e299ae3a86f7a5a67334417c10869e754263896c71b048ee114",
|
"sha256:cf1e53c822526bbc418333c47f668f394b00b51fddb4f15c54d5f190b2b88f17",
|
||||||
"sha256:f46eb0b6561a4b283ab8afc2a75523d4bdb7a809eaf696d66926646dbddde43c",
|
"sha256:e648e1d76d5c8ecbce7f312bd174e4d2613debddd81f2a614b9023f7ad0331a0",
|
||||||
"sha256:f4f81dd9086c7a948880f2454f2de0ea3ad78a7616423355d40738ba3366c159"
|
"sha256:f146a9a0957510b57a2b5c669a26f0b84b2d219000b5684f4827884a75ad2ea7",
|
||||||
|
"sha256:f1a0d1390e0b4f9edd4cbf2903c7d60865f43bad00de239aa066ffeda4ad7ee0",
|
||||||
|
"sha256:fe789aa74ba78549030037dc9580510ff1763ef12fdf05cb92dda74237110565"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==2.0.0.dev3"
|
"version": "==1.3.0"
|
||||||
|
},
|
||||||
|
"numpy": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:0b0dd8f47fb177d00fa6ef2d58783c4f41ad3126b139c91dd2f7c4b3fdf5e9a5",
|
||||||
|
"sha256:25ffe71f96878e1da7e014467e19e7db90ae7d4e12affbc73101bcf61785214e",
|
||||||
|
"sha256:26efd7f7d755e6ca966a5c0ac5a930a87dbbaab1c51716ac26a38f42ecc9bc4b",
|
||||||
|
"sha256:28b1180c758abf34a5c3fea76fcee66a87def1656724c42bb14a6f9717a5bdf7",
|
||||||
|
"sha256:2e418f0a59473dac424f888dd57e85f77502a593b207809211c76e5396ae4f5c",
|
||||||
|
"sha256:30c84e3a62cfcb9e3066f25226e131451312a044f1fe2040e69ce792cb7de418",
|
||||||
|
"sha256:4650d94bb9c947151737ee022b934b7d9a845a7c76e476f3e460f09a0c8c6f39",
|
||||||
|
"sha256:4dd830a11e8724c9c9379feed1d1be43113f8bcce55f47ea7186d3946769ce26",
|
||||||
|
"sha256:4f2a2b279efde194877aff1f76cf61c68e840db242a5c7169f1ff0fd59a2b1e2",
|
||||||
|
"sha256:62d22566b3e3428dfc9ec972014c38ed9a4db4f8969c78f5414012ccd80a149e",
|
||||||
|
"sha256:669795516d62f38845c7033679c648903200980d68935baaa17ac5c7ae03ae0c",
|
||||||
|
"sha256:75fcd60d682db3e1f8fbe2b8b0c6761937ad56d01c1dc73edf4ef2748d5b6bc4",
|
||||||
|
"sha256:9395b0a41e8b7e9a284e3be7060db9d14ad80273841c952c83a5afc241d2bd98",
|
||||||
|
"sha256:9e37c35fc4e9410093b04a77d11a34c64bf658565e30df7cbe882056088a91c1",
|
||||||
|
"sha256:a0678793096205a4d784bd99f32803ba8100f639cf3b932dc63b21621390ea7e",
|
||||||
|
"sha256:b46554ad4dafb2927f88de5a1d207398c5385edbb5c84d30b3ef187c4a3894d8",
|
||||||
|
"sha256:c867eeccd934920a800f65c6068acdd6b87e80d45cd8c8beefff783b23cdc462",
|
||||||
|
"sha256:dd0667f5be56fb1b570154c2c0516a528e02d50da121bbbb2cbb0b6f87f59bc2",
|
||||||
|
"sha256:de2b1c20494bdf47f0160bd88ed05f5e48ae5dc336b8de7cfade71abcc95c0b9",
|
||||||
|
"sha256:f1df7b2b7740dd777571c732f98adb5aad5450aee32772f1b39249c8a50386f6",
|
||||||
|
"sha256:ffca69e29079f7880c5392bf675eb8b4146479d976ae1924d01cd92b04cccbcc"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.17.3"
|
||||||
|
},
|
||||||
|
"pygame": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:17571a285e62429f5d46129862ae8a9b8dbf9541b66582d4f60a343618c0be73",
|
||||||
|
"sha256:1a341c6a73f0c7f57cd3d24e58ed015f0d4b77c84c7a048556ce708a32230eb6",
|
||||||
|
"sha256:3c3ac1f9903685b280236e7cb00acc7c151895430a8601ee29e40a8f2e25690d",
|
||||||
|
"sha256:3dda7d954c92a0f8c042c4f414416bd910045b4ed6390d8b90c8013db5e80efc",
|
||||||
|
"sha256:4271455547d41c59598aa40f425939cec1d158dccce1588e8657e36a073ba6ad",
|
||||||
|
"sha256:44cf6483466e739a04b8fef4308db040c33a9e97bd3f75835fd13c52c55ef2ef",
|
||||||
|
"sha256:5f77076c1991d7d5ff14da860fbc0251d357c140737f7e6e6c20249dc70501c2",
|
||||||
|
"sha256:814cb86c7b7ebe595fe1df867e48b0baefc58cb6d6f7dc76a8627817df827a35",
|
||||||
|
"sha256:8bfcb0f72606d37cc54f3f90302df24159850cf96c176fd959b52f72475382df",
|
||||||
|
"sha256:8ea02d61fe40b5d3feb9db186eecc925c426e889338bc2aed2996b4698f46400",
|
||||||
|
"sha256:935b1993fd1bf1543618df3891fb5c36be310a5a8415cb080721bd5762827bd2",
|
||||||
|
"sha256:96c8d5b99eb1bf321099d62d970622002aa170e6ceb3da652f60c2e82e78e2a1",
|
||||||
|
"sha256:a269db0c3876b5386497d4187246eaac0e5ccb5d97ca289965125dbe2ba94498",
|
||||||
|
"sha256:ade1ccc06f3ec07567eceac5407df8606233a34a6181c2889b0e8afa057b1515",
|
||||||
|
"sha256:aef37d5b7c92de8e3d3cb1beb154e5b825e447d1271b38bf4fbcab4ddf0afe4c",
|
||||||
|
"sha256:b12692160af44d1652e04d23ef1fa5864dd9463067753c7602b3268f135fd40d",
|
||||||
|
"sha256:cc0ff3eda290b24a2241d5c797a388b0c1e5240ebd1b6a3d67c1bc297ecb01bb",
|
||||||
|
"sha256:d1fd7189191998e30029c449174c5d33820f79cf2483571a2e53ee45074755c9",
|
||||||
|
"sha256:d26939cda57ba71da9e74f06effb5ed22de9fd1f7c130e143341cb43610f1bb3",
|
||||||
|
"sha256:dfe19aba8c76be842fc71849ec6a089b7fb957c6ee27a42eb2adc836bcbc2cbb",
|
||||||
|
"sha256:ed6dbcf6015c7413e39ecb567a5a5a41c1c01b87f31d521fa0b70f3c263b949b",
|
||||||
|
"sha256:f40862877e20c879bb53bab679f7d9266e6674f5bae02ad6227ffc0476acd567"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==2.0.0.dev4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"develop": {
|
"develop": {
|
||||||
@@ -55,17 +112,17 @@
|
|||||||
},
|
},
|
||||||
"astroid": {
|
"astroid": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:9b3f17b0550f82e28a6776a4e5222441f48e523b0773df4bc505bb6b7c2093b7",
|
"sha256:09a3fba616519311f1af8a461f804b68f0370e100c9264a035aa7846d7852e33",
|
||||||
"sha256:c7e2e5773d87ccc00d01c273e439386f4d6d63cce61317a79ccce5880162f9fb"
|
"sha256:5a79c9b4bd6c4be777424593f957c996e20beb5f74e0bc332f47713c6f675efe"
|
||||||
],
|
],
|
||||||
"version": "==2.3.0"
|
"version": "==2.3.2"
|
||||||
},
|
},
|
||||||
"attrs": {
|
"attrs": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79",
|
"sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
|
||||||
"sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399"
|
"sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
|
||||||
],
|
],
|
||||||
"version": "==19.1.0"
|
"version": "==19.3.0"
|
||||||
},
|
},
|
||||||
"backcall": {
|
"backcall": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -186,11 +243,11 @@
|
|||||||
},
|
},
|
||||||
"prompt-toolkit": {
|
"prompt-toolkit": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:11adf3389a996a6d45cc277580d0d53e8a5afd281d0c9ec71b28e6f121463780",
|
"sha256:46642344ce457641f28fc9d1c9ca939b63dadf8df128b86f1b9860e59c73a5e4",
|
||||||
"sha256:2519ad1d8038fd5fc8e770362237ad0364d16a7650fb5724af6997ed5515e3c1",
|
"sha256:e7f8af9e3d70f514373bf41aa51bc33af12a6db3f71461ea47fea985defb2c31",
|
||||||
"sha256:977c6583ae813a37dc1c2e1b715892461fcbdaa57f6fc62f33a528c4886c8f55"
|
"sha256:f15af68f66e664eaa559d4ac8a928111eebd5feda0c11738b5998045224829db"
|
||||||
],
|
],
|
||||||
"version": "==2.0.9"
|
"version": "==2.0.10"
|
||||||
},
|
},
|
||||||
"ptyprocess": {
|
"ptyprocess": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -208,11 +265,11 @@
|
|||||||
},
|
},
|
||||||
"pylint": {
|
"pylint": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:2d64b4b8fa044480b1a49d47535da53557f8f426b8c5bd6a23beb65e905101a1",
|
"sha256:7b76045426c650d2b0f02fc47c14d7934d17898779da95288a74c2a7ec440702",
|
||||||
"sha256:6cbd124a1a5ed1fd3f3fed4178a6c2ba166862ea0dac6ab2ff8d9f0998b13e5c"
|
"sha256:856476331f3e26598017290fd65bebe81c960e806776f324093a46b76fb2d1c0"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==2.4.1"
|
"version": "==2.4.3"
|
||||||
},
|
},
|
||||||
"six": {
|
"six": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -230,30 +287,35 @@
|
|||||||
},
|
},
|
||||||
"traitlets": {
|
"traitlets": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:262089114405f22f4833be96b31e143ab906d7764a22c04c71fee0bbda4787ba",
|
"sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44",
|
||||||
"sha256:6ad5b30dacd5e2424c46cc94a0aeab990d98ae17d181acea2cc4272ac3409fca"
|
"sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"
|
||||||
],
|
],
|
||||||
"version": "==4.3.3.dev0"
|
"version": "==4.3.3"
|
||||||
},
|
},
|
||||||
"typed-ast": {
|
"typed-ast": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
"sha256:1170afa46a3799e18b4c977777ce137bb53c7485379d9706af8a59f2ea1aa161",
|
||||||
"sha256:18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e",
|
"sha256:18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e",
|
||||||
"sha256:262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e",
|
"sha256:262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e",
|
||||||
"sha256:2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0",
|
"sha256:2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0",
|
||||||
"sha256:354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c",
|
"sha256:354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c",
|
||||||
|
"sha256:48e5b1e71f25cfdef98b013263a88d7145879fbb2d5185f2a0c79fa7ebbeae47",
|
||||||
"sha256:4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631",
|
"sha256:4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631",
|
||||||
"sha256:630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4",
|
"sha256:630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4",
|
||||||
"sha256:66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34",
|
"sha256:66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34",
|
||||||
"sha256:71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b",
|
"sha256:71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b",
|
||||||
|
"sha256:7954560051331d003b4e2b3eb822d9dd2e376fa4f6d98fee32f452f52dd6ebb2",
|
||||||
|
"sha256:838997f4310012cf2e1ad3803bce2f3402e9ffb71ded61b5ee22617b3a7f6b6e",
|
||||||
"sha256:95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a",
|
"sha256:95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a",
|
||||||
"sha256:bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233",
|
"sha256:bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233",
|
||||||
"sha256:cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1",
|
"sha256:cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1",
|
||||||
"sha256:d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36",
|
"sha256:d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36",
|
||||||
"sha256:d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d",
|
"sha256:d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d",
|
||||||
"sha256:d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a",
|
"sha256:d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a",
|
||||||
|
"sha256:fdc1c9bbf79510b76408840e009ed65958feba92a88833cdceecff93ae8fff66",
|
||||||
"sha256:ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12"
|
"sha256:ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12"
|
||||||
],
|
],
|
||||||
"markers": "implementation_name == 'cpython' and python_version >= '3.7' and python_version < '3.8'",
|
"markers": "implementation_name == 'cpython' and python_version < '3.8'",
|
||||||
"version": "==1.4.0"
|
"version": "==1.4.0"
|
||||||
},
|
},
|
||||||
"wcwidth": {
|
"wcwidth": {
|
||||||
|
|||||||
26
brain.py
Normal file
26
brain.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
class Neural_Network(object):
|
||||||
|
# inspired from https://enlight.nyc/projects/neural-network/
|
||||||
|
def __init__(self):
|
||||||
|
#parameters
|
||||||
|
self.inputSize = 3
|
||||||
|
self.outputSize = 2
|
||||||
|
self.hiddenSize = 3
|
||||||
|
|
||||||
|
#weights
|
||||||
|
self.W1 = np.random.randn(self.inputSize, self.hiddenSize) # weights from input to hidden layer
|
||||||
|
self.W2 = np.random.randn(self.hiddenSize, self.outputSize) # weights from hidden to output layer
|
||||||
|
|
||||||
|
def predict(self, X):
|
||||||
|
#forward propagation through our network
|
||||||
|
self.z = np.dot(X, self.W1) # dot product of X (input) and first set of 3x2 weights
|
||||||
|
self.z2 = self.sigmoid(self.z) # activation function
|
||||||
|
self.z3 = np.dot(self.z2, self.W2) # dot product of hidden layer (z2) and second set of 3x1 weights
|
||||||
|
o = self.sigmoid(self.z3) # final activation function
|
||||||
|
return o
|
||||||
|
|
||||||
|
def sigmoid(self, s):
|
||||||
|
# activation function
|
||||||
|
return 1/(1+np.exp(-s)) -0.5
|
||||||
188
main.py
188
main.py
@@ -1,25 +1,23 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
import math
|
import math
|
||||||
import pygame
|
import pygame
|
||||||
from pygame.locals import HWSURFACE, DOUBLEBUF
|
|
||||||
import random
|
import random
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from brain import Neural_Network
|
||||||
|
from maps import map1
|
||||||
from trigo import angle_to_vector, get_line_feats, segments_intersection, distance
|
from trigo import angle_to_vector, get_line_feats, segments_intersection, distance
|
||||||
|
from params import FLAGS, GX, GY, CELL_COLOR, CAR_SIZE, VISION_LENGTH, VISION_SPAN, THROTTLE_POWER
|
||||||
|
|
||||||
|
|
||||||
FLAGS= HWSURFACE | DOUBLEBUF #| FULLSCREEN
|
|
||||||
|
|
||||||
GX = 1000
|
|
||||||
GY = 1000
|
|
||||||
CELL_COLOR = (80,80,80)
|
|
||||||
CAR_SIZE=25
|
|
||||||
VISION_LENGTH = 50
|
|
||||||
VISION_SPAN = 25 # degrees
|
|
||||||
THROTTLE_POWER = 3
|
|
||||||
pygame.init()
|
pygame.init()
|
||||||
IMG = pygame.image.load("car25.png")#.convert()
|
IMG = pygame.image.load("car25.png")#.convert()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Car(pygame.sprite.Sprite):
|
class Car(pygame.sprite.Sprite):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pygame.sprite.Sprite.__init__(self)
|
pygame.sprite.Sprite.__init__(self)
|
||||||
@@ -33,7 +31,7 @@ class Car(pygame.sprite.Sprite):
|
|||||||
|
|
||||||
self.rect = self.image.get_rect()
|
self.rect = self.image.get_rect()
|
||||||
self.rect.center = (75, GY -50)
|
self.rect.center = (75, GY -50)
|
||||||
self.speed = 5
|
self.speed = 0.5
|
||||||
self.heading = 0
|
self.heading = 0
|
||||||
self.heading_change = 0
|
self.heading_change = 0
|
||||||
self.vision_length = VISION_LENGTH # line liength
|
self.vision_length = VISION_LENGTH # line liength
|
||||||
@@ -50,13 +48,13 @@ class Car(pygame.sprite.Sprite):
|
|||||||
self.center_sensor = None
|
self.center_sensor = None
|
||||||
self.left_sensor = None
|
self.left_sensor = None
|
||||||
self.right_sensor = None
|
self.right_sensor = None
|
||||||
self.update_sensors()
|
|
||||||
self.sensors = [self.left_sensor, self.center_sensor, self.right_sensor]
|
self.sensors = [self.left_sensor, self.center_sensor, self.right_sensor]
|
||||||
self.probes = [self.vision_length] *3
|
self.probes = [self.vision_length] *3
|
||||||
|
|
||||||
self.heading_change = 0
|
self.brain = Neural_Network()
|
||||||
self.throttle = 0
|
|
||||||
|
|
||||||
|
self.update_sensors()
|
||||||
|
self.probe_brain()
|
||||||
|
|
||||||
def update_sensors(self):
|
def update_sensors(self):
|
||||||
center = self.rect.center
|
center = self.rect.center
|
||||||
@@ -77,37 +75,6 @@ class Car(pygame.sprite.Sprite):
|
|||||||
self.update_sensors()
|
self.update_sensors()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
# rotate
|
|
||||||
old_center = self.rect.center
|
|
||||||
self.image = pygame.transform.rotate(self.original_image, self.heading)
|
|
||||||
self.rect = self.image.get_rect()
|
|
||||||
self.rect.center = old_center
|
|
||||||
self.update_position()
|
|
||||||
|
|
||||||
if self.speed :
|
|
||||||
self.heading += self.heading_change / self.speed
|
|
||||||
self.heading = self.heading % 360
|
|
||||||
|
|
||||||
if self.throttle :
|
|
||||||
self.speed += THROTTLE_POWER
|
|
||||||
else :
|
|
||||||
self.speed -= THROTTLE_POWER
|
|
||||||
|
|
||||||
self.speed = max(0, self.speed)
|
|
||||||
|
|
||||||
super().update()
|
|
||||||
|
|
||||||
|
|
||||||
def show_features(self):
|
|
||||||
if self.draw_sensors:
|
|
||||||
pygame.draw.line(screen, (255,0,0), self.center_sensor[0], self.center_sensor[1])
|
|
||||||
pygame.draw.line(screen, (0,255,0), self.left_sensor[0], self.left_sensor[1])
|
|
||||||
pygame.draw.line(screen, (0,0,255), self.right_sensor[0], self.right_sensor[1])
|
|
||||||
pygame.draw.circle(screen, (125,255,125), self.rect.center, 4, 2)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def probe_lines_proximity(self, lines):
|
def probe_lines_proximity(self, lines):
|
||||||
# print(self.center_sensor, lines[0])
|
# print(self.center_sensor, lines[0])
|
||||||
@@ -122,7 +89,52 @@ class Car(pygame.sprite.Sprite):
|
|||||||
self.probes[idx] = min(dist, self.probes[idx])
|
self.probes[idx] = min(dist, self.probes[idx])
|
||||||
# else :
|
# else :
|
||||||
# self.probes[idx] = self.vision_length * 2
|
# self.probes[idx] = self.vision_length * 2
|
||||||
print(self.probes)
|
# print(self.probes)
|
||||||
|
|
||||||
|
|
||||||
|
def probe_brain(self):
|
||||||
|
res = self.brain.predict(np.array(self.probes))
|
||||||
|
self.heading_change = res[0] * 10
|
||||||
|
self.throttle = res[1] * 10
|
||||||
|
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
# rotate
|
||||||
|
old_center = self.rect.center
|
||||||
|
self.image = pygame.transform.rotate(self.original_image, self.heading)
|
||||||
|
self.rect = self.image.get_rect()
|
||||||
|
self.rect.center = old_center
|
||||||
|
self.update_position()
|
||||||
|
print(
|
||||||
|
'Speed', self.speed,
|
||||||
|
'heading', self.heading,
|
||||||
|
'throttle', self.throttle,
|
||||||
|
'heading change', self.heading_change,
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.speed :
|
||||||
|
self.heading += self.heading_change * 10 / self.speed
|
||||||
|
self.heading = self.heading % 360
|
||||||
|
|
||||||
|
self.speed += self.throttle #THROTTLE_POWER
|
||||||
|
# if self.throttle :
|
||||||
|
# self.speed += self.throttle #THROTTLE_POWER
|
||||||
|
# else :
|
||||||
|
# self.speed -= self.throttle #THROTTLE_POWER
|
||||||
|
|
||||||
|
self.speed = max(0, self.speed)
|
||||||
|
|
||||||
|
super().update()
|
||||||
|
|
||||||
|
|
||||||
|
def show_features(self):
|
||||||
|
if self.draw_sensors:
|
||||||
|
pygame.draw.line(screen, (255,0,0), self.center_sensor[0], self.center_sensor[1])
|
||||||
|
pygame.draw.line(screen, (0,255,0), self.left_sensor[0], self.left_sensor[1])
|
||||||
|
pygame.draw.line(screen, (0,0,255), self.right_sensor[0], self.right_sensor[1])
|
||||||
|
pygame.draw.circle(screen, (125,255,125), self.rect.center, 4, 2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -131,80 +143,17 @@ class Car(pygame.sprite.Sprite):
|
|||||||
screen = pygame.display.set_mode((GX, GY), FLAGS)
|
screen = pygame.display.set_mode((GX, GY), FLAGS)
|
||||||
screen.set_alpha(None)
|
screen.set_alpha(None)
|
||||||
|
|
||||||
|
map_lines = map1
|
||||||
|
# print(lines)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
all_cars = pygame.sprite.Group()
|
all_cars = pygame.sprite.Group()
|
||||||
# car = Car()
|
|
||||||
# car.heading = 0
|
|
||||||
# all_cars.add(car)
|
|
||||||
car2 = Car()
|
|
||||||
car2.heading = 0
|
|
||||||
car2.heading_change = 30
|
|
||||||
car2.speed = 25
|
|
||||||
all_cars.add(car2)
|
|
||||||
|
|
||||||
ip = segments_intersection(car2.center_sensor, car2.left_sensor)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# print(math.hypot(ip[0] - car2.rect.center[0], ip[1] - car2.rect.center[1]))
|
|
||||||
|
|
||||||
# stress test
|
|
||||||
# for x in range(100):
|
|
||||||
# car = Car()
|
|
||||||
# car.heading=x
|
|
||||||
# car.heading_change = int(x)/30
|
|
||||||
# car.speed = int(random.random()*6)
|
|
||||||
# all_cars.add(car)
|
|
||||||
|
|
||||||
# lines = [
|
|
||||||
# [
|
|
||||||
# (
|
|
||||||
# int(random.random()*GX),
|
|
||||||
# int(random.random()*GY)
|
|
||||||
# ),(
|
|
||||||
# int(random.random()*GX),
|
|
||||||
# int(random.random()*GY)
|
|
||||||
# )
|
|
||||||
# ]
|
|
||||||
# for x in range(10)
|
|
||||||
# ]
|
|
||||||
|
|
||||||
path = [
|
|
||||||
(25, int(GY-25)),
|
|
||||||
(int(GX/2), int(GY-25)),
|
|
||||||
(int(GX/2 + 75), int(GY-150)),
|
|
||||||
(int(GX/2 + 150), int(GY-150)),
|
|
||||||
(int(GX -75), int(GY/2)),
|
|
||||||
(int(GX/2), int(GY/2 - 75)),
|
|
||||||
(int(GX/2), int(GY/2 - 150)),
|
|
||||||
(int(GX -50), int( GY/4 )),
|
|
||||||
(int(3*GX/4 - 50), int(50)),
|
|
||||||
(int(50), int(50)),
|
|
||||||
(int(100), int(GY/2)),
|
|
||||||
(25, int(GY-25)),
|
|
||||||
]
|
|
||||||
|
|
||||||
path2 = [
|
|
||||||
(100, int(GY-85)),
|
|
||||||
(int(GX/2 - 50 ), int(GY-85)),
|
|
||||||
(int(GX/2 + 50), int(GY-210)),
|
|
||||||
(int(GX/2 + 110), int(GY-210)),
|
|
||||||
(int(GX - 170), int(GY/2 + 30)),
|
|
||||||
(int(GX/2 - 60 ), int(GY/2 - 20)),
|
|
||||||
(int(GX/2 - 60), int(GY/2 - 200)),
|
|
||||||
(int(GX -170), int( GY/4 -20)),
|
|
||||||
(int(3*GX/4 - 100), int(120)),
|
|
||||||
(int(120), int(120)),
|
|
||||||
(int(175), int(GY/2)),
|
|
||||||
(100, int(GY-85)),
|
|
||||||
]
|
|
||||||
|
|
||||||
lines = [[path[i], path[i+1]] for i in range(len(path)-1)]
|
|
||||||
lines2 = [[path2[i], path2[i+1]] for i in range(len(path2)-1)]
|
|
||||||
|
|
||||||
lines = lines + lines2
|
|
||||||
print(lines)
|
|
||||||
|
|
||||||
|
for x in range(1):
|
||||||
|
car = Car()
|
||||||
|
car.heading = x * 30 + 35
|
||||||
|
all_cars.add(car)
|
||||||
|
|
||||||
clock = pygame.time.Clock()
|
clock = pygame.time.Clock()
|
||||||
while True :
|
while True :
|
||||||
@@ -213,9 +162,10 @@ while True :
|
|||||||
all_cars.draw(screen)
|
all_cars.draw(screen)
|
||||||
for c in all_cars :
|
for c in all_cars :
|
||||||
c.show_features()
|
c.show_features()
|
||||||
c.probe_lines_proximity(lines)
|
c.probe_lines_proximity(map_lines)
|
||||||
|
c.probe_brain()
|
||||||
|
|
||||||
for line in lines :
|
for line in map_lines :
|
||||||
pygame.draw.line(screen, (255,255,255), line[0], line[1])
|
pygame.draw.line(screen, (255,255,255), line[0], line[1])
|
||||||
|
|
||||||
# point = (int(GX/2), int(GY/2+25))
|
# point = (int(GX/2), int(GY/2+25))
|
||||||
|
|||||||
40
maps.py
Normal file
40
maps.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from params import GX, GY
|
||||||
|
|
||||||
|
def generate_map_1() :
|
||||||
|
path = [
|
||||||
|
(25, int(GY-25)),
|
||||||
|
(int(GX/2), int(GY-25)),
|
||||||
|
(int(GX/2 + 75), int(GY-150)),
|
||||||
|
(int(GX/2 + 150), int(GY-150)),
|
||||||
|
(int(GX -75), int(GY/2)),
|
||||||
|
(int(GX/2), int(GY/2 - 75)),
|
||||||
|
(int(GX/2), int(GY/2 - 150)),
|
||||||
|
(int(GX -50), int( GY/4 )),
|
||||||
|
(int(3*GX/4 - 50), int(50)),
|
||||||
|
(int(50), int(50)),
|
||||||
|
(int(100), int(GY/2)),
|
||||||
|
(25, int(GY-25)),
|
||||||
|
]
|
||||||
|
|
||||||
|
path2 = [
|
||||||
|
(100, int(GY-85)),
|
||||||
|
(int(GX/2 - 50 ), int(GY-85)),
|
||||||
|
(int(GX/2 + 50), int(GY-210)),
|
||||||
|
(int(GX/2 + 110), int(GY-210)),
|
||||||
|
(int(GX - 170), int(GY/2 + 30)),
|
||||||
|
(int(GX/2 - 60 ), int(GY/2 - 20)),
|
||||||
|
(int(GX/2 - 60), int(GY/2 - 200)),
|
||||||
|
(int(GX -170), int( GY/4 -20)),
|
||||||
|
(int(3*GX/4 - 100), int(120)),
|
||||||
|
(int(120), int(120)),
|
||||||
|
(int(175), int(GY/2)),
|
||||||
|
(100, int(GY-85)),
|
||||||
|
]
|
||||||
|
|
||||||
|
lines = [[path[i], path[i+1]] for i in range(len(path)-1)]
|
||||||
|
lines2 = [[path2[i], path2[i+1]] for i in range(len(path2)-1)]
|
||||||
|
|
||||||
|
lines = lines + lines2
|
||||||
|
return lines
|
||||||
|
|
||||||
|
map1 = generate_map_1()
|
||||||
Reference in New Issue
Block a user