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