Advertisement
Guest User

Matlab solver

a guest
Oct 28th, 2020
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.89 KB | None | 0 0
  1. input = readmatrix('input_island');
  2.  
  3. alphas = input(1:1000, 1);
  4. covar = input(1001:end, :);
  5. vals = input(1:1000, 2);
  6. N = length(vals);
  7.  
  8. betas = optimvar('betas', N, 1);
  9. slack_var = optimvar('slack_var', 1, 'LowerBound', 0);
  10.  
  11. optimiser = optimproblem('ObjectiveSense', 'maximize');
  12. optimiser.Constraints.maxcons = betas <= alphas;
  13. optimiser.Constraints.mincons = 0 <= betas;
  14. optimiser.Objective = vals' * betas - 100 * slack_var;
  15.  
  16. optimiser
  17.  
  18. options = optimoptions(@linprog, 'Display', 'off');
  19. [xLin, fval, exitFlagInt, output] = solve(optimiser,'options',options);
  20.  
  21. assert(exitFlagInt == 1, "Did not converge");
  22.  
  23. threshold = 1e-2;
  24. iter = 1;
  25. betas_temp = xLin.betas;
  26. quad_form = betas_temp' * covar * betas_temp;
  27. slack_error = xLin.slack_var;
  28.  
  29. options = optimoptions(options, 'ConstraintTolerance', 1e-4);
  30. relative_err = 1;
  31.  
  32. fprintf('Starting loop at %s\n', datestr(now, 'HH:MM:SS'));
  33.  
  34. while relative_err > threshold
  35.     new_constr = 2 * betas_temp' * covar * betas - slack_var <= betas_temp' * covar * betas_temp;
  36.     new_constr_key = ['iteration', num2str(iter)];
  37.     optimiser.Constraints.(new_constr_key) = new_constr;
  38.    
  39.     [xLin, fval, exitFlagInt, output] = solve(optimiser, 'options', options);
  40.     assert(exitFlagInt == 1, "Did not converge");
  41.    
  42.     betas_temp = (betas_temp + xLin.betas) / 2;
  43.     % betas_temp = xLin.betas; % Use this or the one above
  44.    
  45.     quad_form = xLin.betas' * covar * xLin.betas;
  46.     slack_error = xLin.slack_var;
  47.     iter = iter + 1;
  48.  
  49.     relative_err = abs((slack_error - quad_form) / quad_form);
  50.    
  51.     if mod(iter, 100) == 99
  52.         fprintf("Status: %d %d %d %d\n", iter, slack_error, quad_form, relative_err);
  53.     end
  54.    
  55.     if relative_err <= 0.9
  56.         fprintf("Error reduced <= 90% at iter %d\n", iter);
  57.     end
  58. end
  59.  
  60. % the above while loop never terminates
  61. fprintf('Ended loop at %s\n', datestr(now, 'HH:MM:SS'));
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement