現在在庫管理を行うシステムを作成しており、その際に在庫を効率的に使用するアルゴリズムを考えています。
python
1ini_len = 50 2stocks = [{"sid":1,"stock":25}, 3 {"sid":2,"stock":14}, 4 {"sid":3,"stock":5}, 5 {"sid":4,"stock":3} 6 {"sid":5,"stock":9} 7 ] 8materials = [{"mid":1,"len":2,"count":19}, 9 {"mid":2,"len":5,"count":9}, 10 {"mid":3,"len":3,"count":15} 11 ]
上記は規定値50(ini_len)の在庫が残り(stocks)25m,14m,5m,3m,9mあり
それらに対してmaterialsがそれぞれ一個あたりどのくらいの在庫を使用するか(len)、それが何個必要か(count)を表しています。
ここで全てのmaterialを処理するためにstocksからの効率的な消費を行い(sid4と5は3の倍数なのでmidからの消費を行なって完全になくすなど)、かつ不足していた場合は新たに在庫を追加(今回の場合ini_len=50のため、stocksに50が追加されるイメージ)するという処理を行いたいのですが、こうした在庫の消費と新規在庫の追加を実現するアルゴリズムがわからず悩んでいます。
目的としているアウトプットの形としては、上記の例だと
"""
sid1(stock=25)はmid2(len=5)から5個使う 完全に消費
sid2(stock=14)はmid1(len=2)から7個使う 完全に消費
sid3(stock=5)はmid2(len=5)から1個使う 完全に消費
sid4(stock=3)はmid3(len=3)から1個使う 完全に消費
sid5(stock=9)はmid3(len=3)から3個使う 完全に消費
"""
とした上で
残りのmaterial
mid1(len=2) 12個
mid2(len=5) 3個
mid3(len=3) 11個
について
新規作成の
"""
sid6(stock=50)はmid2(len=5)から3個、mid3(len=3)から11個、mid1(len=2)から1個使う
→完全に消費
sid7(stock=50)はmid1(len=2)から11個使う
→残り(50-22=28)
"""
というようにどこから何をどれくらい使うかということまで情報として持つことができればと思っています。
どなたか解決策を知っていましたらご教授いただければと思います。
========補足============
今回は在庫の残量が全て何らかのマテリアルで割り切れましたが、もし割り切れなくて消費しきれず、新規の在庫を追加することも問題はありません。