<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><span style="font-size: 14px;" class="">I have the following function to optimize</span><div style="font-size: 14px;" class=""><br class=""></div><div style="font-size: 14px;" class="">myfunction = max(p `div` c + p `mod` c)</div><div style="font-size: 14px;" class="">Here p is an array of numbers</div><div style="font-size: 14px;" class="">and c is also an array of numbers</div><div style="font-size: 14px;" class=""><br class=""></div><div style="font-size: 14px;" class="">I need to find c’s which minimize the value of my function. for example if p = [1,10000]. c = 2,8 or c = 1,9 or c=5,5</div><div style="font-size: 14px;" class="">number of c is length of p which is 2 (in this case). Sum of c is given as a constraint, so for example if sum is 10, then c’s can be 2,8 or 1,9 or 5,5 or 4,6 or…..etc etc. Length of c will be equal to length of p array. Hope the problem statement is clear</div><div style="font-size: 14px;" class=""><br class=""></div><div style="font-size: 14px;" class="">In haskell terms it will be,</div><div class=""><br class=""></div><div class=""><div style="font-family: -apple-system-font; font-size: 17px;" class="">let my_min  p c = foldl1 max $ zipWith (\p c -> (p `div` c) + (p `mod` c)) p c</div></div><div style="font-family: -apple-system-font; font-size: 17px;" class="">One way is to use various combinations of c using integer partitioning.</div><div style="font-family: -apple-system-font; font-size: 17px;" class=""><br class=""></div><div style="font-family: -apple-system-font; font-size: 17px;" class="">Now i wrote a crude parts function to do this</div><div style="font-family: -apple-system-font; font-size: 17px;" class=""><br class=""></div><div style="font-family: -apple-system-font; font-size: 17px;" class=""><div style="font-size: 15px;" class=""><div class="">nparts 0 = []</div><div class="">nparts n = [n] : [x:xs | x <- [1..n`div`2], xs <- nparts(n - x)]</div><div class=""><br class=""></div><div class="">which is a bad bad example of recursion coz it’s slow!</div><div class=""><br class=""></div><div class=""><div class=""><i class="">*Main> nparts 5</i></div><div class=""><i class="">[[5],[1,4],[1,1,3],[1,1,1,2],[1,1,1,1,1],[1,2,2],[1,2,1,1],[2,3],[2,1,2],[2,1,1,1]]</i></div></div><div class=""><br class=""></div><div class="">I can then filter this with length of p and get the required options of c</div><div class=""><br class=""></div><div class="">I can then call the function “ <span style="font-size: 17px;" class="">my_min</span>” with this list (simple map application)</div><div class=""><br class=""></div><div class="">Problem is if i do </div><div class=""><div class=""><div class="">*Main> filter (\x->length x == 2) $ nparts 100</div><div class="">[[1,99]</div></div></div><div class=""><br class=""></div><div class="">and it hangs…for a lot of time….so time constraint?</div><div class=""><br class=""></div><div class="">Any other approaches to this problem to make the partitions speedier. I know it’s an optimization problem…but all non linear optizers will use floats…and fail to converge…this is an integer optimizing problem.</div><div class=""><br class=""></div><div class="">Any ideas??</div><div class=""><br class=""></div><div class=""><br class=""></div></div></div><div class=""><br class=""></div></body></html>