SciPy を使用して、かなり基本的な最適化問題を解決しようとしています。問題は制約されており、境界が可変であり、線形であると確信しています。
次のコードを実行すると、「Singular matrix C in LSQ subproblem」というエラー メッセージが表示されて実行が失敗します。問題が何であるかを知っている人はいますか?前もって感謝します。
編集:コードが何をすべきかについての簡単な説明をここに追加します。コードの先頭で「需要」ベクトルを定義します。このベクトルは、一定期間にわたってインデックス化された特定の製品の需要を表します。私が理解したいのは、いくつかの制約の下でこの需要を満たすために一連の注文を出す方法です。これらの制約は次のとおりです。
- ある時点で需要があれば在庫を持たなければならない(需要指数)
- 注文後、4 '時間単位' まで追加注文することはできません。
- 過去4時間単位で注文できません
これは私のコードです。
from scipy.optimize import minimize
import numpy as np
demand = np.array([5, 10, 10, 7, 3, 7, 1, 0, 0, 0, 8])
orders = np.array([0.] * len(demand))
def objective(orders):
return np.sum(orders)
def items_in_stock(orders):
stock = 0
for i in range(len(orders)):
stock += orders[i]
stock -= demand[i]
if stock < 0.:
return -1.
return 0.
def four_weeks_order_distance(orders):
for i in range(len(orders)):
if orders[i] != 0.:
num_orders = (orders[i+1:i+5] != 0.).any()
if num_orders:
return -1.
return 0.
def four_weeks_from_end(orders):
if orders[-4:].any():
return -1.
else:
return 0.
con1 = {'type': 'eq', 'fun': items_in_stock}
con2 = {'type': 'eq', 'fun': four_weeks_order_distance}
con3 = {'type': 'eq', 'fun': four_weeks_from_end}
cons = [con1, con2, con3]
b = [(0, 100)]
bnds = b * len(orders)
x0 = orders
x0[0] = 10.
minimize(objective, x0, method='SLSQP', bounds=bnds, constraints=cons)