Advertisement
alexhernandezroblox

Untitled

May 12th, 2025
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.62 KB | None | 0 0
  1. if not game:GetService("RunService"):IsRunMode() and script.Name ~= "AIsDeepQClone" then
  2.     script.Enabled = false
  3. elseif game:GetService("RunService"):IsRunMode() then
  4.     script.AIShutdown.Value = true
  5. end
  6. if script.Disabled then return end
  7.  
  8. local RunService = game:GetService("RunService")
  9. local DataStoreService = game:GetService("DataStoreService")
  10. local NetworkStorage = DataStoreService:GetDataStore("NetworkStorage")
  11. local SS = game.ServerStorage
  12. local OpenML = require(SS.OpenML)
  13.  
  14. local function sigmoid(x)
  15.     return 1 / (1 + math.exp(-x))
  16. end
  17.  
  18. local ITERATION_GUI = workspace.Iteration.SurfaceGui.TextLabel
  19. local FINISHES_GUI = workspace.Finishes.SurfaceGui.TextLabel
  20. local GOAL = workspace.goal
  21. local SPAWN = workspace.spawn
  22. local PASSED_COORDS = {
  23.     workspace.Passed1.Position.X, workspace.Passed2.Position.X,
  24.     workspace.Passed3.Position.X, workspace.Passed4.Position.X,
  25.     workspace.Passed5.Position.X, workspace.Passed6.Position.X,
  26.     workspace.Passed7.Position.X, workspace.Passed8.Position.X,
  27.     workspace.Passed9.Position.X, workspace.Passed10.Position.X,
  28.     workspace.Passed11.Position.X, workspace.Passed12.Position.X,
  29.     workspace.Passed13.Position.X, workspace.Passed14.Position.X,
  30.     workspace.Passed15.Position.X, workspace.Passed16.Position.X,
  31. }
  32.  
  33. FINISHES_GUI.FinishCount.Value = 0
  34. FINISHES_GUI.Text = "Finishes: 0"
  35. ITERATION_GUI.IterationCount.Value = 0
  36. ITERATION_GUI.Text = "Iteration: 0"
  37. workspace.Finishes.CFrame = CFrame.new(-128.949203, 90.3132095, 84.4396667, 0.999922872, 0.00161167711, -0.0123128593, 0, 0.991541922, 0.129786715, 0.0124178901, -0.129776701, 0.991465509)
  38. workspace.Iteration.CFrame = CFrame.new(-128.988525, 86.216301, 87.6062622, 0.999922872, 0.00161167711, -0.0123128593, 0, 0.991541922, 0.129786715, 0.0124178901, -0.129776701, 0.991465509)
  39.  
  40. local AGENT_BODY = SS.AgentRig:Clone()
  41. script.Agent.Value = AGENT_BODY
  42. local HUMANOID_ROOT = AGENT_BODY.PrimaryPart
  43. local HUMANOID = AGENT_BODY.Humanoid
  44.  
  45. local ADAM_OPTIMIZER = OpenML.Optimizers.Adam.new()
  46. local PROPAGATOR = OpenML.Algorithms.Propagator
  47. local FUNCTION_ACTIVATION = OpenML.ActivationFunctions.ReLU
  48. local FUNCTION_LOSS = OpenML.Calculate.MSE
  49. local DQL = OpenML.Algorithms.DQL.new()
  50. local NETWORK
  51. local NetworkIterationsSave, NetworkFinishesSave, steps = nil, nil, 0
  52. local consecutiveFalls = 0
  53. local livingPenalty = 0.002
  54.  
  55. if script.AIUpdated.Value then
  56.     local data1 = NetworkStorage:GetAsync("EfficientNetwork1")
  57.     NetworkIterationsSave = NetworkStorage:GetAsync("EfficientNetwork2")
  58.     NetworkFinishesSave = NetworkStorage:GetAsync("EfficientNetwork3")
  59.     steps = NetworkStorage:GetAsync("EfficientNetworkSteps")
  60.     NETWORK = OpenML.Resources.MLP.Decompress(data1, 'IEEE754')
  61.     local savedCFrame = NetworkStorage:GetAsync("EfficientNetworkCFrame")
  62.     if savedCFrame then
  63.         HUMANOID_ROOT.CFrame = CFrame.new(table.unpack(savedCFrame))
  64.     end
  65.  
  66. elseif script.AIShutdown.Value then
  67.     local data2 = NetworkStorage:GetAsync("ShutdownNetwork1")
  68.     NetworkIterationsSave = NetworkStorage:GetAsync("ShutdownNetwork2")
  69.     NetworkFinishesSave = NetworkStorage:GetAsync("ShutdownNetwork3")
  70.     steps = NetworkStorage:GetAsync("ShutdownNetworkSteps")
  71.     NETWORK = OpenML.Resources.MLP.Decompress(data2, 'IEEE754')
  72.     local savedCFrame = NetworkStorage:GetAsync("ShutdownNetworkCFrame")
  73.     if savedCFrame then
  74.         HUMANOID_ROOT.CFrame = CFrame.new(table.unpack(savedCFrame))
  75.     end
  76.  
  77. else
  78.     NETWORK = OpenML.Resources.MLP.new({7, 32, 32, 16, 2}, function()
  79.         return Random.new():NextNumber() * 2 - 1
  80.     end)
  81.     HUMANOID_ROOT.CFrame = SPAWN.CFrame
  82. end
  83.  
  84. setmetatable(NETWORK, { __index = PROPAGATOR })
  85.  
  86. if NetworkIterationsSave and NetworkFinishesSave then
  87.     ITERATION_GUI.IterationCount.Value = NetworkIterationsSave
  88.     ITERATION_GUI.Text = "Iteration: " .. tostring(NetworkIterationsSave)
  89.     FINISHES_GUI.FinishCount.Value = NetworkFinishesSave
  90.     FINISHES_GUI.Text = "Finishes: " .. tostring(NetworkFinishesSave)
  91.     PREVIOUS_DIST = (HUMANOID_ROOT.Position - GOAL.Position).Magnitude
  92. end
  93.  
  94. AGENT_BODY.Parent = workspace
  95. HUMANOID.AutoRotate = false
  96.  
  97. DQL.OnForwardPropagation = function(states)
  98.     return NETWORK:ForwardPropagation(states, FUNCTION_ACTIVATION)
  99. end
  100.  
  101. local LEARNING_RATE = 0.001
  102. DQL.OnBackPropagation = function(activations, target)
  103.     return NETWORK:BackPropagation(activations, target, {
  104.         ActivationFunction = FUNCTION_ACTIVATION,
  105.         Optimizer = ADAM_OPTIMIZER,
  106.         LearningRate = LEARNING_RATE
  107.     })
  108. end
  109.  
  110. local Params = RaycastParams.new()
  111. Params.FilterDescendantsInstances = {AGENT_BODY}
  112. Params.FilterType = Enum.RaycastFilterType.Exclude
  113.  
  114. local PREVIOUS_DIST = (SPAWN.Position - GOAL.Position).Magnitude
  115. local LAST_PASSED = 0
  116. local SECOND_LAST_PASSED = 0 -- before LAST_PASSED
  117. local SAME_PASSED = 0 -- has the agent passed the same platform for 2 episodes/iterations? e.g. if he passed platform 5 ONLY and EXACTLY twice in a row then this val would be 2
  118. local TOTAL_REWARD = 0
  119. local TIME_STILL = 0
  120.  
  121. game:BindToClose(function()
  122.     warn("shutting down")
  123.     local compressed = OpenML.Resources.MLP.Compress(NETWORK, "IEEE754")
  124.     NetworkStorage:SetAsync("ShutdownNetwork1", compressed)
  125.     NetworkStorage:SetAsync("ShutdownNetwork2", ITERATION_GUI.IterationCount.Value)
  126.     NetworkStorage:SetAsync("ShutdownNetwork3", FINISHES_GUI.FinishCount.Value)
  127.     NetworkStorage:SetAsync("ShutdownNetworkCFrame", {HUMANOID_ROOT.CFrame:GetComponents()})
  128.     NetworkStorage:SetAsync("ShutdownNetworkSteps", steps)
  129.     warn("saved")
  130. end)
  131.  
  132. RunService.Stepped:Connect(function(_, deltaTime)
  133.     steps += 1
  134.  
  135.     local distToGoal = (HUMANOID_ROOT.Position - GOAL.Position).Magnitude
  136.     local downRay = workspace:Raycast(HUMANOID_ROOT.Position, Vector3.new(0, -1, 0) * 4, Params)
  137.     local furthestRay = workspace:Raycast(HUMANOID_ROOT.Position, Vector3.new(-1, -1, 0) * 4, Params)
  138.     local intermediateRay = workspace:Raycast(HUMANOID_ROOT.Position, Vector3.new(-0.5, -1, 0) * 4, Params)
  139.  
  140.     local function getDepth(ray)
  141.         return ray and (ray.Position - HUMANOID_ROOT.Position).Magnitude or 4
  142.     end
  143.  
  144.     local inputs = {
  145.         distToGoal,
  146.         (downRay and downRay.Instance) and 1 or 0,
  147.         HUMANOID_ROOT.Velocity.Magnitude,
  148.         HUMANOID_ROOT.Velocity.Y,
  149.         getDepth(downRay),
  150.         getDepth(furthestRay),
  151.         getDepth(intermediateRay),
  152.     }
  153.  
  154.     local activations = NETWORK:ForwardPropagation(inputs, FUNCTION_ACTIVATION)
  155.     local actions = activations[#activations]
  156.     local epsilon_start = 1
  157.     local epsilon_end = 0.05
  158.     local decay_steps = 2e6
  159.     local epsilon = math.max(epsilon_end, epsilon_start - (steps / decay_steps) * (epsilon_start - epsilon_end))
  160.     local isEpsilon = math.random() <= epsilon
  161.     local chosenAction = isEpsilon and math.random(1, 2) or (actions[1] > actions[2] and 1 or 2)
  162.  
  163.     if chosenAction == 1 then
  164.         HUMANOID:MoveTo(GOAL.Position)
  165.     else
  166.         HUMANOID:MoveTo(HUMANOID_ROOT.Position)
  167.         HUMANOID.Jump = true
  168.     end
  169.  
  170.     local reward
  171.     local distDiff = PREVIOUS_DIST - distToGoal
  172.     if distToGoal < PREVIOUS_DIST and math.abs(distDiff) > 0.26 then
  173.         reward = distDiff * 0.3
  174.         TIME_STILL = 0
  175.     else
  176.         reward = 0
  177.         TIME_STILL += deltaTime
  178.         warn("TIME_STILL:", TIME_STILL)
  179.         if TIME_STILL > 3 then
  180.             warn("Punishing")
  181.             reward = -0.1 + ((TIME_STILL - 3) * -0.01) -- reward punishment calculation in milliseconds
  182.         end
  183.     end
  184.  
  185.     local xPos = HUMANOID_ROOT.Position.X
  186.     for i, threshold in ipairs(PASSED_COORDS) do
  187.         if xPos < threshold and LAST_PASSED < i then
  188.             LAST_PASSED = i
  189.             reward = i * 20
  190.             break
  191.         end
  192.     end
  193.     TOTAL_REWARD += reward
  194.     TOTAL_REWARD -= livingPenalty
  195.  
  196.     local touchingBottom = downRay and downRay.Instance == workspace.bottom
  197.     if touchingBottom then
  198.         local fallPenalty = -10
  199.         if (TIME_STILL - 3) * -0.02 >= fallPenalty then
  200.             consecutiveFalls += 1
  201.         else
  202.             consecutiveFalls = 0
  203.         end
  204.         if SECOND_LAST_PASSED == LAST_PASSED and SECOND_LAST_PASSED > 0 then
  205.             SAME_PASSED += 1
  206.         else
  207.             SAME_PASSED = 0
  208.         end
  209.         SECOND_LAST_PASSED = LAST_PASSED
  210.         if SAME_PASSED >= 5 then
  211.             fallPenalty = reward + 5
  212.         elseif consecutiveFalls >= 10 then
  213.             fallPenalty = ((TIME_STILL - 3) * -0.02) + 1
  214.         end
  215.         reward = fallPenalty
  216.         TOTAL_REWARD = 0
  217.         TIME_STILL = 0
  218.         LAST_PASSED = 0
  219.         HUMANOID_ROOT.CFrame = SPAWN.CFrame
  220.         ITERATION_GUI.IterationCount.Value += 1
  221.         warn("line 227 + 1")
  222.         ITERATION_GUI.Text = "Iteration: " .. tostring(ITERATION_GUI.IterationCount.Value)
  223.         PREVIOUS_DIST = (HUMANOID_ROOT.Position - GOAL.Position).Magnitude
  224.     end
  225.  
  226.     PREVIOUS_DIST = distToGoal
  227.     print("Reward:",reward - livingPenalty)
  228.     print("Total reward:",TOTAL_REWARD)
  229.     print("State:", unpack(actions))
  230.     print("Current Epsilon:",epsilon)
  231.     print("Selected Action:", if chosenAction == 1 then "Move" else "Jump", "Epsilon:", isEpsilon)
  232.  
  233.     if distToGoal < 2 then
  234.         if HUMANOID_ROOT.CFrame ~= SPAWN.CFrame then
  235.             reward = 480 -- finishing obby reward is equal to passed16 reward * 1.5
  236.         end
  237.  
  238.         warn("Finished Simulation!")
  239.         HUMANOID_ROOT.CFrame = SPAWN.CFrame
  240.         ITERATION_GUI.IterationCount.Value += 1
  241.         warn('line 247 + 1')
  242.         ITERATION_GUI.Text = "Iteration: " .. tostring(ITERATION_GUI.IterationCount.Value)
  243.         FINISHES_GUI.FinishCount.Value += 1
  244.         FINISHES_GUI.Text = "Finishes: " .. tostring(FINISHES_GUI.FinishCount.Value)
  245.         PREVIOUS_DIST = (HUMANOID_ROOT.Position - GOAL.Position).Magnitude
  246.  
  247.         local compressed = OpenML.Resources.MLP.Compress(NETWORK, 'IEEE754')
  248.         NetworkStorage:SetAsync("EfficientNetwork1", compressed)
  249.         NetworkStorage:SetAsync("EfficientNetwork2", ITERATION_GUI.IterationCount.Value)
  250.         NetworkStorage:SetAsync("EfficientNetwork3", FINISHES_GUI.FinishCount.Value)
  251.         NetworkStorage:SetAsync("EfficientNetworkCFrame", {HUMANOID_ROOT.CFrame:GetComponents()})
  252.         NetworkStorage:SetAsync("EfficientNetworkSteps", steps)
  253.     end
  254.  
  255.     DQL:Learn({
  256.         State  = inputs,
  257.         Action = chosenAction,
  258.         Reward = reward - livingPenalty,
  259.     })
  260. end)
  261.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement