(農業)情報工学・課題 (2016/10/27)

水稲の生育予測プログラムの作成(2)

改良型生育モデル
今回は、水稲の生育を予想するプログラムに改良を加える。基本とする考え方は、先週の【積算気温モデル】をベースにしている。
今回の課題では、品質と収量に関するモデルを組み込んでみる。また、寒冷地での栽培と暖地での栽培も模式化してみたい。 ただ、モデルを複数組み合わせて同時に動作させた場合、結果の評価が難しくなるため、それぞれのモデル自体は単純化している。そのため、現実の挙動とは異なる場合も含まれると思うが、あくまでモデル構築実験と割り切って理解して欲しい。

今回の課題で取り扱うのは、先週と同じく「単純積算気温モデル」とする。
代表的な品種である「コシヒカリ」を考え、田植えからの積算気温が1650度で出穂し、その後950度で登熟が完了して、収穫日となるという前提は、先週と同一である。
今回は、さらに、収量(yield)に影響を与える因子(yfactor)と、価格(price)又は品質に影響を与える因子(pfactor)をモデル化する。当初の因子は、どちらも初期値を1.0とし、影響があれば、少しずつ(0.01 から 0.1)値を変化させる。
具体例で示す。(モデル化する場合には、自分で重要と思った物を組み込む。複数の因子をモデル化する事が好ましいが、ここの例示したすべての因子をモデル化しなくても無い。)
  1. 幼苗期に低温に晒されたため発生する生育障害 : 田植え後20日以内に例えば平均気温が15度以下(又は最低気温が10度以下)になった場合、1日につき(あるいは1度につき)yfactorを、0.01減らす。
  2. 登熟期の低温で発生する「イモチ」病 : 出穂後、平均気温が20度を下回った場合、yfactorを20度以下の気温x0.01減らす。【サンプルでは、予めこのモデルが組み込んである。】
  3. 夏場の高温に晒された事による食味の低下 : 平均気温が28度を超えた場合、pfactorを0.01減らす。
  4. 収穫日の当日雨が降った事による、胴割れ米の発生 : 収穫予定日の降水量が3mmを超えた場合、pfactorを0.05減らす。収穫可能日まで、それを続ける。この場合、収穫可能日は、少しずつ変化することになる。
  5. その他にも、コメの生育に関する各種の知見がある。興味のある人は、いろいろと、モデル化してみよう。
また、今回は気象データを複数用意した。自分のモデルが、どの地方で、高い売り上げとなるかを考えてみたい。また、気温データとしては札幌、新潟、東京、滋賀、宮崎。年としては、1993, 1994, 1995,1997, 2003年のデータが用意してある。これ以外の地域のデータを作成することも可能なので、余裕と興味のある人は、いろいろな地方のデータを用いて、自分のモデルがどのような挙動を示すかを、調べて欲しい。
但し、データに欠測値(空白など)があると、今回のプログラムではエラーとなる。アメダスの生データは、そういった欠測値がかなり紛れ込んでいる。自分でデータを取得する際には、注意しよう。なお実用的なプログラムの場合、欠測値の取り扱いは、内挿、あるいは、平年値での代替などの方法がある。(内挿の方が簡単であり、また、欠測値が少ない場合には推定精度も高い)。(気象学上の平年値は近年の30年間の平均値としている。現在用いられている平年値は1981ー2010の平均である。)
プログラムの動作
今回の課題プログラムは、次のような動作を行う。
  1. 初期設定・変数の定義
  2. 地域・品種データ・定植日の読み込み(ファイル入力)
  3. 気温データの読み込み(ファイル入力)
  4. 積算気温の算出、各種ファクターの計算
  5. 結果の出力(標準出力)
  6. 終了
課題プログラムは、前回同様、4. 積算気温の算出、各種ファクターの計算部分が未完成である。
つまり、本プログラムの中心部分が、完成していないのである。
この最も重要な部分を、各自、自分でプログラミングし、実行して提出すること。

