第14回数理工学プログラムコンテスト課題 「効率的な施肥問題」説明資料 京都大学情報学研究科システム科学専攻 高橋研究室 M2 小笠原翔太 コンテスト発表資料2015/07/17 1 ゲーム概要 効率的な施肥問題 異なる形の肥料投下を組み合わせて施肥を完了させる. 必要施肥量 0 1 2 3 施肥完了! なるべく肥料の投下量を少なくする. コンテスト発表資料2015/07/17 2 ルール 盤面:n×nのマスからなる正方格子 各マス0~3の必要施肥量を設定 肥料の投下 一度に複数投下可能 凹型は90度ずつ回転可能 マップ外への投下は通常と同量の肥料を消費 終了条件・評価 全てのマスで必要施肥量が0以下となった時点で施肥完了 合計肥料消費量を比較 同量の場合は計算時間の合計で比較 コンテスト発表資料2015/07/17 3 例1(n=3) 消費肥料合計 十字のみ 凹型のみ ×6=30 ×5=25 ×7=28 畑の必要施肥料の合計 =1×4+2×3+3×2 =16 (*)これが肥料投下量の 下限値 四角形のみ ×1 必要施肥量 0 混合型 1 2 3 コンテスト発表資料2015/07/17 ×2 =23 ×2 問題の鍵: 四角形は比較的肥料消費が少ない 4 例2(n=3) 消費肥料合計 十字のみ 凹型のみ ×4=20 ×4=20 ×6=24 畑の必要施肥料の合計 =1×4+2×5 =14 四角形のみ ×1 =15 必要施肥量 0 混合型 ×2 1 2 3 コンテスト発表資料2015/07/17 問題の鍵: マップの模様によっては綺麗 な組み合わせが存在 5 例3 nが大きくなると難度が上がる 各盤面に対して最大6𝑛2 通りの置き方が存在. 一度の投下で1つ必要施肥量が減ると仮定すると 最大 𝑛𝑖=0 𝑛𝑗=0 𝑓(𝑖, 𝑗)回の投下が必要. ただし, 𝑓(𝑖, 𝑗)は座標 𝑖, 𝑗 での必要施肥量. 6𝑛2 𝑛 𝑖=0 𝑛 𝑗=0 𝑓(𝑖,𝑗) 重複を含めて全盤面は 𝑛 = 3, 𝑛𝑖=0 𝑛𝑗=0 𝑓(𝑖, 𝑗) = 1.5とすると 541.5∗9 = 2.4395839𝑒 + 23通り. コンテスト発表資料2015/07/17 通り存在. 6 コンテスト課題 「効率的な施肥問題」のなるべく肥料投下量が少なくなる 投下選択プログラムを作成し,優劣を競う 畑のパターンを10個用意 各問題に対してプログラムの結果を出力 全ての問題の肥料投下量の合計を競い,同着の場合は計算 時間の合計を競う 計算機室のPCでコンパイル・実行 コンテスト発表資料2015/07/17 7 準備 ファイルのダウンロード ページ名:第14回数理工学プログラムコンテスト URL: http://Infosys.sys.i.kyoto-u.ac.jp/~contest/2015/ プラットフォームとサンプルのダウンロードをクリック. ファイルの解凍 コマンド: $tar zxvf contest2015.tar.gz フォルダの中身 map1.bin map2.bin map3.bin ロード用マップ base.h platform.c cpu.c コアファイル kadai1.c sample.c kadai2.c kadai3.c 変更するファイル contest2015 コンテスト発表資料2015/07/17 8 使い方(1) - 手動で解く プラットフォームのコンパイル コマンド: $gcc –o platform platform.c プラットフォームの実行 コマンド: $./platform man MAPの生成方法を選択 (ロード:0,手動生成:1,ランダムに生成:2) まずは0を選択しマップ読み込み (map1.bin, map2.bin, map3.bin) (*) 途中経過の記録が可能. 投下情報を順に入力 投下中心の座標 (x,y) 投下型・方向を入力 (詳細は次ページ参照) コンテスト発表資料2015/07/17 9 使い方(2) - 投下情報の入力 座標系の設定 y 0 1 2 0 x 1 (*) 縦軸がx軸,横軸がy軸として表現されているので注意! 2 パターンごとの肥料投下先 例. 座標(1,1)への投下 1. 十字型 3. 四角形 コンテスト発表資料2015/07/17 2. 凹型 up down right left (*) 口が開いてる向きで命名. 10 エクササイズ:map1.binを解いて提出 途中結果を出力して提出して下さい 出力ファイル名はans.txtとして下さい. コンテスト発表資料2015/07/17 11 使い方(3) – マップを作成 手動で作成 選択肢Manual:1を選択し,各マスに値(0~3)を設定. binファイル形式でマップを保存可能. マップをプログラムで作りたい人は… bin形式のファイルをプログラムで作ることも可能. platform.cのマップ生成部分(generate_map関数)を参考にしてください. コンテスト発表資料2015/07/17 12 使い方(4)-プログラムで解く サンプルプログラムのコンパイル コマンド: $gcc –o cpu cpu.c sample.c 実行 コマンド: $./platform cpu 手動の場合と同様に初期マップを選択してスタート. (*) ステップ毎の表示,途中経過のファイル出力が可能. 以上をMAP_SIZE (base.hで定義)を変えて試してみよう. (*) 各プログラムの再コンパイルが必要. コンテスト発表資料2015/07/17 13 サンプルプログラムの説明 アルゴリズム マップ左上から順に必要施肥量をチェック,値が正のマスを発見次 第そのマスを中心に四角形を投下する 関数my_solutionの入力は二つ int型二次元配列MAP マップの現在の状況 THROW_TARGET型配列my_trgt 投下選択の書き込みに利用 (*) my_trgtに書き込んだ後, my_solution関数が戻り値を返す までマップには反映されません. 0番からTARGET_NUMBER-1番まで 課題では0番のみ使用 プログラムはマップの状況を見て投下選択を行うことに集中. その他の処理はcpu.cやplatform.cで行われる. コンテスト発表資料2015/07/17 14 プログラムの構成 構成図 実行可能ファイル1 platform.c ヘッダファイル base.h 生成 platform mapinfo.tmp 参照 tmpで仲介 answer.tmp cpu.c sample.c 生成 cpu 実行可能ファイル2 (*) 基本的に変えるのはsample.cやkadai*.c コンテスト発表資料2015/07/17 15 構造体・列挙型定数の定義 構造体 投下情報を一括管理 座標 型 方向 struct THROW_TARGET={ int x, int y, trw_type type, trw_drct drct} 列挙型 投下型と投下方向 0 2 1 enum trw_type={cross, concave, square} 0 1 2 3 enum trw_drct={up, down, right, left} コンテスト発表資料2015/07/17 16 静的変数の定義 投下選択で利用される静的変数 定義はbase.hに記述されているためsample.cで利用可能 static THROW_TARGET init_trgt={0,0,square,up}; static THROW_TARGET null_trgt={-10,-10,-10,-10}; (*)これらはmy_trgt配列に初期値として代入される. platform側ではmy_trgt配列(実際にはtmpファイルを介して得られたコピー) を先頭から順に見てnull_trgt以外を有効な投下選択と判断する. コンテスト発表資料2015/07/17 17 プログラムの注意点1 my_solution関数に渡されるマップは施肥が未完了 cpu側で終了条件を考慮する必要はない my_solutionに渡されるmy_trgt配列の初期値 my_trgt[0]=init_trgt={0,0,square,up} my_trgt[1]=my_trgt[2]=…=my_trgt[TARGET_NUMBER]=null_trgt={10,-10,-10,-10} null_trgtはマップに反映されない選択 同時選択可能な数の上限はTARGET_NUMBER(= MAP_SIZE2 ) (*) 複数パターンの組み合わせで一手を決めるような場合 などは0番以降をうまく利用してください. コンテスト発表資料2015/07/17 18 プログラムの注意点2 my_trgt配列を初期化する関数refresh_trgt 配列の状態を初期状態に戻す. 仕様書参照. my_trgt[i]=null_trgtとすればmy_trgt[i]は反映されなくなる. 選択情報の書き方に関する注意 type=square,crossならdrctは0~3のどれでも関係ない. コンテスト発表資料2015/07/17 19 問題1 マップの数値の高いマスから順に投下するプログラム.最 初にマップ全体の高低差をならす. my_trgtは配列で渡されているので参照渡しとなる. my_trgt[0]にはinit_trgtが代入されていることに注意. コンテスト発表資料2015/07/17 20 問題2 全マスに対して四角形を置いてみて最良の座標に投下する プログラム. wasted_csmp関数は一マス単位の計算を行う. wcsmp_square関数は四角形全体の計算を行う. wasted_csmpは一座標に 対する無駄な肥料消費を 計算 に対し wcsmp_squareは四角形 全体に対する無駄な肥 料消費を計算 コンテスト発表資料2015/07/17 21 問題3 問題2の発展版 wcsmp_squareは四角形に対する処理 十字,凹型に対してはどう書けば良いだろう? 凹型は回転を考慮する必要がある. コンテスト発表資料2015/07/17 22 キーワード アルゴリズム作成時に参考にするキーワード 組み合わせ最適化 分枝限定法 動的計画法 強化学習 GA 貪欲法 α-β探索 etc. コンテスト発表資料2015/07/17 23
© Copyright 2024 Paperzz