アサリと最適輸送問題

500字以上でまとめる。

  • アサリについて
  • 参考資料は
    • こちら
    • こちら
    • こちら 
    • こちら
    • 名前
      • 採集が簡単
      • 漁るが語源 
    • 形態
    • 生態
      • 干潟に生息する
        •  砂泥底に住み着く
        • 10メートルの深さ
      • プランクトンや有機物が栄養
        • 海流や波の影響
          • これらは、海藻、岩、地形の影響あり
      • 沖の方が栄養が多く、育ちがよい
        • 殻が薄い
        • 肥満度が高い
      • 岸側の方が栄養が少なく、育ちが悪い
        • 殻が厚い
        • 岸に近づくと陸がある。
      • フルボ酸鉄という栄養素があると育ちが良い
      • 地下1から3cmのところにいて、海水を吸える場所で待機
        • 水管を砂の上まで伸ばして、プランクトンや有機物を濾しとる
        • その後、砂を吐き出す
          • アサリの周りの砂がきめ細やかなのは、アサリが吸える、大きさ、という、大きさの上限があって、それ以下の大きさの砂が集まるから、大きい砂が少ないのか?
        • これを利用して、調理の時に、砂を吐き出させる方法がある
          • 塩水につけておく
            • 海水を模した 
            • 砂を勝手に吐いてくれる
              • 温度管理が必要
          • 水につけておく
            • 塩を抜く
              • 薄めるというイメージ
      • 環境汚染によって生育が悪くなる
        • 実際、京都府での漁獲量が減少している
          • この現象の説明する理由の1つ。
    • 分布
      • 日本、朝鮮半島、中国、台湾付近に生息する。
      • 海において、岸に生息するアサリと、沖に生息するアサリとで、形や肥満度が違う、
        • これは、形の分布や、肥満度の分布が、場所によって変化すること
        • そして、場所が連続的なので、これらの分布が連続的に変化する?ということが考えられる
        • モデルを簡単にするため、海の地形しか考えない。他にも、流体、波、太陽光など、いろいろ考えたいが、、
    • 簡単のため、1次元の直線を考える。
      • 直線上の点は、形、肥満度の分布だとする
      • イメージとしては、直線の各点に分布(1, 2次元)が張り付いている
      • 直線の点の値は、水深だと考えると、岸とか沖とかを考えることになる。
    • 今回は、1次元の分布とする。
  • 最適輸送問題に置き換えて考えてみる。こちら
    • 岸での殻の厚さの分布と、沖での殻の厚さの分布が与えられた時、
    • 間の場所での分布がどんなものか知りたい時
    • 最適輸送問題の考え方が使える
    • 分布の各点から、各点へ移動する時のコストが、片方の分布の要素対他方の分布の要素の行列で表せる。
      • これがコスト関数
    • コスト関数と実際の割り当ての重み付け和が最小にしたい。
      • これが最適な(コストの最も小さい)輸送方法
    • こうして輸送する際、その割り当てを保持しつつ、途中を表示することが出来そう(多分出来る)
  • やってみる。
  • 今回は、簡単のため、離散的かつ小さなデータにした。
  • 補完できるか試してみる。
    • 補完するのは、2つのデータの間にあるようなデータを調べる
    • アサリで言うところの、沖と岸の間にあるものの殻の厚さの分布を得ることに相当する。
  • 行列の行の総和と列の総和が一定である、という決まりがあった。
  • でも、乱数で生成させたいから、
    • 1.乱数を要素に持つ行列を作り、
    • 2.各行の総和をとって、それで割る
    • 3.転置
    • 4.2と3を繰り返す
  • 以上の操作をすることで、近似的に生成した。
import numpy as np
def arr():
  ar = np.random.rand(7,7)
  for i in range(7):
    ar[i] /= ar[i].sum()
  ar = ar.T
  for i in range(7):
    ar[i] /= ar[i].sum()
  ar = ar.T
  for i in range(7):
    ar[i] /= ar[i].sum()
  ar = ar.T
  for i in range(7):
    ar[i] /= ar[i].sum()
  ar = ar.T
  return ar  

 

# 取りあえず、最適輸送

a = [10,10,11,12,12,13,14]
b = [8,8,8,9,10,10,10]

C = [[0]len(a) for _ in range(len(b))]
for i in range(len(a)):
  for j in range(len(b)):
    C[j][i] = a[i]-b[j]

from random import *
import numpy as np
T = 1000000
answer = 10**5
temp = np.random.rand(len(b),len(a))
for k in range(T):
  karr = arr()
  s = 0
  for x in range(len(a)):
    for y in range(len(b)):
      s+= C[y][x]*karr[y][x]
  if s<=answer:
    temp = karr
    answer = s

print(s)
ans = b.copy()
alpha = 0.5
for i in range(7):
  for j in range(7):
    ans[j] += C[i][j]*temp[i][j]*alpha
print(ans)
[8.501927112095675, 8.738362176575317, 8.558870167248038,
10.560592192684267, 11.33957772957744, 12.157037460995353, 12.512246586578124]
[8.501927112095675, 8.738362176575317, 8.558870167248038, 10.560592192684267, 11.33957772957744, 12.157037460995353, 12.512246586578124]

ちゃんと、b(沖)の、8,8,8,9,10,10,10よりもa(岸)よりの値を取っているので、最適?輸送っぽく出来ている

Bye bye!