• 設定並測試八連桿演算法

八連桿演算法

稍微理解 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