From 18059ff25ce02b563a72190c518e2ac9a53aef48 Mon Sep 17 00:00:00 2001 From: "Anmulwar, Sweta V (PG/R - Elec Electronic Eng)" <sa02405@surrey.ac.uk> Date: Sun, 9 Apr 2023 16:20:10 +0100 Subject: [PATCH] Changed rho alpha beta values --- .vs/QLearningApp/v16/.suo | Bin 98304 -> 100864 bytes .../MachineLearning/Models/QLearning.cs | 15 ++-- QLearningApp/Program.cs | 66 +++++++++++++++++- QLearningApp/RLsync.cs | 12 ++-- QLearningApp/bin/Debug/QLearningApp.exe | Bin 13312 -> 14336 bytes QLearningApp/bin/Debug/QLearningApp.pdb | Bin 46592 -> 48640 bytes ...QLearningApp.csprojAssemblyReference.cache | Bin 424 -> 424 bytes QLearningApp/obj/Debug/QLearningApp.exe | Bin 13312 -> 14336 bytes QLearningApp/obj/Debug/QLearningApp.pdb | Bin 46592 -> 48640 bytes 9 files changed, 77 insertions(+), 16 deletions(-) diff --git a/.vs/QLearningApp/v16/.suo b/.vs/QLearningApp/v16/.suo index 4440aaa92ef0803fdda288649133ffcf000c393b..103c2119432c3a8456e8ba30ad974c5e03404fac 100644 GIT binary patch delta 4269 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 X$%pXLlbbMbhI2D$#y05uT#0`GPR=1& delta 3719 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 diff --git a/QLearningApp/MachineLearning/Models/QLearning.cs b/QLearningApp/MachineLearning/Models/QLearning.cs index 4734e96..acd1ef5 100644 --- a/QLearningApp/MachineLearning/Models/QLearning.cs +++ b/QLearningApp/MachineLearning/Models/QLearning.cs @@ -115,15 +115,15 @@ namespace QLearningApp.MachineLearning //Console.WriteLine("Enter targetted FPS value ={0}",targetFPS); double currentState = initialState;//FPS value - //int counter = 0; + int counter = 0; while (true) { currentState = TakeAction(currentState);//currentState= FPS, return should be FPS value - //counter++; - /*if (counter == 500) + counter++; + if (counter == 2000) break;//will run 500 times*/ - if (_qLearningProblem.GoalStateIsReached(currentState)) - break; + /*if (_qLearningProblem.GoalStateIsReached(currentState)) + break;*/ } } @@ -131,7 +131,6 @@ namespace QLearningApp.MachineLearning { //var validActions = _qLearningProblem.GetValidActions(currentState); int randomIndexActionGamma = _random.Next(0, _qLearningProblem.gamma_length); - int randomIndexActionDelta = _random.Next(0, _qLearningProblem.delta_length); //Console.WriteLine("randomIndexActionGamma ={0},randomIndexActionDelta ={1}", randomIndexActionGamma, randomIndexActionDelta); //int randomIndexActionDelta = _random.Next(0, _qLearningProblem.NumberOfActions);//choosing a random action from number of actions defined @@ -139,7 +138,7 @@ namespace QLearningApp.MachineLearning // double delta_action = _qLearningProblem.delta_space[randomIndexActionGamma]; double delta_action = _qLearningProblem.gamma_space[randomIndexActionDelta]; //fixed for now, can be changed in the future //int delta_actionIndex = 0; - double rho = 0.4; + double rho = 0.1;//0.4; double saReward = _qLearningProblem.GetReward(currentState, gamma_action, delta_action); // Use rho to have a slowly & smoothly changing FPS value after an action is taken @@ -162,7 +161,7 @@ namespace QLearningApp.MachineLearning double nsReward = Max; //Console.WriteLine("value of nsReward=" + nsReward); - double qCurrentState = saReward + (_gamma * nsReward); + double qCurrentState = saReward + (_gamma * nsReward);//discount factor=0.8 int currentStateIndex = _qLearningProblem.fps_spaceIndex(currentState); _qTable[currentStateIndex, randomIndexActionGamma, randomIndexActionDelta] = qCurrentState; return nextState; diff --git a/QLearningApp/Program.cs b/QLearningApp/Program.cs index 776be1c..c9d9244 100644 --- a/QLearningApp/Program.cs +++ b/QLearningApp/Program.cs @@ -18,7 +18,7 @@ namespace QLearningApp var qLearning = new QLearning(0.8, new RLSync(),targetFPS); Console.WriteLine("Training Agent..."); - qLearning.TrainAgent(2000); + qLearning.TrainAgent(3000); Console.WriteLine("step 2"); Console.WriteLine("Training is Done!"); @@ -27,6 +27,8 @@ namespace QLearningApp Console.ReadLine(); do { + double[,] Qdisplay = new double[6, 6]; + Console.WriteLine($"Enter initial state Index. Number between 0 and the number of states (5). Press 'q' to exit..."); int initialStateIndex = 0; if (!int.TryParse(Console.ReadLine(), out initialStateIndex)) break; @@ -35,15 +37,75 @@ namespace QLearningApp { var qLearningStats = qLearning.Run(initialStateIndex); Console.WriteLine(qLearningStats.ToString()); + /* Display 3 dimesional Q matrix */ + + for (int k = 0; k < qLearning.QTable.GetLength(0); k++) + { + for (int i = 0; i < qLearning.QTable.GetLength(1); i++) + { + for (int j = 0; j < qLearning.QTable.GetLength(2); j++) + { + Qdisplay[i, j] = qLearning.QTable[k, i, j]; + //Console.Write(Math.Round(Qdisplay[i, j] * 10) / 10 + "\t"); + } + } + /* To print normalized matrix */ + var normalizedMatrix = NormalizeMatrix(Qdisplay); + for (int i = 0; i < Qdisplay.GetLength(0); i++) + { + for (int j = 0; j < Qdisplay.GetLength(1); j++) + { + + Console.Write(Math.Round(normalizedMatrix[i, j] * 10) / 10 + "\t"); + } + Console.WriteLine(); + } + Console.WriteLine(); + } + + //Console.Write(Qdisplay.ToString()); + //var normalizedMatrix = NormalizeMatrix(Qdisplay); + //Console.Write(qLearning.QTable.ToString()); //var normalizedMatrix = qLearning.QTable.NormalizeMatrix(); //Console.Write(qLearning.QTable.ToString()); } - catch(Exception ex) + catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } } while (true); } + public static double[,] NormalizeMatrix(double[,] matrix) + { + /* To normalize matrix*/ + var maxElement = GetMaxElement(matrix); + + var normalizedMatrix = new double[6,6]; + for (int i = 0; i < matrix.GetLength(0); i++)//0-rows, 1-col,2-z values + { + //normalizedMatrix[i] = new double[matrix.Length(0)]; + for (int j = 0; j < matrix.GetLength(1); j++) + { + if (matrix[i,j] != 0) + normalizedMatrix[i,j] = Math.Round((matrix[i, j] * 100) / maxElement, 0); + } + } + return normalizedMatrix; + } + + public static double GetMaxElement(double[,] matrix) + { + double maxElement = 0; + for (int i = 0; i < matrix.GetLength(0); i++) + { + for (int j = 0; j < matrix.GetLength(1); j++) + { + if (matrix[i,j] > maxElement) + maxElement = matrix[i,j]; + } + } + return maxElement; + } } } diff --git a/QLearningApp/RLsync.cs b/QLearningApp/RLsync.cs index 2d50828..344e77c 100644 --- a/QLearningApp/RLsync.cs +++ b/QLearningApp/RLsync.cs @@ -12,8 +12,8 @@ namespace QLearningApp public double[] delta_space = { 10, 20, 30, 40, 50, 100 }; // possible values of delta- 6 values //public double[] delta_space = { 20 }; - public double alpha = 0.2; //original value - public double beta = 0.2;//original value + public double alpha = 0.2; //original value 0.4 + public double beta = 0.2;//original value 0.4 // State space public double[] fps_space = { 10, 12, 15, 17, 20, 22, 25, 27, 30 };//PE, APL 0-30 read it form file-9 states @@ -21,10 +21,10 @@ namespace QLearningApp private double[][] rewards = new double[5][]; public double Target_fps { get; set;}//made it a proerty /* - target for syn window if it is 100ms, target should be given by user not hard-coded + target for syn window if it is 100ms, target should be given by user not hard-coded - done ini satse: 20 FPS, 100ms latency initial values 30FPS, APL 100ms--> Target APL 20ms, FPS >=15 - FPS, PE: 30FPS, PE: 25ms --> target + FPS, PE: 30FPS, PE: 25ms --> target trade -off */ @@ -38,7 +38,7 @@ namespace QLearningApp { //double reward = 1 / (System.Math.Abs(currentState - target_fps)) - alpha * action_gamma - beta * action_delta; //double reward = 1 / (1+System.Math.Abs(currentState - target_fps)) - alpha * action_gamma/100 - beta * action_delta/100; // gamma nand delta are normalized to [0, 1]; does not perform well when fps is very low - double reward = 1 / (1 + System.Math.Abs(currentState - Target_fps)) * (1 - alpha * System.Math.Abs(action_gamma / 100) - beta * System.Math.Abs(action_delta / 100)); // gamma nand delta are normalized to [0, 1] + double reward = 1 / (1 + System.Math.Abs(currentState - Target_fps)) * (1 - alpha * action_gamma / 100 - beta * action_delta / 100); // gamma nand delta are normalized to [0, 1], so that there is always a positive reward return reward; } @@ -53,7 +53,7 @@ namespace QLearningApp { 8, 10, 13, 15, 18, 20 }, { 10, 12, 15, 20, 22, 25 }, { 10, 15, 18, 20, 25, 28 }, - { 30, 30, 30, 30, 30, 30 }, + { 10, 15, 20, 22, 30, 30 }, { 15, 20, 25, 27, 30, 30 } }; //{ 10, 15, 20, 22, 30, 30 }-second last row // 6*6 matrix Further improvements in the simulation: depending on changing network delays, the FPS matrix can change, allowing higher FPS at smaller values of gamma and delta return System.Math.Abs(FPS[gammaIndex,deltaIndex] + random_fps_noise); diff --git a/QLearningApp/bin/Debug/QLearningApp.exe b/QLearningApp/bin/Debug/QLearningApp.exe index ea93ca9266419cad2c275deb93337a461f88c6f1..69860436b49a7b74247d4dd3d9d92820600b4015 100644 GIT binary patch delta 4705 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 Q*2B#!hU~_V*g(qoH<f7U8UO$Q delta 4100 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 U69wsy0^IAEh_=1U#?sb*01S7JCjbBd diff --git a/QLearningApp/bin/Debug/QLearningApp.pdb b/QLearningApp/bin/Debug/QLearningApp.pdb index 212d01b5aaf1be5750912b2a43e1e1ccbc55e85b..64633aa518b875e67a87556f189d8bc4ade484fb 100644 GIT binary patch delta 6884 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 AyZ`_I delta 5128 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 Xpehi5>ioyaFfSsX|HW|F_Pp{h_oprS diff --git a/QLearningApp/obj/Debug/QLearningApp.csprojAssemblyReference.cache b/QLearningApp/obj/Debug/QLearningApp.csprojAssemblyReference.cache index c240c2684ac24abfea7de1369b85f99398d906b7..81441d12ea59e70c6bb50a099f24c3d712ed2b57 100644 GIT binary patch delta 13 UcmZ3%yn=ayKO^I>$pMTJ03kdCjsO4v delta 13 UcmZ3%yn=ayKO^IU$pMTJ03Uh;Gynhq diff --git a/QLearningApp/obj/Debug/QLearningApp.exe b/QLearningApp/obj/Debug/QLearningApp.exe index ea93ca9266419cad2c275deb93337a461f88c6f1..69860436b49a7b74247d4dd3d9d92820600b4015 100644 GIT binary patch delta 4705 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 Q*2B#!hU~_V*g(qoH<f7U8UO$Q delta 4100 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 U69wsy0^IAEh_=1U#?sb*01S7JCjbBd diff --git a/QLearningApp/obj/Debug/QLearningApp.pdb b/QLearningApp/obj/Debug/QLearningApp.pdb index 212d01b5aaf1be5750912b2a43e1e1ccbc55e85b..64633aa518b875e67a87556f189d8bc4ade484fb 100644 GIT binary patch delta 6884 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 AyZ`_I delta 5128 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 Xpehi5>ioyaFfSsX|HW|F_Pp{h_oprS -- GitLab