500字以上でまとめる。
- アサリについて
- 参考資料は
- こちら
- こちら
- こちら
- こちら
- 名前
- 採集が簡単
- 漁るが語源
- 形態
- 二枚貝
- 縞模様
- 多様
- 生態
- 分布
- 日本、朝鮮半島、中国、台湾付近に生息する。
- 海において、岸に生息するアサリと、沖に生息するアサリとで、形や肥満度が違う、
- これは、形の分布や、肥満度の分布が、場所によって変化すること
- そして、場所が連続的なので、これらの分布が連続的に変化する?ということが考えられる
- モデルを簡単にするため、海の地形しか考えない。他にも、流体、波、太陽光など、いろいろ考えたいが、、
- 簡単のため、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!