# how to run function 1000 times to find minimum

6 views (last 30 days)
Kangkeon Jeon on 14 Oct 2019
Commented: Rena Berman on 28 Oct 2019
i have a main function that eventually gives a score with randomized grouping of names. score is just one number calculated through function. I want to run this 1000 times to have 1000 scores and want to know minimum and know which grouping gave that score.
how can i do this?

per isakson on 16 Oct 2019
I restored the original subject line
Stephen Cobeldick on 16 Oct 2019
i have a main function that eventually gives a score with randomized grouping of names. score is just one number calculated through function. I want to run this 1000 times to have 1000 scores and want to know minimum and know which grouping gave that score.
how can i do this?
Rena Berman on 28 Oct 2019

per isakson on 14 Oct 2019
Edited: per isakson on 14 Oct 2019
Something like
S = struct( 'score', cell(1,1000), 'grouping', cell(1,1000) );
for jj = 1 :1000
S(jj).grouping = randomized_grouping_of_names();
S(jj).score = main_function( S(jj).grouping );
end
[~,ix_min] = min([S.score]);
S(ix_min)
In response to comment
What's in the file, FileName ?
FileName = ???
groupsize = ???
number_of_people = size(data, 2);
number_of_groups = ceil( number_of_people / groupsize );
S = struct( 'score', cell(1,N), 'grouping', cell(1,N) );
for jj = 1 : N
S(jj).grouping = generate_random_grouping( data, number_of_people, number_of_groups );
S(jj).score = score_grouping( data, S(jj).grouping, ~ );
end
[~,ix_min] = min([S.score]);
S(ix_min)
No good.
With substatial help from Walter
>> subject_scores = Jeon_clust( 'Biol_528_2019_sheet.xlsx', 3 )
subject_scores =
struct with fields:
score: 0.66667
grouping: {1×8 cell}
where
function S = Jeon_clust( FileName, groupsize )
N = 1000;
number_of_people = size(data, 2);
number_of_groups = ceil( number_of_people / groupsize );
S = struct( 'score', cell(1,N), 'grouping', cell(1,N) );
for jj = 1 : N
S(jj).grouping = generate_random_grouping( data, number_of_people, number_of_groups );
S(jj).score = sum_total_subject_score( data, S(jj).grouping, number_of_groups );
end
[~,ix_min] = min([S.score]);
S = S(ix_min);
end
and
function stss = sum_total_subject_score( data, grouping, number_of_groups )
subject_scores = score_grouping(data, grouping,number_of_groups);
group_ = [subject_scores{1:number_of_groups}];
group_scores = group_.';
diff_score = diff(group_scores);
total_subject_score = abs(sum(diff_score));
stss = sum(total_subject_score);
end

Kangkeon Jeon on 14 Oct 2019
FileName is excel file that contains all numbers to generate scores and names to generate groups.
per isakson on 14 Oct 2019
What is the size of the table data ?
Kangkeon Jeon on 14 Oct 2019
i attached the file!

Walter Roberson on 14 Oct 2019
N = 1000;
all_scores = zeros(1,N);
all_groupings = cell(1,N);
for iter = 1 : N
[all_scores(iter), all_groupings{N}] = generate_one_grouping_and_score_it();
end
[minscore, idx] = min(all_scores);
grouping_for_minscore = all_groupings{idx};
disp(minscore)
disp(grouping_for_minscore)

Show 1 older comment
Walter Roberson on 14 Oct 2019
Normally you would put it into a .m file and run the file.
Note that you will need to adjust the line
[all_scores(iter), all_groupings{N}] = generate_one_grouping_and_score_it();
to reflect the real name of your function. Also, this assumes that the function returns the grouping as well as the score (you need it to return the grouping in order to be able to display the grouping later.)
Kangkeon Jeon on 14 Oct 2019
i tried this but it gave "Insufficient number of outputs from right hand side of equal sign to satisfy assignment" error. am i doing this wrong?
Walter Roberson on 14 Oct 2019
function [best_score, best_grouping] = Jeon_clust(FileName, groupsize)
number_of_people = size(data, 2);
number_of_groups = ceil(number_of_people / groupsize);
number_of_questions = size(data, 1);
N = 1000;
all_scores = zeros(1,N);
all_groups = cell(1,N);
for iter = 1 : N
grouping = generate_random_grouping(data, number_of_people, number_of_groups);
subject_scores = score_grouping(data, grouping,number_of_groups);
group_ = [subject_scores{1:number_of_groups}];
group_scores = group_.';
diff_score = diff(group_scores);
total_subject_score = abs(sum(diff_score));
score = sum(total_subject_score);
all_scores(iter) = score;
all_groups{iter} = grouping;
end
[best_score, idx] = min(all_scores);
best_grouping = all_groups{idx};