Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.87 KB | None | 0 0
  1. def f2(n)
  2.  
  3. n = (n * 3 + 1) / 2 while (n % 2 == 1)
  4. n /= 2 while (n % 2 == 0)
  5. return n
  6.  
  7. end
  8.  
  9. def adv(x)
  10.  
  11. n1 = n = x['n']
  12. l = [n]
  13. while (n >= n1 && n != 1)
  14.  
  15. n = f2(n)
  16. l << n
  17. end
  18.  
  19.  
  20. x['l'] = l
  21. x['ls'] = l.size
  22.  
  23. x['ns'] = x['n'].to_s(2).length
  24. x['h'] = x['ls'].to_f / x['ns']
  25. x['h2'] = (x['h'] * $g).to_i
  26.  
  27. return x
  28.  
  29. end
  30.  
  31. def next2(z)
  32.  
  33. l = [z]
  34. p = z['p'] + 1
  35.  
  36. l << adv({'n'=>z['n'] + 2**p, 'p'=>p})
  37. l << z.merge({'p'=>p})
  38. return l
  39. end
  40.  
  41. def insert(l, x)
  42. l << x
  43. end
  44.  
  45. def delete(l, j)
  46. z = l.delete_at(j)
  47. return z
  48. end
  49.  
  50. def sum(l)
  51.  
  52. t = 0
  53. l.each { |x| t += x }
  54. return t
  55. end
  56.  
  57. def stat(l)
  58. t = t2 = 0
  59. l.each \
  60. {
  61. |x|
  62. t += x
  63. t2 += x ** 2
  64. }
  65. c = l.size
  66. a = t.to_f / c
  67. z = t2.to_f / c - a ** 2
  68. sd = Math.sqrt(z < 0 ? 0 : z)
  69.  
  70. return a, sd, l.max.to_f, l.min.to_f
  71. end
  72.  
  73. def dist(l)
  74.  
  75. l2 = []
  76. l.each_with_index \
  77. {
  78. |x, i|
  79. h = x[1]['h2']
  80. l2[h] = [] if (l2[h].nil?)
  81. l2[h] << i
  82. }
  83. l1 = (0...l2.size).sort_by { |i| l2[i].nil? ? 0 : l2[i].size }
  84.  
  85. return l2, l1
  86. end
  87.  
  88. def rank(l1, l2)
  89.  
  90. l1h, l1s = dist(l1)
  91. l2h, l2s = dist(l2)
  92.  
  93. j = l1s.find { |x| !l2h[x].nil? && (l1h[x].nil? || l1h[x].size < $n) }
  94.  
  95. j = l2h.size - 1 if (j.nil?)
  96. k = l2s.find { |x| !l2h[x].nil? }
  97.  
  98. l = (0...l2.size).to_a
  99. l = l.sort_by { |x| l2[x][1]['ls'] }
  100. k = l.find { |x| x != j }
  101.  
  102.  
  103. return l2h[j][rand(l2h[j].size)], k
  104.  
  105. end
  106.  
  107. def opt(c)
  108.  
  109. l = []
  110. l1 = []
  111.  
  112. insert(l, next2({'n'=>1, 'p'=>0}))
  113.  
  114.  
  115. puts('# ' + Time.now.to_s)
  116. t = Time.now.to_i
  117.  
  118. c.times \
  119. {
  120. |i|
  121. $stderr.puts([i, sprintf('%.1fm', (Time.now.to_i - t) / 60.0), Time.now.to_s].join("\t")) if (i % 100 == 0)
  122.  
  123. j, k = rank(l1, l)
  124.  
  125. if (l.size > 1000) then
  126.  
  127. z2 = delete(l, [j, k].max)
  128. z1 = delete(l, [j, k].min)
  129.  
  130. l1 += [z1, z2]
  131. z = j < k ? z1 : z2
  132. else
  133. z = delete(l, j)
  134. l1 += [z]
  135. end
  136.  
  137. insert(l, next2(z[1]))
  138. insert(l, next2(z[2]))
  139.  
  140. $stdout.flush
  141. }
  142.  
  143. puts('# ' + Time.now.to_s)
  144. return l1.map { |x| x[1] }
  145. end
  146.  
  147. def stat2(l, t)
  148. return stat(l).map { |x| x / t }
  149. end
  150.  
  151. def stat1(l)
  152. l1 = stat(l)
  153. l1 = l1.map { |x| sprintf("%.3f", x).to_f }
  154. return {'a' => l1[0], 'sd' => l1[1], 'mx' => l1[2], 'mn' => l1[3] }
  155. end
  156.  
  157. def d(s)
  158. c = s.split('').select { |x| x == '1' }.size
  159. d = c.to_f / s.length
  160. return d
  161.  
  162. end
  163.  
  164. def data(x)
  165.  
  166. n = x['n']
  167. ns = n.to_s(2)
  168. nl = ns.length
  169. m = nl / 2
  170.  
  171. nsh = ns[0..m]
  172. nsl = ns[m..-1]
  173.  
  174. asdm1 = stat2(ns.split(/0+/).map { |y| y.length }, nl)
  175.  
  176. l1 = ns.split(/1+/)
  177. l1.shift
  178. asdm0 = stat2(l1.map { |y| y.length }, nl)
  179.  
  180. return [nl, x['ls'], x['h2'], d(ns), d(nsh), d(nsl), asdm1].flatten
  181. end
  182.  
  183. def out(fn, l)
  184.  
  185. f = File.open("#{fn}.txt", 'w')
  186. l.each { |x| f.puts(x.join("\t")) }
  187. f.close
  188.  
  189. end
  190.  
  191. def sample(c)
  192.  
  193. l = opt(c)
  194.  
  195. a = {}
  196. h = {}
  197. l.each \
  198. {
  199. |x|
  200. n = x['n']
  201. h2 = x['h2']
  202.  
  203. h[h2] = h.fetch(h2, {}).merge!({ n => nil })
  204. a[n] = x
  205. }
  206. # h.sort.each { |k, v| p([k, v.size]) }; exit;
  207.  
  208.  
  209. l3 = []
  210.  
  211. c1 = 10
  212.  
  213. h1 = h.select { |k, v| v.size >= c1 }.sort
  214.  
  215. h1.each_with_index \
  216. {
  217. |kv, n|
  218.  
  219. k, v = kv
  220. l1 = v.keys.sort
  221.  
  222. c1.times \
  223. {
  224. |i|
  225. n = l1[(i.to_f / (c1 - 1) * (l1.size - 1)).to_i]
  226. l3 << a[n]
  227. }
  228. }
  229.  
  230. l2 = l3.map { |x| data(x) }
  231.  
  232. return l2
  233.  
  234. end
  235.  
  236. def av(l)
  237. return nil if (l.empty?)
  238. return sum(l) / l.size
  239. end
  240.  
  241. def d0(p, d, l, j, z0)
  242.  
  243. r = (0...p.size)
  244. r0 = r.select { |x| !d[x].finite? }
  245.  
  246. if (!r0.empty?) then
  247.  
  248. r0.each \
  249. {
  250. |x|
  251. $l << ['+', j, l[x]] if (p[x][$c] != z0)
  252. }
  253. return av(r0.map { |x| p[x][$c] })
  254. end
  255.  
  256. t = sum(d)
  257. w = d.map { |x| x / t }
  258.  
  259. z = 0
  260. r.each { |x| z += (w[x] * p[x][$c]) }
  261.  
  262. r.each \
  263. {
  264. |x|
  265. w0 = w[x] * p.size
  266. p0 = w0 * p[x][$c]
  267. $l << [{true => '+', false => '-'}[p0 > z0], j, l[x]]
  268. }
  269. return z
  270.  
  271. end
  272.  
  273. def near2(l, j, a)
  274.  
  275. l3 = a['l']
  276. l2 = []
  277. l1 = {'a' => ['a'], 'b' => ['a'], 'c' => ['a', 'b']}[$b[j]]
  278. l.size.times \
  279. {
  280. |i|
  281. next if (i == j)
  282. next if (!l1.member?($b[i]))
  283. d = 0
  284. l3.each { |x| d += (l[i][x] - l[j][x]) ** 2 }
  285. l2 << {'i' => i, 'd' => d}
  286. }
  287. l2 = l2.sort_by { |x| x['d'] }
  288.  
  289. r = (0..a['r'])
  290. l4 = r.map { |x| l2[x]['i'] }
  291. p = l4.map { |x| l[x] }
  292.  
  293. return d0(p, r.map { |x| 1.0 / l2[x]['d'] }, l4, j, l[j][$c])
  294. end
  295.  
  296.  
  297. def inc(x, y)
  298. x['t'] += y
  299. x['c'] += 1
  300. return x
  301. end
  302.  
  303. def avg(x)
  304. return x['t'] / x['c']
  305. end
  306.  
  307. def reshuffle()
  308.  
  309. l = $b.select { |x| x != 'c' }.shuffle
  310. $b[0...l.size] = l
  311. end
  312.  
  313. def near(l, l3)
  314.  
  315. reshuffle()
  316. s = {'t' => 0.0, 'c' => 0}
  317.  
  318. e2 = {'a' => s.dup, 'b' => s.dup, 'c' => s.dup}
  319. $l = []
  320.  
  321. l.size.times \
  322. {
  323. |i|
  324. x = near2(l, i, l3)
  325. e = (l[i][$c] - x) ** 2
  326. inc(e2[$b[i]], e)
  327. }
  328. return Hash[e2.keys.map { |x| [x, avg(e2[x])] }]
  329. end
  330.  
  331. def abc(n)
  332.  
  333. $b = []
  334. a = {'a' => 3, 'b' => 2, 'c' => 1}
  335.  
  336. t = sum(a.values)
  337. a.each \
  338. {
  339. |k, v|
  340. $b += [k] * (v.to_f / t * n).to_i
  341. }
  342. $b[$b.size...n] = [a.keys.last] * (n - $b.size)
  343.  
  344. end
  345.  
  346. def subset(l2)
  347.  
  348. l1 = (2..l2.size).to_a
  349. c = l1.delete_at(rand(l1.size))
  350. l3 = []
  351. c.times { l3 << l2.delete_at(rand(l2.size)) }
  352. return l3
  353. end
  354.  
  355. def subset2(l2, i2)
  356. l2 = l2.dup
  357. x = l2.pop
  358. l = subset(l2) + ((i2 == 1) ? [x] : [])
  359. a = {'l' => l.sort, 'r' => 10}
  360. return a
  361. end
  362.  
  363. def compare(l, n, i0 = nil)
  364.  
  365. $x = {} if ($x.nil?)
  366. $x[n] = {'s' => {}, 'l' => []} if (!$x.member?(n))
  367. s = $x[n]['s']
  368. l0 = $x[n]['l']
  369.  
  370. m = l[0].size - 1
  371. l2 = (($c + 1)..m).to_a
  372. i = 0
  373.  
  374. begin
  375. i2 = i % 2
  376. l3 = subset2(l2, i2)
  377.  
  378. next if (s.member?(l3))
  379.  
  380. s[l3] = nil
  381. l0 << near(l, l3).merge({'l3' => l3, 'i2' => i2})
  382.  
  383. i += 1
  384. end while (i < 10)
  385.  
  386. l0 = l0.select { |x| x['i2'] == i0 } if (!i0.nil?)
  387. l0.sort_by! { |x| x['a'] }
  388. x = l0.shift.merge({ 'm' => m })
  389. $f[n].puts('# ' + x.inspect)
  390. $f[n].flush
  391. return x
  392. end
  393.  
  394. def opt0(l, l3, n)
  395.  
  396. ls = l.size
  397. l = l.transpose
  398. l << [0] * ls
  399. l = l.transpose
  400.  
  401. w = l[0].size - 1
  402. l3 += [w]
  403. a = {'l' => l3, 'r' => 10}
  404.  
  405. m = nil
  406. x0 = nil
  407. c = 0
  408. loop \
  409. {
  410. x = near(l, a)
  411. x0 = x if (x0.nil?)
  412. $f[n].puts(x.values_at('a', 'b', 'c').join("\t"))
  413. $f[n].flush
  414.  
  415. x['l'] = l.transpose[-1]
  416. if (m.nil? || x['a'] < m['a']) then
  417. m = x
  418. c = 0
  419. else
  420. c += 1
  421. end
  422. break if (c == 5)
  423.  
  424. $l.shuffle
  425. f = 0.1
  426.  
  427. $l.each \
  428. {
  429. |d, a, b|
  430.  
  431. a, b = [a, b].sort_by { |x| l[x][w] }
  432. a, b = [b, a] if (d == '-')
  433.  
  434. l1 = l[a]
  435. l2 = l[b]
  436.  
  437. l1[w] = (l1[w] == 0) ? f : l1[w] * (1 - f)
  438. l2[w] = (l2[w] == 0) ? f : l2[w] * (1 + f)
  439. }
  440. }
  441.  
  442. l = l.transpose
  443. l[-1] = m['l']
  444. l = l.transpose
  445. $f[n].puts
  446. return l
  447. end
  448.  
  449. def opt1(l)
  450.  
  451. x = compare(l, 1)
  452.  
  453. l = opt0(l, x['l3']['l'], 1)
  454. return l
  455. end
  456.  
  457. def opt2(l)
  458. $i = 0 if ($i.nil?)
  459. $i += 1
  460. x = compare(l, 2, $i % 2)
  461. l = opt0(l, x['l3']['l'], 2)
  462. return l
  463. end
  464.  
  465. def opt3(l)
  466. l = opt0(l, (($c + 1)...l[0].size).to_a, 3)
  467. end
  468.  
  469. $n = 40
  470. $g = 50
  471. l = sample(1000)
  472. l.shuffle!
  473. ls = l.size
  474.  
  475. $stderr.puts("ls=#{ls}")
  476.  
  477. # out('out', l)
  478.  
  479. abc(ls)
  480.  
  481. $c = 2
  482.  
  483. l1 = l.dup
  484. l2 = l.dup
  485. l3 = l.dup
  486. $f = {}
  487. (1..3).each { |i| $f[i] = File.open("out#{i}.txt", 'w') }
  488.  
  489. loop \
  490. {
  491. l1 = opt1(l1)
  492. l2 = opt2(l2)
  493. l3 = opt3(l3)
  494. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement