Asked by Kangkeon Jeon
on 14 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?

Answer by per isakson
on 14 Oct 2019

Edited by per isakson
on 14 Oct 2019

Accepted Answer

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 = ???

data = readtable( FileName, 'ReadRowNames', true );

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;

data = readtable( FileName, 'ReadRowNames', true );

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!

Sign in to comment.

Answer by 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)

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

Walter Roberson
on 14 Oct 2019

function [best_score, best_grouping] = Jeon_clust(FileName, groupsize)

data = readtable(FileName, 'ReadRowNames', true);

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};

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 3 Comments

## per isakson (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/485118-how-to-run-function-1000-times-to-find-minimum#comment_756814

## Stephen Cobeldick (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/485118-how-to-run-function-1000-times-to-find-minimum#comment_756821

## Rena Berman (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/485118-how-to-run-function-1000-times-to-find-minimum#comment_760774

Sign in to comment.