7月17日配付資料のダウンロード - 京都大学 大学院 情報学研究科

第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