以下は非常にばかげた例ですが、これは基本的に私の現実世界の使用例を単純化したものです
import pandas as pd
from scipy.optimize import differential_evolution
import time
def optimizer_function(x, cost_name):
print(cost_name)
a = df_generator(x)
return cost_function(a,cost_name)
def df_generator(x):
return pd.DataFrame({"a":[x**2+3*x+8 for i in range(-int(x),int(x))]})
def cost_function(df, name):
cost = min(df["a"])
if name == "distance":
cost = 2*cost
return cost
def optimiser(criteria):
print("start optimization")
start = time.process_time()
print(start)
result = differential_evolution(func=optimizer_function, bounds=[(-100,100)],
args=(criteria))
end = time.process_time()
print(end)
print(end - start)
print("end optimization")
if __name__ == '__main__':
optimiser("distance")
print("all good")
私はそれを機能させることはできません。x
を最小化する値が得られると期待していますcost_function
が、代わりに次のエラーメッセージが表示されます。
RuntimeError: マップのような呼び出し可能オブジェクトは、f(func, iterable) の形式である必要があり、'iterable' と同じ長さの一連の数値を返します
問題を正しく設定していないか、関数がdifferential_evolution
正しく解釈するための正しいタイプのデータを返していないように思えますが、どこを修正すればよいかわかりません。
どんな助けでも大歓迎
ここにスタックがあります
File "H:/projects/decay-optimizer/test_diff_evo.py", line 33, in <module>
optimiser("distance")
File "H:/projects/decay-optimizer/test_diff_evo.py", line 25, in optimiser
args=(criteria))
File "H:\projects\decay-optimizer\venv\lib\site-packages\scipy\optimize\_differentialevolution.py", line 276, in differential_evolution
ret = solver.solve()
File "H:\projects\decay-optimizer\venv\lib\site-packages\scipy\optimize\_differentialevolution.py", line 688, in solve
self.population)
File "H:\projects\decay-optimizer\venv\lib\site-packages\scipy\optimize\_differentialevolution.py", line 794, in _calculate_population_energies
raise RuntimeError("The map-like callable must be of the"
RuntimeError: The map-like callable must be of the form f(func, iterable), returning a sequence of numbers the same length as 'iterable'