# 計算式格式
- [goTest教學](https://pjchender.dev/golang/note-golang-test/)
## 致瑋
### 數值運算
- 平均數
- 給一個浮點數陣列,回傳平均值
```go
func GetMean(objects []float64) float64{
sum := 0.0
n := len(objects)
for i := 0; i < n; i++ {
sum += objects[i]
}
return sum / float64(n)
}
```
- 標準差
- 給一個浮點數陣列以及平均數,回傳標準差

```go
func GetStdDev(objects []float64, meanOfObjects float64) float64{
n := len(objects)
sum := 0.0
for i := 0; i < n; i++ {
sum += math.Pow(math.Abs(objects[i] - meanOfObjects), 2)
}
return math.Sqrt(sum / float64(n))
}
```
- 標準化
- 給三個數字分別是該物件數值、平均數、標準差,回傳標準化後的z分數

```go
func GetStandardizationScore(object, meanOfObjects, stdDevOfObjects float64) float64{
return (object - meanOfObjects) / stdDevOfObjects
}
```
- test function
```go
func TestGetMean (t *testing.T) {
objects := [...]float64{-1.0, 0.0, 1.0}
mean := GetMean(objects[:])
expect := 0.0
assert.Equal(t, mean, expect)
}
func TestGetStdDev (t *testing.T) {
objects := [...]float64{-1.0, 0.0, 1.0}
mean := GetMean(objects[:])
stdDev := GetStdDev(objects[:], mean)
expect := 0.816496580927726
assert.Equal(t, stdDev, expect)
}
func TestGetStandardizationScore (t *testing.T) {
object := 0.5
objects := [...]float64{-1.0, 0.0, 1.0}
mean := GetMean(objects[:])
stdDev := GetStdDev(objects[:], mean)
standardizationScore := GetStandardizationScore(object, mean, stdDev)
expect := 0.6123724356957945
assert.Equal(t, standardizationScore, expect)
}
```
## 沛德
### 節點運算
- 取最佳解
- 定義為標準差最小的值和平均數最小的值
- 給標準差陣列跟平均數陣列,回傳最小的標準差、最小的平均數

```go
func GetBestSol(meansOfObjects, stdDevsOfObjects []float64) (float64, float64){ //(minMean, minStdDev)
var minMean ,minStdDev float64
minMean = meansOfObjects[0]
minStdDev = stdDevsOfObjects[0]
for i := 1; i < len(meansOfObjects); i++ {
if meansOfObjects[i] < minMean{
minMean = meansOfObjects[i]
}
}
for i := 1; i < len(stdDevsOfObjects); i++ {
if stdDevsOfObjects[i] < minStdDev{
minStdDev = stdDevsOfObjects[i]
}
}
return minMean,minStdDev
}
```
- 取最差解
- 定義為標準差最大的值和平均數最大的值
- 給標準差陣列跟平均數陣列,回傳最大的標準差、最大的平均數

```go
func GetWorstSol(meansOfObjects, stdDevsOfObjects []float64) (float64, float64){ //(maxMean, maxStdDev)
var maxMean ,maxStdDev float64
maxMean = meansOfObjects[0]
maxStdDev = stdDevsOfObjects[0]
for i := 1; i < len(meansOfObjects); i++ {
if meansOfObjects[i] > maxMean{
maxMean = meansOfObjects[i]
}
}
for i := 1; i < len(stdDevsOfObjects); i++ {
if stdDevsOfObjects[i] > maxStdDev{
maxStdDev = stdDevsOfObjects[i]
}
}
return maxMean,maxStdDev
}
```
- 歐式距離計算
- 給 x 跟 y 兩個陣列,回傳兩者的歐式距離

```go
func GetEuclideanDistance(x, y []float64) float64{
var distance float64
for i := 0; i < len(x); i++ {
distance = distance + (x[i]-y[i]) * (x[i]-y[i])
}
distance = math.Sqrt(distance)
return distance
}
```
- RC值(與最佳解貼近度)計算
- 給與最佳解距離和與最差解距離,回傳 RC值
- $d_{best}$ 代表與最佳解的距離,$d_{worst}$ 代表與最差解的距離

- test function
```go
func TestGetBestSol(t *testing.T) {
meansOfObjects := [...]float64{1, 2, 3}
stdDevsOfObjectsOfObjects := [...]float64{1, 2, 3}
minMean, minStdDev := GetBestSol(meansOfObjects[:], stdDevsOfObjectsOfObjects[:])
t.Errorf(fmt.Sprintf("mean: %v\n stdDev: %v", minMean, minStdDev))
}//expect = 1
func TestGetWorstSol(t *testing.T) {
meansOfObjects := [...]float64{1, 2, 3}
stdDevsOfObjects := [...]float64{1, 2, 3}
maxMean, maxStdDev := GetWorstSol(meansOfObjects[:], stdDevsOfObjects[:])
t.Errorf(fmt.Sprintf("mean: %v\n stdDev: %v", maxMean, maxStdDev))
}//expect = 3
func TestGetEuclideanDistance(t *testing.T) {
x := [...]float64{4, 5, 6, 7}
y := [...]float64{1, 2, 3, 4}
distance := GetEuclideanDistance(x[:], y[:])
t.Errorf(fmt.Sprintf("distance: %v\n", distance))
}//expect = 6
func TestGetRCVal(t *testing.T) {
best := 1.0
worst := 4.0
rc := GetRCVal(best, worst)
t.Errorf(fmt.Sprintf("rc: %v\n", rc))
} //expect = 0.8
```