I don't have return values. So they are subroutines, not functions, and they can't be "as object".
Also, I don't know how to use your line 12 in "do this in your code" part.
This is the class I made with your help:
Public Class Cruce
Structure individuo
Dim x() As Double
Dim fx As Double
End Structure
Structure poblacion
Dim ind() As individuo
End Structure
Private strMethodName As String
Private objVar1 As Object
Private objVar2 As Object
Dim tpob, nvars, ngen, pto, p1, p2, ini As Integer
Public Sub New(ByVal NameOfMethod As String)
Me.strMethodName = NameOfMethod
End Sub
Public Sub Method(ByRef ind1 As individuo, ByRef ind2 As individuo)
objVar1 = ind1
objVar2 = ind2
Select Case strMethodName
Case "cruce_unpunto"
cruce_unpunto(ind1, ind2)
Case "cruce_dospuntos"
cruce_dospuntos(ind1, ind2)
Case "cruce_uniforme"
cruce_uniforme(ind1, ind2)
Case "cruce_intermedio"
cruce_intermedio(ind1, ind2)
Case "cruce_sbx"
cruce_sbx(ind1, ind2)
Case "cruce_arit"
cruce_arit(ind1, ind2)
Case Else
cruce_arit_total(ind1, ind2)
End Select
End Sub
Sub cruce_unpunto(ByRef ind1 As individuo, ByRef ind2 As individuo)
'Cruce de un punto
'Se elije un punto de cruza
'swap de valores de X entre individuos
For i = 0 To pto
swap_ind(ind1, ind2, i)
Next
For i = pto + 1 To UBound(ind1.x)
swap_ind(ind1, ind2, i)
Next
End Sub
Sub cruce_dospuntos(ByRef ind1 As individuo, ByRef ind2 As individuo)
'Cruce de dos puntos
'Se elijen dos puntos de cruza
'y se intercambia lo que haya en el intermedio
For i = p1 To p2
swap_ind(ind1, ind2, i)
Next
End Sub
Sub cruce_uniforme(ByRef ind1 As individuo, ByRef ind2 As individuo)
'Se elije un numero n de puntos de cruce
End Sub
Public Sub swap_ind(ByRef ind1 As individuo, ByRef ind2 As individuo, ByVal i As Integer)
Dim temp As Double
temp = ind1.x(i)
ind1.x(i) = ind2.x(i)
ind2.x(i) = temp
End Sub
Sub cruce_intermedio(ByRef ind1 As individuo, ByRef ind2 As individuo)
Dim a As Double = valor_random()
For i = ini + 1 To UBound(ind1.x)
ind1.x(i) = fun_cruce_int(i, ind1, ind2, a)
ind2.x(i) = fun_cruce_int(i, ind2, ind1, a)
Next
End Sub
Sub cruce_sbx(ByRef ind1 As individuo, ByRef ind2 As individuo)
Dim u As Double = valor_random(), b, nc, p1, p2 As Double
nc = 2
'Obtener b
If u > 0.5 Then
b = (1 / (2 * (1 - u))) ^ (1 / (nc + 1))
Else
b = (2 * u) * (1 / (nc + 1))
End If
'Obtener valores de x
For i = 0 To UBound(ind1.x)
p1 = ind1.x(i)
p2 = ind2.x(i)
ind1.x(i) = 0.5 * ((p1 + p2) - b * Math.Abs(p1 - p2))
ind2.x(i) = 0.5 * ((p1 + p2) - b * Math.Abs(p1 + p2))
Next
End Sub
Function fun_cruce_int(ByVal i As Integer, ByRef ind As individuo, ByRef ind2 As individuo, ByVal a As Integer)
Dim cruce As Double
cruce = ind2.x(i) * a + ind.x(i) * (1 - a)
Return cruce
End Function
Sub cruce_arit(ByRef ind1 As individuo, ByRef ind2 As individuo)
Dim a As Double
For i = ini + 1 To UBound(ind1.x)
a = obtener_a(i, ind1, ind2)
ind1.x(i) = fun_cruce_int(i, ind1, ind2, a)
ind2.x(i) = fun_cruce_int(i, ind1, ind2, a)
Next
End Sub
Function obtener_a(ByVal ini As Integer, ByRef ind1 As individuo, ByRef ind2 As individuo)
Dim a, b, c, d, l, u, x As Double
l = ind1.x(ini)
u = ind1.x(ini)
'Se buscan los limites superiores e inferiores
For i = ini To UBound(ind1.x)
If l > ind1.x(ini) Then
l = ind1.x(ini)
End If
If l > ind2.x(ini) Then
l = ind2.x(ini)
End If
If u < ind1.x(ini) Then
u = ind1.x(ini)
End If
If u < ind2.x(ini) Then
u = ind2.x(ini)
End If
Next
a = (l - ind2.x(ini)) / (ind1.x(ini) - ind2.x(ini))
b = (u - ind1.x(ini)) / (ind2.x(ini) - ind1.x(ini))
c = (l - ind1.x(ini)) / (ind2.x(ini) - ind1.x(ini))
d = (u - ind2.x(ini)) / (ind1.x(ini) - ind2.x(ini))
If ind1.x(ini) > ind2.x(ini) Then
x = Random(Random(a, b), Random(c, d))
ElseIf ind1.x(ini) = ind2.x(ini) Then
x = 0
Else
x = Random(Random(c, d), Random(a, b))
End If
Return x
End Function
Sub cruce_arit_total(ByRef ind1 As individuo, ByRef ind2 As individuo)
Dim a As Double = valor_random()
For i = 0 To UBound(ind1.x)
ind1.x(i) = fun_cruce_int(i, ind1, ind2, a)
ind2.x(i) = fun_cruce_int(i, ind2, ind1, a)
Next
End Sub
Public Function posicion_random(ByRef ind As individuo)
Microsoft.VisualBasic.VBMath.Randomize()
Dim r As Integer
r = Int((UBound(ind.x) + 1) * Rnd())
Return r
End Function
Function valor_random()
'valor random de 0 a 1
Microsoft.VisualBasic.VBMath.Randomize()
Dim m As Double
m = Rnd()
Return m
End Function
Public Function random(ByVal low, ByVal high)
Microsoft.VisualBasic.VBMath.Randomize()
Dim r As Integer
r = (high - low + 1) * Rnd() + low
Return r
End Function
End Class