Imports GA_Sequencer.GeneticEngine
Public Class Form1
Private Engine As New GeneticEngine.Engine()
Private [Stop] As Boolean = False
Private LastResult As Boid
Private Sub nudPopulationSize_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nudPopulationSize.ValueChanged
nudCrossovers.Maximum = nudPopulationSize.Value / 2 - 1
End Sub
Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click
btnStop.Enabled = True
GeneralData.MaxTreeDepth = nudMaxTreeDepth.Value
GeneralData.MutationProbability = nudMutationProbability.Value
Engine.Reset()
Dim X, Y As Double
For Each R As DataGridViewRow In dgvData.Rows
If R.Index = dgvData.Rows.Count - 1 Then
Exit For
End If
If R.Cells(0).Value Is DBNull.Value Or R.Cells(1).Value Is DBNull.Value Then
MessageBox.Show("Compiare correttamente la riga " & (R.Index + 1) & ".", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
Else
X = CDbl(R.Cells(0).Value)
Y = CDbl(R.Cells(1).Value)
End If
Engine.X.Add(X)
Engine.Y.Add(Y)
Next
GeneralData.ValueSizeOrder = (Engine.X.Average() + Engine.Y.Average()) / 2
Engine.PopulationSize = nudPopulationSize.Value
Engine.CrossoverNumber = nudCrossovers.Value
Engine.Elitism = chbElitism.Checked
Dim PrevBestFitness As Double = Double.MaxValue
Do
Engine.NextGeneration()
lblGeneration.Text = "Numero generazione: " & Engine.CurrentGeneration
With Engine.BestBoid
If .Fitness < PrevBestFitness Then
Engine.BestBoid.Expression.MainNode = Engine.BestBoid.Expression.MainNode.Simplify()
txtResult.Text = .Expression.ToString()
lblError.Text = "Errore: " & .Fitness
PrevBestFitness = .Fitness
LastResult = Engine.BestBoid
End If
If .Fitness = 0 Then
txtResult.Text = .Expression.ToString()
MessageBox.Show("Il programma ha trovato la soluzione perfetta!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
[Stop] = True
End If
End With
Application.DoEvents()
Loop Until [Stop] = True
btnStop.Enabled = False
btnTryVariation.Enabled = True
[Stop] = False
End Sub
Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
[Stop] = True
End Sub
Private Sub btnTryVariation_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTryVariation.Click
btnStop.Enabled = True
Dim Temp As Boid
Dim Index As Int32 = 1
Do
lblGeneration.Text = "Numero generazione: " & Index
Temp = New Boid(False)
Temp.Expression.MainNode = LastResult.Expression.MainNode.TryVariation()
Temp.Fitness = Engine.EvaluateFitness(Temp)
If Temp.Fitness < LastResult.Fitness Then
txtResult.Text = Temp.Expression.ToString()
lblError.Text = "Errore: " & Temp.Fitness
LastResult = Temp
End If
If Temp.Fitness = 0 Then
txtResult.Text = Temp.Expression.MainNode.Simplify().ToString()
MessageBox.Show("Il programma ha trovato la soluzione perfetta!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
[Stop] = True
End If
Index += 1
Application.DoEvents()
Loop Until [Stop]
btnStop.Enabled = False
[Stop] = False
End Sub
Private Sub btnEvaluate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEvaluate.Click
Try
Dim Evaluator As Object = Globals.CreateEvaluator(txtResult.Text)
dgvEvaluatedData.Rows.Clear()
For Each R As DataGridViewRow In dgvData.Rows
If R.Index = dgvData.Rows.Count - 1 Then
Exit For
End If
Dim Value As Double = CDbl(R.Cells(0).Value)
dgvEvaluatedData.Rows.Add(Value, Globals.Evaluate(Evaluator, Value))
Next
Catch Ex As Exception
MessageBox.Show("Espressione non valida!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End Sub
End Class