【参考】今回のプログラムの最終的な出力は1haあたりの売上(10a収穫量x60kgの価格x10/60)として産出している。日本の農家の平均耕作面積は2.35ha。つまり農家の売上は、ここで得られる数値の2.35倍である。なお、価格と収量は農業分野での標準的な数値である。
【反当収量】:1反(=10a)当たりの玄米の収穫量。1反で10俵取ることが目標である。なお農地を貸し出す場合の貸借料は1反で1俵が相場である。
【一合、一升、一斗、(一俵)、一石】: 1合は180ccであるが、玄米では約150gになる。1升は10合、1斗は10升(斗酒なお辞せず)、10斗で1石である。なお1俵は4斗である。ここで1石とはどのくらいの玄米量であるか。1人が1食に食べる食事の量は1合弱が基本である。となると1年では1x3x365で1000合程度(1石)を食べることになる。(但し現在の茶碗では1合は茶碗2杯分程度に相当する。)ごはんとして食べるときは、水の量を白米の容積の1.2ー1.4倍追加する。今、1.2倍とすると1合のご飯は(コメ150g+水180g)=330g程度になる。ココイチのカレーでの標準です。(^・^)


プログラム中の、主要な変数名とその意味は、以下の通りである。

Variables in Model02.java
変数名説 明備 考
varietystr品種名Parameters2.txtから読込
areastr栽培地域名Parameters2.txtから読込
areacodeint栽培地域番号Parameters2.txtから読込
taueint田植え日(日付連番)Parameters2.txtから読込
at_eardouble出穂に必要な積算温度Parameters2.txtから読込
at_harvestdouble登熟に必要な出穂後の積算温度Parameters2.txtから読込
yielddouble平均的な収量(kg/10a)Parameters2.txtから読込
pricedouble平均的な価格(円:60kgあたり)Parameters2.txtから読込
tn[i]double arrayi日目(日付連番)の最低気温
366日型で提供
気温ファイルから読込
tm[i]double arrayi日目(日付連番)の最高気温
366日型で提供
気温ファイルから読込
ta[i]double arrayi日目(日付連番)の平均気温
366日型で提供
気温ファイルから読込
ra[i]double arrayi日目(日付連番)の降水量
366日型で提供
気温ファイルから読込
c[i]int array各月の日数
応用課題用
プログラム中で定義済み
SHUSSUI_BIint出穂日(日付連番)計算して算出する
SHUKAKU_BIint収穫日(日付連番)計算して算出する
yfactordouble収量に影響を与えるファクター(因子)計算して算出する
pfactordouble価格(品質)に影響を与えるファクター(因子)計算して算出する
salesdouble1ha当たりの売り上げ金額(所得では無い)計算して算出する


また、パラメータファイルの内容は次のようになっている

Parameters2.txt
行番号変数名初期値備 考
1areastrTOKYO栽培地域名
2areacodeint13地域番号名
3tempfilestr2003tokyo.txt気象データファイル
4varietystrKOSHIHIKARI品種名
5taueint109田植え日(日付連番)
6at_eardouble1650出穂に必要な積算温度
7at_harvestdouble950登熟に必要な出穂後の積算温度
8yielddouble580平均的な収量(kg/10a)
9pricedouble11000平均的な価格(円:60kgあたり)


