Guest User

TowerHeight

a guest
Dec 19th, 2014
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.86 KB | None | 0 0
  1. function [ Tower,Error,time] = tower(bricks,number,time)
  2.  
  3. if floor(number) ~= ceil(number)
  4.     error('Number of towers must be integer');
  5. end
  6.  
  7. clock = tic; number=abs(number); % Starts the countdown
  8.  
  9. lengthBricks = length(bricks);
  10. towers = zeros(number,lengthBricks);
  11. bricks = sort(bricks,'descend');
  12. avgWeight = sum(bricks)/number;     % Bestemmer gjennomsnittlig høyde
  13.  
  14. if number == 2 || number == lengthBricks/2
  15.     if mod(length(bricks),number)~=0
  16.         bricks = [bricks zeros(1,number-mod(length(bricks),number))];
  17.     end
  18.     Tower(:,1) = bricks(1:lengthBricks/2);
  19.     Tower(:,2) = fliplr(bricks(lengthBricks/2+1:end));
  20.     Error = std(sum(Tower,2)); time = toc(clock);
  21.     if number == lengthBricks/2;
  22.        Tower = Tower';
  23.     end
  24.     return
  25. end
  26.  
  27. if lengthBricks < 10^6
  28.    
  29.     j = 1;        
  30.     for i = 1:lengthBricks
  31.         [~,I] = min(sum(towers,2));
  32.         j = j + (mod(i+1,number)==0);
  33.         towers(I,j) = bricks(i);
  34.     end  
  35.     towers = sort(towers,2,'descend');
  36.     % Fjerner unødvendige nuller
  37.     for j = 1:lengthBricks
  38.         if sum(towers(:,j))==0
  39.             Tower = towers(:,1:j-1);
  40.             break
  41.         end
  42.     end
  43.     Error = std(sum(Tower,2));
  44.     [~,m] = size(Tower);
  45.    
  46.  
  47.    
  48.     if time-toc(clock) <= 0
  49.         return
  50.     end
  51.        
  52.     avgWeight = sum(bricks)/number;     % Bestemmer gjennomsnittlig høyde
  53.     towers = zeros(number,lengthBricks);% Lager en tom matrise en kan putte inn tall
  54.     tempBricks = bricks;
  55.  
  56.     for i = 1:number
  57.         j = 0;
  58.         while sum(towers(i,:)) < avgWeight
  59.             if time - toc(clock) <=0
  60.                 return
  61.             elseif sum(towers(i,:)) +  tempBricks(1) > avgWeight
  62.                 break
  63.             else
  64.                 j = j + 1;
  65.                 towers(i,j) =  tempBricks(1);
  66.                 tempBricks(1) = [];
  67.             end
  68.         end
  69.     end
  70.  
  71.     towers = sort(towers,2,'descend');
  72.  
  73.     if time - toc(clock) <= 0
  74.         return
  75.     end
  76.  
  77.     for k = 1:length(tempBricks)
  78.         [~,I] = min(sum(towers,2));
  79.         towers(I,find(towers(I,:)==0, 1, 'first')) =  tempBricks(k);
  80.         if time-toc(clock) <= 0
  81.             return
  82.         end
  83.     end
  84.  
  85.     towers = sort(towers,2,'descend');
  86.     % Fjerner unødvendige nuller
  87.     for j = 1:lengthBricks
  88.         if sum(towers(:,j))==0
  89.             towers = towers(:,1:j-1);
  90.             break
  91.         end
  92.     end
  93.         [n,m] = size(towers);
  94.         Error = std(sum(towers,2))
  95.        
  96.     if std(sum(towers,2)) < Error
  97.         Tower = towers;
  98.         Error = std(sum(towers,2));
  99.     end
  100.  
  101.     if toc(clock)>=time
  102.         return
  103.     elseif Error > 0
  104. %            bricks = [bricks' zeros(1,number*(m-lengthBricks/number))];
  105.         if mod(length(bricks),number)~=0
  106.             bricks = [bricks' zeros(1,number-mod(length(bricks),number))];
  107.         end
  108.         lengthBricks = length(bricks);
  109.  
  110.         while toc(clock) < time
  111.             tempw = reshape(bricks(randperm(lengthBricks)),[number,lengthBricks/number]);
  112.             E = std(sum(tempw,2));
  113.             if E < Error
  114.                 Tower = tempw;
  115.                 Error = E;
  116.             end
  117.         end
  118.     Tower = sort(Tower,2,'descend');
  119.     time = toc(clock);
  120.     end
  121. else
  122.     % If there are more than 10^6 elements, just randomize
  123.    
  124.     if mod(length(bricks),number)~=0
  125.         bricks = [bricks zeros(1,number-mod(length(bricks),number))];
  126.     end
  127.     lengthBricks = length(bricks);
  128.    
  129.     Tower = reshape(bricks,[lengthBricks/number,number]);
  130.     sum(Tower,2);
  131.     Error = std(sum(Tower,2));
  132.    
  133.     while toc(clock) < min(time,600) %Maximum randomization time is ten minutes
  134.         tempw = reshape(bricks(randperm(lengthBricks)),[number,lengthBricks/number]);
  135.         E = std(sum(tempw,2));
  136.         if E < Error
  137.             Tower = tempw;
  138.             Error = E;
  139.         end
  140.     end
  141.  
  142. end
Advertisement
Add Comment
Please, Sign In to add comment