Outils logiciels pour les cours Paris II
Cours Paris II
Stages/ Thèses/ Séminaires |
Cours 9Volume de Polytopes La programmation linéaire résoud des problèmes Max ct.x A . x < b en trouvant des solutions rationnelles. Peut-on trouver des solutions entières? Peut-on calculer le volume du polytope? Pour étudier ces problèmes, il faut étudier des grilles régulières et leur intersection avec les polytopes définis par A . x < b. Observations :
Hyperplans et grilles : Il est recommandé de réduire la taille des cellules Excel pour représenter des hyperplans en dimension 2 (droites). Le système de coordonnées est x horizontal x>0 et y>0 vers le bas vertical. L'origine est le coin en haut à gauche.
' draw line y= -x+30 I=abscisse et J=ordonnée For I = 1 To 30 J = 30 - I Cells(J + 1, I).Select With Selection.Interior .ColorIndex = 7 .Pattern = xlSolid End With Next I
y > -x+30 y < x/2 +30 y > 2x -30 Sub Main() Worksheets(1).Activate ' draw line y= -x+30 For I = 1 To 30 J = 30 - I Cells(J + 1, I).Select With Selection.Interior .ColorIndex = 7 .Pattern = xlSolid End With Next I ' draw line y= x/2+30 For I1 = 1 To 60 J = 30 + (I1 / 2) Cells(J + 1, I1).Select With Selection.Interior .ColorIndex = 11 .Pattern = xlSolid End With Next I1 ' draw line y= 2x-30 For I1 = 16 To 45 J = 2 * (I1) - 30 Cells(J, I1).Select With Selection.Interior .ColorIndex = 8 .Pattern = xlSolid End With Next I1 ' UserForm1.Show
Le Userform1 est similaire à celui défini lors des marches aléatoires: Argument 1= nombre d'itérations Argument 2 non utilisé CommandeButton1 = Start CommandeButton2 = Stop
Private Sub CommandButton1_Click() Dim I1 As Integer, J1 As Integer Dim v As String Worksheets(1).Activate ' Bouton d'itération i: entre 0 et m ' Bouton d'itération j: entre 0 et m ' On affiche le point i+1, j+1 dans le carré 1,m-1
Do While k <= Cells(1, 1) + 1 Randomize L = CInt((Rnd * 4) + 0.5) If L = 1 Then I1 = Abs(I - 1) If L = 2 Then I1 = I + 1 If L = 3 Then J1 = Abs(J - 1) If L = 4 Then J1 = J + 1 ' Verify that I1,J1 is inside: Check=0 if outside! If (Check(I1, J1) = 0) Then I1 = I J1 = J End If ' construct I1;J1 and insert in a sorted list v = CStr(I1) + ";" + CStr(J1) insertion (v) Worksheets(1).Activate 'Cells(1, 4) = v Cells(J1 + 1, I1).Select With Selection.Interior .ColorIndex = 11 .Pattern = xlSolid End With ' update k, I and J k = k + 1 I = I1 J = J1 Loop End Sub
Check=0 si on sort et Check=1 si on est à l'intérieur. Function Check(x As Integer, y As Integer) As Integer Check = 0 If (x + y > 30 And y - (x / 2) < 30 And (2 * x) - y < 30) Then Check = 1 End Function
Public Sub insertion(valeurcherchee As String) Worksheets(2).Activate Dim premligne, derligne, lireligne As Double ' Dim valeurcherchee As String premligne = 2 derligne = Cells(1, 2) + 1 'valeurcherchee = InputBox("valeur cherchée") While premligne <> derligne - 1 lireligne = Int((premligne + derligne) / 2) Range("A" & lireligne).Select If Selection = valeurcherchee Then ' MsgBox ("trouvee en " + CStr(lireligne)) IJ = 1 Exit Sub Else If Selection > valeurcherchee Then derligne = lireligne Else premligne = lireligne End If End If Wend If Range("A" & premligne).Value = valeurcherchee Then ' MsgBox ("trouvé en " + premligne) IJ = 1 Else If Range("A" & derligne).Value = valeurcherchee Then ' MsgBox ("trouvé en " + derligne) IJ = 1 Else 'check < than first If Range("A2").Value > valeurcherchee Then premligne = 1 End If ' check > last If Range("A" & derligne).Value < valeurcherchee Then premligne = derligne End If 'general case :insertion just after premligne Cells(premligne + 1, 1).Select Selection.EntireRow.Insert Cells(premligne + 1, 1) = valeurcherchee Cells(1, 2) = Cells(1, 2) + 1 ' MsgBox ("Non trouvé") End If End If End Sub
La liste triée du Worksheet 2 donne l'ensemble des positions atteintes. Pour voir le volume, il suffit d'insérer le polytope dans un cube dont on connait le volume. Le volume approché est le nombre de positions, c'est-à-dire la taille de la liste divisée par le nombre de points du cube, multiplié par le volume du cube. |