<課題ファイルへのリンク>
課題データをまとめてダウンロードする!Model02.zip
デスクトップにダウンロードすれば、解凍時にModel02フォルダが作成され、その中に以下の関連ファイルが保存される
これらの中で、1993年(平成5年)は日本が記録的な冷害を体験した年である。この年にはコメの生産量が約30%減となり、海外からコメを緊急輸入する事態となった。また、1994年は一転して猛暑の年であった。
(参考:日本の平均気温の平年値との偏差は、1993(-0.52),1994(+0.56),1995(-0.19),1997(+0.10),2003(-0.06),2015(+0.69)となっている。気象庁ー日本の年平均気温偏差

なお、他の地点の気象データを手に入れたい場合には、次のウェブサイトから入手することが出来る。

課題の提出にあたって
プログラムはJAVAで作成する。
JAVAの使い方は、はいぱーワークブックなどで復習して欲しい。最も単純な使い方は、ターミナルから、
  1. cd Desktop/Model02
  2. javac Model02.java
  3. java Model02
のように、1.作業ディレクトリに移動、2.コンパイル、3.実行、することである。なお、上記の3.の段階で、他のファイルにリダイレクトすれば、結果がファイル出力として入手できる.
今回の課題の提出は、
  1. 作成したプログラム(ソースコード)。コードには、必要に応じて注釈(コメント)を付けること。
  2. 実行結果(最低でも2つ以上の気象データで実行する)
  3. 自分の組み込んだモデルの説明と、結果の解釈
    【重要】自分の組み込んだモデルが、きちんと動作している事を確認すること。
の3点を送信することである。
健闘を祈る。

コマンドラインでのリダイレクトとファイル内容の表示(cat)
java Model02 > kekka02.txt
と実行すると、結果がkekka.txtに保存される。この操作は、コンソール出力をファイルに「リダイレクト」すると言う。
複数の結果を追加するには、リダイレクトの矢印を二つ重ねる。こうすることによって、今のファイルに、次の結果が追加される。
java Model02 >> kekka02.txt
リダイレクトされたファイルの内容を、ターミナル上で確認するときのコマンドは、catである。
cat kekka.txt
なお、コンソールで入力した文字を、ファイルに格納する際にも、catが使える。
cat > abc.txt
タイプ内容が、abc.txtに記録される。コンソールからのタイプ入力終了は、Ctrl + D である。
また、既存のファイルに対して、リダイレクトの内容を追加書き込みする場合には、リダイレクト記号を重ねて使う。
ls > > abc.txt
cat > > abc.txt
これによって、abc.txtに、中身がどんどん追加される。

【講評】前回の課題で、出穂日は195日、収穫日135日(本当は230日)としている人が、何人かに見受けられた。(出穂前に収穫可能!!)
収穫日は、出穂後(それまでの積算気温は1650度)の積算気温が更に950度必要なのに、出穂前に収穫可能となり、明らかにおかしい。このエラーの原因は、収穫までの積算気温の判定条件を、
( i > SHUSSUI_BI ) && ( SHUKAKU_BI==0 )としていたためである。
プログラム中で、出穂日は、当初、0 に設定されている。そのため、1月2日になると、i(日付)は、SHUSSUI_BIを超えてしまい、早速、積算を開始してしまう。プログラムを書いた本人は、当然、本来のSHUSSUI_BIが過ぎてから(iが出穂日より大きくなってから)積算を始めるつもりだったと思うが、なかなか、プログラムは思い通りに動いてくれない物である。
ここでの解答例は、 ( SHUSSUI_BI > 0 )&& ( SHUKAKU_BI == 0 ) で 良い。なぜなら、SHUSSUI_BIが 0 より大きい言うことは、すなわち、出穂の計算が終了した(即ち、積算気温が1650度を超えた)と言うことで、それから登熟の計算に取りかかって良いからである。
(なお、プログラムロジックとして、更に良いのは、 ( temp1 >= at_ear )&& ( SHUKAKU_BI == 0 ) である。内容を読めば意味が分かるような判断ルーチンは、後々の可読性を向上させる。また、他人にも使ってもらえやすい。)。プログラムのデバッグは、自分がプログラムの中を移動しながら、今のiは2だなとか、temp1には田植えからの積算気温が足されつつあるな、、などど考えることである。また、デバッグプリントも有効である。デバッグプリントとは、プログラムのその時点での変数の値を書き出す部分である。今回のModel02でも、出穂後の低温に晒されたときの温度とその際のyfactorの値を書き出させている。
また、比較演算子の==は、=と書いてしまっても、プログラム構文としてのエラーは発生しない。このミスも気がついて欲しい。
なお、出穂日は195日目、収穫日は230日め(または、231日目)である。230日目になった場合は、出穂の当日からの気温積算となっており、231日目の場合は、出穂の翌日からの積算となった場合である。これはどちらでも良い。