Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [ Tower,Error,time] = tower(bricks,number,time)
- if floor(number) ~= ceil(number)
- error('Number of towers must be integer');
- end
- clock = tic; number=abs(number); % Starts the countdown
- lengthBricks = length(bricks);
- towers = zeros(number,lengthBricks);
- bricks = sort(bricks,'descend');
- avgWeight = sum(bricks)/number; % Bestemmer gjennomsnittlig høyde
- if number == 2 || number == lengthBricks/2
- if mod(length(bricks),number)~=0
- bricks = [bricks zeros(1,number-mod(length(bricks),number))];
- end
- Tower(:,1) = bricks(1:lengthBricks/2);
- Tower(:,2) = fliplr(bricks(lengthBricks/2+1:end));
- Error = std(sum(Tower,2)); time = toc(clock);
- if number == lengthBricks/2;
- Tower = Tower';
- end
- return
- end
- if lengthBricks < 10^6
- j = 1;
- for i = 1:lengthBricks
- [~,I] = min(sum(towers,2));
- j = j + (mod(i+1,number)==0);
- towers(I,j) = bricks(i);
- end
- towers = sort(towers,2,'descend');
- % Fjerner unødvendige nuller
- for j = 1:lengthBricks
- if sum(towers(:,j))==0
- Tower = towers(:,1:j-1);
- break
- end
- end
- Error = std(sum(Tower,2));
- [~,m] = size(Tower);
- if time-toc(clock) <= 0
- return
- end
- avgWeight = sum(bricks)/number; % Bestemmer gjennomsnittlig høyde
- towers = zeros(number,lengthBricks);% Lager en tom matrise en kan putte inn tall
- tempBricks = bricks;
- for i = 1:number
- j = 0;
- while sum(towers(i,:)) < avgWeight
- if time - toc(clock) <=0
- return
- elseif sum(towers(i,:)) + tempBricks(1) > avgWeight
- break
- else
- j = j + 1;
- towers(i,j) = tempBricks(1);
- tempBricks(1) = [];
- end
- end
- end
- towers = sort(towers,2,'descend');
- if time - toc(clock) <= 0
- return
- end
- for k = 1:length(tempBricks)
- [~,I] = min(sum(towers,2));
- towers(I,find(towers(I,:)==0, 1, 'first')) = tempBricks(k);
- if time-toc(clock) <= 0
- return
- end
- end
- towers = sort(towers,2,'descend');
- % Fjerner unødvendige nuller
- for j = 1:lengthBricks
- if sum(towers(:,j))==0
- towers = towers(:,1:j-1);
- break
- end
- end
- [n,m] = size(towers);
- Error = std(sum(towers,2))
- if std(sum(towers,2)) < Error
- Tower = towers;
- Error = std(sum(towers,2));
- end
- if toc(clock)>=time
- return
- elseif Error > 0
- % bricks = [bricks' zeros(1,number*(m-lengthBricks/number))];
- if mod(length(bricks),number)~=0
- bricks = [bricks' zeros(1,number-mod(length(bricks),number))];
- end
- lengthBricks = length(bricks);
- while toc(clock) < time
- tempw = reshape(bricks(randperm(lengthBricks)),[number,lengthBricks/number]);
- E = std(sum(tempw,2));
- if E < Error
- Tower = tempw;
- Error = E;
- end
- end
- Tower = sort(Tower,2,'descend');
- time = toc(clock);
- end
- else
- % If there are more than 10^6 elements, just randomize
- if mod(length(bricks),number)~=0
- bricks = [bricks zeros(1,number-mod(length(bricks),number))];
- end
- lengthBricks = length(bricks);
- Tower = reshape(bricks,[lengthBricks/number,number]);
- sum(Tower,2);
- Error = std(sum(Tower,2));
- while toc(clock) < min(time,600) %Maximum randomization time is ten minutes
- tempw = reshape(bricks(randperm(lengthBricks)),[number,lengthBricks/number]);
- E = std(sum(tempw,2));
- if E < Error
- Tower = tempw;
- Error = E;
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment