0. 目錄
1. 聲明
DOT
及其編寫之手冊皆屬VR&D
財產。
- 本文目的為讓初學者能快速認識
DOT
。文中所有引用及軟體截圖,業已經過VR&D
授權使用。
- 您可以在 VR&D官網 找到其相關產品及聯絡方式。。
- 特別感謝
VR&D
President/COO Mr. Juan Pablo Leiva
免費提供老駱DOT
trial license作學習之用,並於過程中持續提供技術支援。
2. DOT介紹
於 Vrand_VisualDOC_Ch0_Introduction 中老駱提到VR&D
旗下有兩條主要產品線,GENESIS 及 VisualDOC。
其實兩個產品背後所呼叫的程式為以Fortran 77
的最佳化運算子DOT
及BIGDOT
。如果Design Variable
數量在一兩千以下,可以呼叫DOT
來計算,如果Design Variable
數量在百萬級別以上,則比較適合呼叫BIGDOT
,特別是Topology
時。
以下是老駱與Mr. Juan Pablo Leiva
討論時的部份內容。
DOT works well for problems with 100s variables, for 1000s still work but start to consume computer resources. BIGDOT was developed for problems like Topology were you need millions of design variablies.
Mr. Juan Pablo Leiva
3. 利用Python呼叫DOT
基本上,DOT
應該可以與各種程式語言串接。Prof Gerhard Venter
於Github中開發了DOTWrapper,讓我們可以方便使用Python
來呼叫DOT
。此外,老駱將其略為修改為個人比較容易操作的格式,但參數定義皆相同。這邊須要注意的是,DOT
其實有內建的JWRITE
參數,可以將求解過程輸出至檔案中,但老駱覺得這樣設定比較麻煩。所以選擇於每次求解時直接儲存資訊。
以下說明利用Python
呼叫DOT
求解最佳化問題的4
個步驟:
- 將想求解問題的
Objective function
及Constraint(s)
定義於myEvaluate
的函數中。
- 設定
nDvar
為待求解Design variable(s)
數量,而nCons
為Constraint(s)
數量。nDvar
及nCons
須設為整數。
- 設定
x
為Design variable(s)
的初始值,而xl
及xu
為其上下限。x
、xl
及xu
須設為Numpy array
。
- 定義
DOT
求解參數,並呼叫DOT
進行求解。
DOT
雖然有很多參數,但是一般使用下,使用者幾乎不須要調整這些參數,即可以得到不錯的結果。
通常使用者僅須調整MINMAX
、METHOD
及IPRINT
這3
個參數,對應我們的Wrapper
,即為nMinMax
、nMethod
及nPrint
。
nMinMax
為控制求解問題是最小化
或是最大化
的參數。
nMinMax
為-1
或0
,則設定此問題為最小化問題。
nMinMax
為1
,則設定此問題為最大化問題。
nMethod
則是控制求解問題演算法的參數。
- 如果是有給定
Constraint(s)
的最佳化問題:
- 當
METHOD
為1
,則呼叫the Modified Method of Feasible Directions(MMFD)
。
- 當
METHOD
為2
,則呼叫Sequential Linear Programming method(SLP)
。
- 當
METHOD
為3
,則呼叫Sequential Quadratic Programming method(SQP)
。
- 如果是沒有給定
Constraint(s)
的最佳化問題:
- 當
METHOD
為0
或1
時,則呼叫BFGS algorithm
。
- 當
METHOD
為2
時,則呼叫FletcherReeves algorithm
。
nPrint
是控制求解過程輸出的參數。
- 可以設定為
0
~7
。數字越高代表越詳細的輸出,一般推薦將nPrint
設為3
。
4. DOT範例
這邊老駱使用自己修改的Wrapper說明DOT 5.X Manual
裡Sec4.2
的Box Design
問題。
from dot import Dot
import numpy as np
import math
def myEvaluate(x, obj, g, param):
h, w, d = x[0], x[1], x[2]
obj.value = 2.0 * (h * w + h * d + 2.0 * w * d) + 1.25 * h / 12.0
g[0] = 1.0 - h * w * d / 2.
nDvar = 3
nCons = 1
x = np.ones(nDvar, float) * 1.0
xl = np.ones(nDvar, float) * 0.001
xu = np.ones(nDvar, float) * 100.00
models = []
models.append(Dot(nMethod=1, nPrint=0))
models.append(Dot(nMethod=2, nPrint=0))
models.append(Dot(nMethod=3, nPrint=0))
for model in models:
model.fit(x=x, xl=xl, xu=xu, nCons=nCons, evalfunc=myEvaluate)
model.print_info()
for model in models:
model.plot_fig(is_savefig=True)
依照先前提到的4
個步驟定義問題:
Line5~10
: 於myEvaluate
中,將3
個Design Variables
h
,w
及d
分別指定為x[0]
, x[1]
及x[2]
。接著利用這些Design Variables
來建構Onjective function
及Constraint
。
Line12~13
: 指定nDvar = 3
(因為有3
個Design Variables
),並指定nCons = 1
(因為有1
個Constraint
)。
Line16~18
: 指定3
個Design Variables
的初始值為1.0
,下限為0.001
,上限為100.00
。
Line21~32
: 定義3
個使用不同nMthod
的模型。另外,nMinMax
其default
為0
,即最小化問題,不須設置。nPrint
則設為常用的3
。接著:
- 呼叫
fit
方法串接DOT
進行運算。
- 呼叫
print_info
方法,將初始及最佳結果輸出於營幕上。此時,若搭配將nPrint
設為0
,則營幕上僅會輸出初始及最佳結果,適合Debug
時使用。
- 呼叫
plot_fig
方法,利用matplotlib
繪製求解過程,並使用is_savefig=True
將所匯圖檔存為*.png
檔。
將求解結果表列如下:
Parameter |
Initial value |
nMethod=1 |
nMethod=2 |
nMethod=3 |
H |
1.00000E+00 |
1.93192E+00 |
1.94269E+00 |
2.13252E+00 |
W |
1.00000E+00 |
1.01727E+00 |
1.00799E+00 |
9.68432E-01 |
D |
1.00000E+00 |
1.01727E+00 |
1.02126E+00 |
9.68432E-01 |
Obj |
8.10417E+00 |
1.22018E+01 |
1.22045E+01 |
1.22344E+01 |
Max G |
5.00000E-01 |
3.81227E-04 |
7.35958E-01 |
-1.55971E-06 |
Function calls |
N/A |
55 |
65 |
68 |
其實此例題也可以利用VisualDOC
進行求解,畢竟VisualDOC
也是依靠DOT
或BIGDOT
做為最佳化運算子。詳細設定請參考VisualDOC系列文。
5.本文使用之軟硬體
老駱使用GIGABYTE
的P15
筆電作為本文的測試環境。
CPU
: i7-6700HQ
Memory
: DD3L 8G
OS
: Windpws 10 Home
Python(Anoconda3)
: version 3.7.3
NumPy
: version 1.16.4
Matplotlib
: version 3.1.0
VisualDOC
: version 10.0
DOT
: version 7.2
6. 聯絡老駱
如果您或貴單位:
- 有導入
VR&D
產品的意願,但是有報價、採購及發票等問題
- 有教育訓練或顧問需求
- 有些建言指教
- 想交個朋友
歡迎透過 camel@caeml.ai 聯絡老駱。
0. 目錄
1. 聲明
DOT
及其編寫之手冊皆屬VR&D
財產。DOT
。文中所有引用及軟體截圖,業已經過VR&D
授權使用。VR&D
President/COO Mr. Juan Pablo Leiva
免費提供老駱DOT
trial license作學習之用,並於過程中持續提供技術支援。2. DOT介紹
於 Vrand_VisualDOC_Ch0_Introduction 中老駱提到
VR&D
旗下有兩條主要產品線,GENESIS 及 VisualDOC。其實兩個產品背後所呼叫的程式為以
Fortran 77
的最佳化運算子DOT
及BIGDOT
。如果Design Variable
數量在一兩千以下,可以呼叫DOT
來計算,如果Design Variable
數量在百萬級別以上,則比較適合呼叫BIGDOT
,特別是Topology
時。以下是老駱與
Mr. Juan Pablo Leiva
討論時的部份內容。3. 利用Python呼叫DOT
基本上,
DOT
應該可以與各種程式語言串接。Prof Gerhard Venter
於Github中開發了DOTWrapper,讓我們可以方便使用Python
來呼叫DOT
。此外,老駱將其略為修改為個人比較容易操作的格式,但參數定義皆相同。這邊須要注意的是,DOT
其實有內建的JWRITE
參數,可以將求解過程輸出至檔案中,但老駱覺得這樣設定比較麻煩。所以選擇於每次求解時直接儲存資訊。以下說明利用
Python
呼叫DOT
求解最佳化問題的4
個步驟:Objective function
及Constraint(s)
定義於myEvaluate
的函數中。nDvar
為待求解Design variable(s)
數量,而nCons
為Constraint(s)
數量。nDvar
及nCons
須設為整數。x
為Design variable(s)
的初始值,而xl
及xu
為其上下限。x
、xl
及xu
須設為Numpy array
。DOT
求解參數,並呼叫DOT
進行求解。DOT
雖然有很多參數,但是一般使用下,使用者幾乎不須要調整這些參數,即可以得到不錯的結果。通常使用者僅須調整
MINMAX
、METHOD
及IPRINT
這3
個參數,對應我們的Wrapper
,即為nMinMax
、nMethod
及nPrint
。nMinMax
為控制求解問題是最小化
或是最大化
的參數。nMinMax
為-1
或0
,則設定此問題為最小化問題。nMinMax
為1
,則設定此問題為最大化問題。nMethod
則是控制求解問題演算法的參數。Constraint(s)
的最佳化問題:METHOD
為1
,則呼叫the Modified Method of Feasible Directions(MMFD)
。METHOD
為2
,則呼叫Sequential Linear Programming method(SLP)
。METHOD
為3
,則呼叫Sequential Quadratic Programming method(SQP)
。Constraint(s)
的最佳化問題:METHOD
為0
或1
時,則呼叫BFGS algorithm
。METHOD
為2
時,則呼叫FletcherReeves algorithm
。nPrint
是控制求解過程輸出的參數。0
~7
。數字越高代表越詳細的輸出,一般推薦將nPrint
設為3
。4. DOT範例
這邊老駱使用自己修改的Wrapper說明
DOT 5.X Manual
裡Sec4.2
的Box Design
問題。依照先前提到的
4
個步驟定義問題:Line5~10
: 於myEvaluate
中,將3
個Design Variables
h
,w
及d
分別指定為x[0]
,x[1]
及x[2]
。接著利用這些Design Variables
來建構Onjective function
及Constraint
。Line12~13
: 指定nDvar = 3
(因為有3
個Design Variables
),並指定nCons = 1
(因為有1
個Constraint
)。Line16~18
: 指定3
個Design Variables
的初始值為1.0
,下限為0.001
,上限為100.00
。Line21~32
: 定義3
個使用不同nMthod
的模型。另外,nMinMax
其default
為0
,即最小化問題,不須設置。nPrint
則設為常用的3
。接著:fit
方法串接DOT
進行運算。print_info
方法,將初始及最佳結果輸出於營幕上。此時,若搭配將nPrint
設為0
,則營幕上僅會輸出初始及最佳結果,適合Debug
時使用。plot_fig
方法,利用matplotlib
繪製求解過程,並使用is_savefig=True
將所匯圖檔存為*.png
檔。將求解結果表列如下:
H
W
D
Obj
Max G
Function calls
其實此例題也可以利用
VisualDOC
進行求解,畢竟VisualDOC
也是依靠DOT
或BIGDOT
做為最佳化運算子。詳細設定請參考VisualDOC系列文。5.本文使用之軟硬體
老駱使用
GIGABYTE
的P15
筆電作為本文的測試環境。CPU
: i7-6700HQMemory
: DD3L 8GOS
: Windpws 10 HomePython(Anoconda3)
: version 3.7.3NumPy
: version 1.16.4Matplotlib
: version 3.1.0VisualDOC
: version 10.0DOT
: version 7.26. 聯絡老駱
如果您或貴單位:
VR&D
產品的意願,但是有報價、採購及發票等問題歡迎透過 camel@caeml.ai 聯絡老駱。