質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

358閲覧

関数の最小化問題からクラスタリング問題にプログラムを書き換えたい

teruterubozu

総合スコア5

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/19 07:40

編集2021/01/20 08:22

前提・実現したいこと

可変長のabcアルゴリズムで関数の最小化問題を解くプログラムをk-means法を用いたirisデータのクラスタリング問題を解くプログラムに書き換えたいです。
プログラムを書き換えていただけると一番ありがたいですが、同じアルゴリズムを用いて複数の種類の問題を解く方法などを教えていただけると幸いです。

発生している問題・エラーメッセージ

関数の最小化を解く元のプログラムは類似したものを真似たので作成できたのですが、クラスタリング問題に変える際に変数をどのように変えたら良いのかなどが見当がつかず困っています。

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4import math 5import functools 6import operator 7import time 8import copy 9import datetime 10from tqdm import tqdm_notebook as tqdm 11 12ES = 50 # 個体数 13OS = 50 14SS = 1 15CS = ES * 2 # コロニーサイズ 16Dmax = 50# 次元 17tc = np.zeros(CS) #カウント 18lim = ES*Dmax 19xmax = 600 20xmin = -600 21Cycle = 1000 # 周期 22x = np.zeros((ES,Dmax)) 23J = np.zeros(Dmax) 24fitness = np.zeros(ES) # 適応度 25P = np.zeros(ES) # 選択確率 26for i in range(ES): 27 J[i] = round(np.random.rand()*(Dmax-2))+2 28 29 for j in range(int(J[i])): 30 x[i,j] = (xmax-xmin)*np.random.rand()+xmin 31 32x_best = x[0] #x_bestの初期化 #x[0,0]→x[0] 33best = 100 34 35# 適応度 36def Fitness(fun): 37 result = 0.0 38 if fun > 0.0 : 39 result = 1 / (fun + 1) 40 else : 41 result = 1 + abs(fun) 42 return result 43 44#目的関数 45def func(x,n): 46 t = np.cos((x - 100) / n**int(1 / 2)) 47 t = functools.reduce(operator.mul, t) 48 f = np.sum((x - 100)**2) / 4000 - t + 1 49 p = 1 / (1 + f) 50 return p 51 52 53# アルゴリズム 54best_value = [] 55for g in range(Cycle): 56 57 # employee bee step 58 for i in range(int(ES)):#個体数の分だけ更新 59 v = x.copy() 60 d = x.copy() 61 while True : 62 k = np.random.randint(0,ES) 63 if(k != i): 64 break 65 66 for j in range(int(J[i])): 67 r = np.random.rand()*2-1 #-1から1までの一様乱数 68 v[i,j] = x[i,j] + r * (x[i,j] - x[k,j]) 69 d[i,j] = v[i,j] - x[i,j] 70 71 if v[i,j] < xmin : 72 v[i,j] = xmin 73 elif v[i,j] > xmax : 74 v[i,j] = xmax 75 76 if J[i]<J[k]: 77 j = (int)(round(np.random.rand()*(J[i]-1))+1)#int型にキャスト 78 else: 79 q = (int)(round(np.random.rand()*(J[k]-1))+1)#int型にキャスト 80 81 v[i,j] = x[i,j]+ r * (x[i,j] - x[k,q]) 82 83 #Objsol = func(v[:])→Objsol = func(v[i],i) 84 #引数が足りない。 85 Objsol = func(v[i],i) 86 fitnesssol = Fitness(Objsol) 87 88 if fitnesssol > fitness[i] : 89 tc[i] = 0 90 for j in range(int(J[i])): 91 x[i,j] = v[i,j]; 92 93 fitness[i] = fitnesssol 94 else: 95 tc[i] += 1 96 97 for i in range(int(ES)): 98 P[i] = fitness[i] / fitness.sum() 99 100 # onlooker bee step 101 for i in range(int(ES)):#個体数の分だけ更新 102 #w = [] 103 d = x.copy() 104 l = np.random.randint(0,ES) 105 roulette = np.random.uniform(0,1) 106 m = 0.0 107 for n in range(int(ES)): 108 if m <= roulette and roulette <= m +P[n]: 109 i=n 110 break 111 m +=P[n]#P→P[n] 112 113 for j in range(int(J[i])): 114 r = np.random.rand()*2-1 #-1から1までの一様乱数 115 v[i,j] = x[i,j] + r * (x[i,j] - x[k,j]) 116 d[i,j] = v[i,j] - x[i,j] 117 118 if v[i,j] < xmin : 119 v[i,j] = xmin 120 elif v[i,j] > xmax : 121 v[i,j] = xmax 122 123 if J[i]<J[k]: 124 j = (int)(round(np.random.rand()*(J[i]-1))+1)#int型にキャスト 125 else: 126 q = (int)(round(np.random.rand()*(J[k]-1))+1)#int型にキャスト 127 128 v[i,j] = x[i,j]+ r * (x[i,j] - x[k,q]) 129 130 #Objsol = func(v[:])→Objsol = func(v[i],i) 131 Objsol = func(v[i],i) 132 fitnesssol = Fitness(Objsol) 133 134 if fitnesssol > fitness[i] :#Fitness[i]→fitness[i] 135 tc[i] = 0 136 for j in range(int(J[i])): 137 x[i,j] = v[i,j]; 138 139 fitness[i] = fitnesssol 140 else: 141 tc[i] += 1 142 143 # scout bee step 144 for i in range(int(SS)): 145 if tc.max() > lim:# 146 for j in range(Dmax): 147 x[tc.argmax(),j] = np.random.rand()*(xmax-xmin) + xmin 148 tc[tc.argmax()] = 0 149 150 # 突然変異 151 for i in range(int(ES)): 152 Pm = np.zeros(ES) # 突然変異確率 153 k1 = 0.5 154 k2 = 0.5 155 P0 = 0.4 # 閾値 156 if fitness[i] > fitness.mean(): 157 Pm[i] = k1 * (fitness.argmax() - fitness[i]) / (fitness.argmax() - fitness.mean()) 158 else : 159 Pm[i] = k2 160 if Pm[i] > P0 : 161 if x_best[j] < x[i,j]:#x_best→x_best[j] 162 j = j-1 163 elif x_best[j] > x[i,j]:#x_best→x_best[j] 164 j = j+1 165 else: 166 j = j 167 168 # 最良個体の発見 169 for i in range(ES): 170 if best > func(x[i],i): 171 x_best = x[i]#x[i,j]→x[i] 172 n_best = i 173 best = func(x_best,n_best) 174 175 best_value.append(best)#50行目から移動 176 177print(x_best,func(x_best,n_best)) 178plt.plot(range(Cycle),best_value) 179plt.yscale('log') 180plt.title("ABC") 181plt.show() 182

試したこと

補足情報(FW/ツールのバージョンなど)

python3.7.4 jupyter

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2021/02/02 13:27

可変長のabcアルゴリズムで関数の最小化問題を解くプログラムをk-means法を用いたirisデータのクラスタリング問題 → 問題もアルゴリズムも違います。同じアルゴリズムを用いて複数の種類の問題を解くことではありません。もう少しご質問を整理お願いします。
teruterubozu

2021/02/03 04:55

ご指摘ありがとうございます。 質問を編集します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問