- 設定並測試八連桿演算法
八連桿演算法
稍微理解 Cython 程式碼後,透過原先的 Cython API,可以將四連桿的設定轉變為八連桿的設定。
以下是兩者的比對:
mechanismParams_4Bar = { #No 'targetPath' 'Driving':'A', 'Follower':'D', 'Link':'L0,L1,L2,L3,L4', 'Target':'E', 'ExpressionName':'PLAP,PLLP,PLLP', 'Expression':'A,L0,a0,D,B,B,L1,L2,D,C,B,L3,L4,C,E', 'constraint':[{'driver':'L0', 'follower':'L2', 'connect':'L1'}], 'formula':['PLAP','PLLP']} mechanismParams_4Bar['VARS'] = len(set(mechanismParams_4Bar['Expression'].split(',')))-2 mechanismParams_8Bar = { #No 'targetPath' 'Driving':'A', 'Follower':'B', 'Link':'L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10', 'Target':'H', 'ExpressionName':'PLAP,PLLP,PLLP,PLLP,PLLP,PLLP', 'Expression':'A,L0,a0,B,C,B,L2,L1,C,D,B,L4,L3,D,E,C,L5,L6,B,F,F,L8,L7,E,G,F,L9,L10,G,H', 'constraint':[{'driver':'L0', 'follower':'L2', 'connect':'L1'}], 'formula':['PLAP','PLLP']} mechanismParams_8Bar['VARS'] = len(set(mechanismParams_8Bar['Expression'].split(',')))-2
其中一些項目可由部份內容得知,如 VARS 為不包含「求解值」與「角度」的所有代號,便可由 Expression 使用 set type 解析出現的代號,並扣除得知。
再來是演算法須得知的參數:
mechanismParams = self.mechanismParams_4Bar if self.FourBar.isChecked() else self.mechanismParams_8Bar link_q = mechanismParams['VARS']-7 upper = [self.Settings['AxMax'], self.Settings['AyMax'], self.Settings['DxMax'], self.Settings['DyMax'], self.Settings['IMax'], self.Settings['LMax'], self.Settings['FMax']]+[self.Settings['LMax']]*link_q lower = [self.Settings['AxMin'], self.Settings['AyMin'], self.Settings['DxMin'], self.Settings['DyMin'], self.Settings['IMin'], self.Settings['LMin'], self.Settings['FMin']]+[self.Settings['LMin']]*link_q mechanismParams['targetPath'] = tuple((e['x'], e['y']) for e in self.path) p = len(self.path) GenerateData = { 'nParm':p+mechanismParams['VARS'], 'upper':upper+[self.Settings['AMax']]*p, 'lower':lower+[self.Settings['AMin']]*p, 'maxGen':self.Settings['maxGen'], 'report':int(self.Settings['maxGen']*self.Settings['report']/100)}
由 GUI 取得連桿類型後,經測試發現 upper 與 lower 的長度必須與 VARS 的數值相等,因此調整中間連桿的設定。
上述的設定可以適應四連桿與八連桿的資料輸入,其他參數則是由 GUI 設定。
合併結果的部份,由於還未寫辨識固定鍊的函式,所以目前機構皆用連桿連接。
上圖為套用四連桿相從設定的結果(差分演化法),不過速度方面很意外的沒有落後太多,大約在 3 至 10 秒之間。
推測可能是八連桿的路徑較多變,因此在幾代內稍微調整染色體即可符合,不過若是路徑點較多,也可能需要較久的時間。
以下為一個八連桿演算法的範例(差分演化法,12 個路徑點,花費 10.5008 秒),之後會加入內建範例中。
以下為此範例的適應值收斂圖。
Comments
comments powered by Disqus