MOAI Project
from typing import List, Optional, Union, Tuple, Dict, Any
from pydantic import BaseModel, Field, ValidationError, validator, confloat, conint, constr, Json
from pydantic.tools import parse_obj_as
import pandas as pd
import numpy as np
import fastai.tabular.core as ft
文脈から問題例を生成する関数 instance_generation
引数:
- 文脈(Context;たとえば日付)を表すデータフレーム
- 他のTabularPandasの引数
返値:
- 問題例を生成
これは, 表データから表データを生成する深層学習モデルなので, fastaiの TabularPandas で代用できる. 複数ラベル回帰を用いる. 顧客数だけを予測してから,点の座標を予測する. その後,予測した点の数だけサンプリングする.
https://docs.fast.ai/tabular.core.html#tabularpandas
他の方法としては,問題例をクラスタリングして分類ラベルを付与し, 与えられた文脈からラベルを当てる分類を適当な機械学習で行うことも考えられる.
df = pd.DataFrame({'date': pd.date_range(
start='2021/1/1',
freq='d',
periods=30
)})
#ft.make_date(df, 'date')
ft.add_datepart(df, "date")
df.head()
問題例を入力とし,過去の学習データから解の情報を返す関数
問題例間の距離を定義する必要がある.
Instanceクラス
- たとえばTSPなら点数と座標の列や地点間の移動費用,時間の行列; 点の座標は(たとえば北東方向に)大きい順に並べておく.
- 他の問題例との距離計算(輸送問題を解く) 割当問題の解法 https://scmopt.github.io/opt100/33ap.html#%E5%89%B2%E5%BD%93%E5%95%8F%E9%A1%8C
- 問題例をクラスタリングしたときのラベル
- 対応する文脈データフレーム
Solutionクラス
- 対応するInstance
class Instance():
def __init__(self, context=None, data=None, feature=None):
self.context = context
self.data = data
self.feature = self.extract_feature(data)
def extract_feature(self, data=None):
pass
def distance(self, another):
pass
class Config:
arbitrary_types_allowed = True
class Solution():
pass
an_instance = Instance()
n_max, n_min = 100, 50 #平日と休日の平均顧客数
sd = 10 #standard deviation
data = []
for row in df.itertuples():
if row.Dayofweek<=4:
loc = np.random.normal( loc= 0, scale = sd, size= (n_max,2) )
instance = Instance(numpyArray=loc)
else:
loc = np.random.normal( loc= 0, scale = sd, size= (n_min,2) )
instance = Instance(numpyArray=loc)
new_loc = np.concatenate( ((loc[:,0] + loc[:,1]).reshape( (-1,1) ), loc ), axis=1 )
new_loc.sort(axis=0)
sorted_loc = new_loc[:,1:]
data.append( sorted_loc.flatten() )
new_loc = np.concatenate( ((loc[:,0] + loc[:,1]).reshape( (-1,1) ), loc ), axis=1 )
new_loc.sort(axis=0)
sorted_loc = new_loc[:,1:]
sorted_loc
sorted_loc.flatten()
loc_df = pd.DataFrame(data)
pd.concat( [df, loc_df], axis=1 )