{"id":26155454,"url":"https://github.com/ntdls/ntdls.determinet","last_synced_at":"2025-04-14T07:42:22.947Z","repository":{"id":194943185,"uuid":"692233538","full_name":"NTDLS/NTDLS.Determinet","owner":"NTDLS","description":"Determinet is versatile multilayer perception neural network designed for extendibility and genetic-style mutations to allow forward propagation of the network variants.","archived":false,"fork":false,"pushed_at":"2024-12-31T12:23:49.000Z","size":192,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-12T11:09:18.731Z","etag":null,"topics":["ai","machine-learning","neural-network"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NTDLS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-15T21:52:15.000Z","updated_at":"2024-12-31T12:23:22.000Z","dependencies_parsed_at":"2023-12-16T22:37:39.692Z","dependency_job_id":"cfd5dcda-65ce-456e-bd8b-8cf031235233","html_url":"https://github.com/NTDLS/NTDLS.Determinet","commit_stats":null,"previous_names":["ntdls/ntdls.determinet"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTDLS%2FNTDLS.Determinet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTDLS%2FNTDLS.Determinet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTDLS%2FNTDLS.Determinet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTDLS%2FNTDLS.Determinet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NTDLS","download_url":"https://codeload.github.com/NTDLS/NTDLS.Determinet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248557844,"owners_count":21124168,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","machine-learning","neural-network"],"created_at":"2025-03-11T08:56:11.883Z","updated_at":"2025-04-14T07:42:22.923Z","avatar_url":"https://github.com/NTDLS.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Determinet\n\n📦 Be sure to check out the NuGet package: https://www.nuget.org/packages/NTDLS.Determinet\n\nDeterminet is versatile multilayer perception neural network designed for extendibility and genetic-style mutations to allow forward propagation of the network variants.\n\nBelow is a simple example of using the network to navigate a maze or other obstacles for a simple simulation.\nYou can find more advanced examples as well as working models of this in the AIVolution project:\nhttps://github.com/NTDLS/AIVolution\n\nIf you are in a fighting mood, you can also battle it out against some of these trained models in the Space Flight Shooter Game: https://github.com/NTDLS/NebulaSiege\n\n```csharp\npublic enum AIInputs\n{\n    DistanceFromObstacle,\n    AngleToObstacleInDecimalDegrees\n}\n\npublic enum AIOutputs\n{\n    MoveAway,\n    AdjustSpeed\n}\n\nstatic void Main()\n{\n    TrainAndSaveModel(\"./TestHarness.json\");\n\n    //Note that if you want to use the model in different threads, you will need to\n    //  make a clone since the values of the input nodes are altered when making decisions.\n    //  Fortunately, this can be easily accomplished with a call to Clone();\n    var network = LoadSavedModel(\"./TestHarness.json\");\n\n    var decidingFactors = GatherInputs(); //Get decision inputs.\n\n    var decisions = network.FeedForward(decidingFactors); //Make decisions.\n\n    //Handle the speed decisions.\n    var shouldAdjustSpeed = decisions.Get(AIOutputs.AdjustSpeed);\n    if (shouldAdjustSpeed \u003e 0.8)\n    {\n        //Adjust speed up.\n    }\n    else if (shouldAdjustSpeed \u003c 0.2)\n    {\n        //Adjust speed down.\n    }\n\n    //Handle the heading direction.\n    var shouldMoveAway = decisions.Get(AIOutputs.MoveAway);\n    if (shouldMoveAway \u003e 0.9)\n    {\n        //Change heading. Maybe just turn around completely?\n    }\n}\n\n/// \u003csummary\u003e\n/// Get the input values we need to make a decision.\n/// \u003c/summary\u003e\n/// \u003creturns\u003e\u003c/returns\u003e\nstatic DniNamedInterfaceParameters GatherInputs()\n{\n    //Here we are just using some dummy values, in this hypothetical situation\n    //  we would be getting the distance from a wall and the angle to it.\n\n    double idealMaxDistance = 1000;\n    double distanceFromObstacle = 500;\n\n    double percentageOfCloseness = (distanceFromObstacle / idealMaxDistance);\n    double angleToObstacleInDecimalDegrees = 0.8;\n\n    var aiParams = new DniNamedInterfaceParameters();\n    aiParams.Set(AIInputs.DistanceFromObstacle, percentageOfCloseness);\n    aiParams.Set(AIInputs.AngleToObstacleInDecimalDegrees, angleToObstacleInDecimalDegrees);\n    return aiParams;\n}\n\nstatic DniNeuralNetwork LoadSavedModel(string fileName)\n{\n    var network = DniNeuralNetwork.LoadFromFile(fileName);\n\n    if (network == null)\n    {\n        throw new Exception(\"Failed to load the network from file.\");\n    }\n\n    return network;\n}\n\nstatic void TrainAndSaveModel(string fileName)\n{\n    var Network = new DniNeuralNetwork\n    {\n        LearningRate = 0.01\n    };\n\n    //Add input layer\n    Network.Layers.AddInput(ActivationType.LeakyReLU,\n        new object[] {\n                AIInputs.DistanceFromObstacle,\n                AIInputs.AngleToObstacleInDecimalDegrees\n        });\n\n    //Add a intermediate \"hidden\" layer. You can add more if you like.\n    Network.Layers.AddIntermediate(ActivationType.Sigmoid, 8);\n\n    //Add the output layer.\n    Network.Layers.AddOutput(\n        new object[] {\n                AIOutputs.MoveAway,\n                AIOutputs.AdjustSpeed\n        });\n\n    //Train the model with some input scenarios. Look at TrainingScenario() and TrainingDecision()\n    //  to see that these ominous looking numbers are actualy just named inouts. Its pretty simple really.\n    for (int epoch = 0; epoch \u003c 5000; epoch++)\n    {\n        //Very close to observed object, slow way down and get away\n        Network.BackPropagate(TrainingScenario(0, 0), TrainingDecision(1, 0));\n        Network.BackPropagate(TrainingScenario(0, -1), TrainingDecision(1, 0));\n        Network.BackPropagate(TrainingScenario(0, 1), TrainingDecision(1, 0));\n        Network.BackPropagate(TrainingScenario(0, 0.5), TrainingDecision(1, 0));\n        Network.BackPropagate(TrainingScenario(0, -0.5), TrainingDecision(1, 0));\n\n        //Pretty close to observed object, slow down a bit and get away.\n        Network.BackPropagate(TrainingScenario(0.25, 0), TrainingDecision(1, 0.2));\n        Network.BackPropagate(TrainingScenario(0.25, -1), TrainingDecision(1, 0.2));\n        Network.BackPropagate(TrainingScenario(0.25, 1), TrainingDecision(1, 0.2));\n        Network.BackPropagate(TrainingScenario(0.25, 0.5), TrainingDecision(1, 0.2));\n        Network.BackPropagate(TrainingScenario(0.25, -0.5), TrainingDecision(1, 0.2));\n\n        //Very far from observed object, speed up and maintain heading.\n        Network.BackPropagate(TrainingScenario(1, 0), TrainingDecision(0, 1));\n        Network.BackPropagate(TrainingScenario(1, -1), TrainingDecision(0, 1));\n        Network.BackPropagate(TrainingScenario(1, 1), TrainingDecision(0, 1));\n        Network.BackPropagate(TrainingScenario(1, 0.5), TrainingDecision(0, 1));\n        Network.BackPropagate(TrainingScenario(1, -0.5), TrainingDecision(0, 1));\n\n        //Pretty far from observed object, maintain heading but don't change speed.\n        Network.BackPropagate(TrainingScenario(0.75, 0), TrainingDecision(0, 0.5));\n        Network.BackPropagate(TrainingScenario(0.75, -1), TrainingDecision(0, 0.5));\n        Network.BackPropagate(TrainingScenario(0.75, 1), TrainingDecision(0, 0.5));\n        Network.BackPropagate(TrainingScenario(0.75, 0.5), TrainingDecision(0, 0.5));\n        Network.BackPropagate(TrainingScenario(0.75, -0.5), TrainingDecision(0, 0.5));\n    }\n\n    static DniNamedInterfaceParameters TrainingScenario(double distanceFromObstacle, double angleToObstacleInDecimalDegrees)\n    {\n        var param = new DniNamedInterfaceParameters();\n        param.Set(AIInputs.DistanceFromObstacle, distanceFromObstacle);\n        param.Set(AIInputs.AngleToObstacleInDecimalDegrees, angleToObstacleInDecimalDegrees);\n        return param;\n    }\n\n    static DniNamedInterfaceParameters TrainingDecision(double moveAway, double adjustSpeed)\n    {\n        var param = new DniNamedInterfaceParameters();\n\n        param.Set(AIOutputs.MoveAway, moveAway);\n        param.Set(AIOutputs.AdjustSpeed, adjustSpeed);\n        return param;\n    }\n\n    //Save the network to a file. This is only done here for examples sake.\n    Network.Save(fileName);\n}\n```\n\n## License\n[MIT]https://choosealicense.com/licenses/mit/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fntdls%2Fntdls.determinet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fntdls%2Fntdls.determinet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fntdls%2Fntdls.determinet/lists"}