山登り
いくつかの確率的最適化アルゴリズムを試すことができます。たとえば、山登り法では、ランダムな解(@Don Rebaが指摘したように)から始めて、コスト関数に対応する方が優れている一連の隣接する解を調べます。アイデアを説明するために、いくつかのサンプルPythonコードを使用します。
ネイバーソリューションを入手する
あなたの場合の隣人のために、あなたは次のような単純な関数を使うことができます:
n_params = 5 # number of parameters
upper_bound = 5 # upper limit of your parameters
lower_bound = 0 # lower limit of your parameters
def get_neighbors(solution):
neighbors = []
for i in range(n_params):
x = copy.deepcopy(solution)
if x[i] < upper_bound:
x[i] += 1 # increment one of the components
neighbors.append(x)
x = copy.deepcopy(solution)
if x[i] > lower_bound:
x[i] -= 1 # decrement one of the components
neighbors.append(x)
return neighbors
[1,3,4,2,2]の現在のソリューションがある場合、コンポーネントのいずれかをインクリメントまたはデクリメントすることにより、次のように10個の異なるネイバーを取得します。
[2, 3, 4, 2, 2],
[0, 3, 4, 2, 2],
[1, 4, 4, 2, 2],
[1, 2, 4, 2, 2],
[1, 3, 5, 2, 2],
[1, 3, 3, 2, 2],
[1, 3, 4, 3, 2],
[1, 3, 4, 1, 2],
[1, 3, 4, 2, 3],
[1, 3, 4, 2, 1]
ここでは、すべてのパラメーターが整数であると想定しています。ステップサイズを調整することで、より細かくすることができます(たとえば、0.05)。
山登り法の反復
def hill_climb():
initial_solution = np.random.randint(lower_bound, upper_bound, n_params)
current_solution = initial_solution
print 'initial solution', initial_solution
current_cost = get_cost(initial_solution)
step = 1
while True:
#try to replace each single component w/ its neighbors
lowest_cost = current_cost
lowest_solution = current_solution
print 'hill-climbing cost at step %6d: %d' % (step, lowest_cost)
neighbors = get_neighbors(current_solution)
for new_solution in neighbors:
neighbor_cost = get_cost(new_solution)
if neighbor_cost < lowest_cost:
lowest_cost = neighbor_cost
lowest_solution = new_solution
if lowest_cost >= current_cost:
break
else:
current_solution= lowest_solution
current_cost = lowest_cost
step += 1
return current_solution
コスト関数
完全を期すために、(デモの目的で)独自のコスト関数を使用します。
f(x) = x1^1 - x2^2 + x3^3 - x4^4 + x5^5
あれは :
def get_cost(solution):
cost = 0
for i,param in enumerate(solution):
cost += (-1.)**i * param**(i+1)
return cost
最適化の結果:
結果は次のとおりです。[4、0、1、3、1]のランダムな初期推定を使用します。14ステップ(14 * 10 = 140ネイバーの評価)の後、コストを最小化する[0、5、0、5、0]の最適な答えを見つけます。ブルートフォースの場合、6 ^ 6=46656ソリューションを評価する必要があります。高次元のソリューションを使用している間は、実行時間を大幅に節約できます。
これは確率論的方法であるため、最終結果として極小値が検出されることに注意してください(ただし、大域的最小値と同じ場合もありますが、保証されていません)。しかし、実際にはそれで十分です。
initial solution: [4 0 1 3 1]
hill-climbing cost at step 1: -75
hill-climbing cost at step 2: -250
hill-climbing cost at step 3: -619
hill-climbing cost at step 4: -620
hill-climbing cost at step 5: -621
hill-climbing cost at step 6: -622
hill-climbing cost at step 7: -623
hill-climbing cost at step 8: -624
hill-climbing cost at step 9: -627
hill-climbing cost at step 10: -632
hill-climbing cost at step 11: -639
hill-climbing cost at step 12: -648
hill-climbing cost at step 13: -649
hill-climbing cost at step 14: -650
Final solution: [0 5 0 5 0]
関連記事
関連するがより複雑な質問はここにあります:コストを最小限に抑えながらセットからn個のベクトルを選択するためのアルゴリズム
上記のすべてのコードはここにあります。