File size: 2,385 Bytes
165ee00
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import torch
import numpy as np

#
#
#   WeldedBeam: 4D objective, 5 constraints
#
#   Reference:
#     Gandomi AH, Yang XS, Alavi AH (2011) Mixed
#     variable structural optimization using firefly
#     algorithm. Computers & Structures 89(23-
#     24):2325–2336
#
#

def WeldedBeam(individuals): 

    assert torch.is_tensor(individuals) and individuals.size(1) == 4, "Input must be an n-by-4 PyTorch tensor."
    
    
    C1 = 1.10471
    C2 = 0.04811
    C3 = 14.0
    fx = torch.zeros(individuals.shape[0], 1)
    gx1 = torch.zeros(individuals.shape[0], 1)
    gx2 = torch.zeros(individuals.shape[0], 1)
    gx3 = torch.zeros(individuals.shape[0], 1)
    gx4 = torch.zeros(individuals.shape[0], 1)
    gx5 = torch.zeros(individuals.shape[0], 1)
    
    for i in range(individuals.shape[0]):
        
        x = individuals[i,:]

        h = x[0]
        l = x[1]
        t = x[2]
        b = x[3]
        
        test_function = - ( C1*h*h*l + C2*t*b*(C3+l) )
        fx[i] = test_function
        
        ## Calculate constraints terms 
        tao_dx = 6000 / (np.sqrt(2)*h*l)
        
        tao_dxx = 6000*(14+0.5*l)*np.sqrt( 0.25*(l**2 + (h+t)**2 ) ) / (2* (0.707*h*l * ( l**2 /12 + 0.25*(h+t)**2 ) ) )
        
        tao = np.sqrt( tao_dx**2 + tao_dxx**2 + l*tao_dx*tao_dxx / np.sqrt(0.25*(l**2 + (h+t)**2)) )
        
        sigma = 504000/ (t**2 * b)
        
        P_c = 64746*(1-0.0282346*t)* t * b**3
        
        delta = 2.1952/ (t**3 *b)
        
        
        ## Calculate 5 constraints
        g1 = (-1) * (13600- tao) 
        g2 = (-1) * (30000 - sigma) 
        g3 = (-1) * (b - h)
        g4 = (-1) * (P_c - 6000) 
        g5 = (-1) * (0.25 - delta)
        
        gx1[i] =  g1        
        gx2[i] =  g2     
        gx3[i] =  g3             
        gx4[i] =  g4 
        gx5[i] =  g5 
    
    
    
    gx = torch.cat((gx1, gx2, gx3, gx4, gx5), 1)
    return gx, fx


def WeldedBeam_Scaling(X):

    assert torch.is_tensor(X) and X.size(1) == 4, "Input must be an n-by-4 PyTorch tensor."
    
    h = (X[:,0]  * (10-0.125) + 0.125 ).reshape(X.shape[0],1)
    l = (X[:,1]  * (15-0.1  ) + 0.1   ).reshape(X.shape[0],1)
    t = (X[:,2]  * (10-0.1 ) + 0.1         ).reshape(X.shape[0],1)
    b = (X[:,3]  * (10-0.1 ) + 0.1         ).reshape(X.shape[0],1)
    
    X_scaled = torch.cat((h, l, t, b), dim=1)
    return X_scaled