Guest User

Untitled

a guest
Nov 23rd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.42 KB | None | 0 0
  1. #! /usr/bin/ruby
  2. require 'Problem'
  3. require 'logger'
  4.  
  5. loadFile   = ARGV[0] ? ARGV[0] : "problems.csv"
  6. answerFile = ARGV[1] ? ARGV[1] : "answer.txt"
  7.  
  8. pReader = ProblemReader.new()
  9. problem = pReader.load(loadFile)
  10.  
  11. answerOut = open(answerFile, "w")
  12.  
  13. turn_max = 3000000 # これを超えたら、その問題はあきらめる
  14. level_overlap = 10
  15. logger = Logger.new('result.log')
  16.  
  17. # 各問題に対して、個別最適解の探索
  18. for b in 0..(problem.boardList.size-1)
  19.  
  20.   board = problem.boardList[b]
  21.   if (board.w * board.h > 12) then # このやり方では、3*4 や 4*3 が限界
  22.     logger.info "[#{board.w},#{board.h}]#{board.key} -> #{board.endStatus()} : PASS!"
  23.     answerOut.puts("")
  24.     next
  25.   end
  26.  
  27.   ss = State.new(board, "")
  28.   ss.printState("StartState")
  29.   stateMap   = { ss.key() => ss }
  30.   stateQueue = StateQueue.new (ss.board.w + ss.board.h)
  31.   stateQueue.enqueue ss
  32.  
  33.   turn = 0
  34.   result = nil
  35.   while (result==nil && turn < turn_max && stateQueue.size()>0)
  36.    
  37.     state = stateQueue.dequeue
  38.  
  39.     l, r, u, d =  state.board.movable?()
  40.     ["l","r","u","d"].each do |dir|
  41.       if eval(dir)
  42.         ns = state.move(dir) # NextState
  43.         unless stateMap.include?(ns.key) then # その状態が機知のものでなければ、下記実行
  44.           w_filled, h_filled = ns.board.check()
  45.           if w_filled || h_filled
  46.             ns.board.uf += 1 if w_filled
  47.             ns.board.lf += 1 if h_filled
  48.             if ns.isEnd?()
  49.               result  = ns.minPath
  50.             end
  51.           end
  52.           stateQueue.enqueue ns
  53.           stateMap[ns.key] = ns
  54.         end
  55.       end
  56.     end
  57.     turn += 1
  58.     if turn % 10000 == 0
  59.       last = "(#{state.board.uf},#{state.board.lf})#{state.minPath}"
  60.       p "[b]#{b}, [turn]#{turn}, [qs]#{stateQueue.to_s()}, [hs]#{stateMap.size} [last]#{last}"
  61.     end
  62.   end
  63.   if result != nil # 見つかった
  64.     logger.info "[#{b}][#{ss.board.w},#{ss.board.h}]#{ss.key} -> #{ss.board.endStatus()} : #{result}"
  65.     answerOut.puts("#{result}")
  66.     print "### result ### : [#{ss.board.w},#{ss.board.h}]#{ss.key} -> #{ss.board.endStatus()} : #{result} \n"
  67.   else             # 見つからなかった
  68.     logger.info "[#{b}][#{ss.board.w},#{ss.board.h}]#{ss.key} -> #{ss.board.endStatus()} : not_found"
  69.     answerOut.puts("")
  70.     print "### result ### : [#{ss.board.w},#{ss.board.h}]#{ss.key} -> #{ss.board.endStatus()} : not_found \n"
  71.   end
  72. end
  73.  
  74. answerOut.close()
Add Comment
Please, Sign In to add comment