Icon representing a recipe

Recipe: Band Wiggle 0.5.0

created by Pikamander2

Profile


Name
Band Wiggle 0.5.0
ID
103451
Shared with
Public
Parent
None
Children
None
Created on
April 27, 2020 at 10:34 AM UTC
Updated on
April 27, 2020 at 10:34 AM UTC
Description


  • 1. Add a random band to every segment

  • 2. Wiggle for one iteration

  • 3. Remove all bands

  • 4. Wiggle until no more improvement

Best for


Code


--https://foldit.fandom.com/wiki/Foldit_Lua_Functions#band.Add --https://foldit.fandom.com/wiki/Foldit_Lua_Function_band.Add --local segmentOrigin = 9; --local segmentXAxis = 49; --local segmentYAxis = 42; --local length = 1; --local theta = math.rad(30); --local phi = math.rad(45); --band.Add (segmentOrigin, segmentXAxis, segmentYAxis, length, theta, phi); --local segmentOrigin = 12; ----local segmentXAxis = 76; --local segmentYAxis = 32; --local length = 1; --local theta = math.rad(70); --local phi = math.rad(55); --band.Add (segmentOrigin, segmentXAxis, segmentYAxis, length, theta, phi); --local segmentOrigin = 4; --local segmentXAxis = 39; --local segmentYAxis = 11; --local length = 1; --local theta = math.rad(110); --local phi = math.rad(80); --band.Add (segmentOrigin, segmentXAxis, segmentYAxis, length, theta, phi); function randomize_seed() random_seed = os.time(); math.randomseed(random_seed); print("Using " .. random_seed .. " as the random seed"); --Lua's documentation recommends calling math.random() at least once before actually using it math.random(); end function switch_to_highest_power() if (behavior.HighPowerAllowed() == true) then behavior.SetWigglePower('h') else behavior.SetWigglePower('m') end end function get_random_float(lower, upper) return lower + math.random() * (upper - lower); end function add_random_bands_to_all_segments() print("Adding random bands to every segment...") selection.SelectAll(); num_segments = selection.GetCount(); selection.DeselectAll(); --TODO: Come up with a better way of picking the axes and whatnot for segment_index = 1, num_segments do local segmentOrigin = segment_index; local segmentXAxis = ((segment_index + 1) % num_segments) + 1; local segmentYAxis = ((segment_index + 2) % num_segments) + 1; local length = get_random_float(0.5, 5); local theta = get_random_float(0.01, 3.13); local phi = get_random_float(0.01, 6.27); band.Add(segmentOrigin, segmentXAxis, segmentYAxis, length, theta, phi); end end function wiggle_shake_until_done(min_improvement) if (min_improvement == nil or min_improvement == 0) then min_improvement = 1 end wiggle_shake_improvement = nil repeat score_before_wiggle_shake = current.GetScore(); structure.WiggleAll(1); structure.ShakeSidechainsAll(1); wiggle_shake_improvement = current.GetScore() - score_before_wiggle_shake; print("Wiggle shake improvement: " .. wiggle_shake_improvement); until (wiggle_shake_improvement < min_improvement) end function wiggle_until_done(min_wiggle_improvement) if (min_wiggle_improvement == nil or min_wiggle_improvement == 0) then min_wiggle_improvement = 1 end wiggle_improvement = nil repeat score_before_wiggle = current.GetScore() structure.WiggleAll(1) wiggle_improvement = current.GetScore() - score_before_wiggle print("Wiggle improvement: " .. wiggle_improvement) until (wiggle_improvement < min_wiggle_improvement) end randomize_seed(); behavior.SetClashImportance(1); switch_to_highest_power(); save.Quicksave(1); save.Quicksave(2); best_score = current.GetScore(); while (true) do score_before = current.GetScore(); print("Score at start of iteration: " .. score_before); add_random_bands_to_all_segments(); structure.WiggleAll(1); band.DeleteAll(); --wiggle_shake_until_done(1); wiggle_until_done(0.05); score_after = current.GetScore(); print("Score at end of iteration: " .. score_after); if score_after > best_score then print("Score is higher than: " .. best_score); best_score = score_after; save.Quicksave(2); else print("Score is lower than: " .. best_score); save.Quickload(2); end end

Comments