Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Corrigé Examen OP

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 5

3ème année licence Recherche Opérationnelle (2022/2023) Module : Outils de programmation pour la RO

Section A et B 25 mai 2023

Examen final (corrigé)

Exercice 1. (6 pts)
1. Soit X et Y variables aléatoires discrètes à valeurs respectivement dans {x1 , . . . , xn } et {y1 , . . . , yn },
écrire un programme (fonctions) qui permet de calculer X̄, V ar(X), σX , et Cov(X, Y ), avec :
n n n
1X 1X 2
p 1X
X̄ = xi , V ar(X) = (xi − X̄) , σX = V ar(X), Cov(X, Y ) = (xi − X̄)(yi − Ȳ )
n i=1 n i=1 n i=1
2. Écrire la fonction Somme(n,k) qui calcule la somme suivante :
k
1 X k! in
(n,k) −→ (−1)k−i , avec : 0 ⩽ k ⩽ n.
k! i=0 i!(k − i)!

3. Donner le nombre d’instructions et la complexité de chaque fonction.


Solution exercice 1.(3+3)
Parties 1
1 # 1 - - - - - - - -3 pts - - - - - - - -
2 def X_bar ( X ) :
3 s =0
4 for i in X :
5 s += i
6 return s / len ( X )
7 def Var ( X ) :
8 Xbar = X_bar ( X )
9 s =0
10 for i in X :
11 s +=( i - Xbar ) **2
12 return s / len ( X )
13 def SegmaX ( X ) :
14 varx = Var ( X )
15 return varx **0.5
16 def Cov (X , Y ) :
17 xbar , ybar , s = X_bar ( X ) , X_bar ( Y ) ,0
18 for i in range ( len ( X ) ) :
19 s +=( X [ i ] - xbar ) *( Y [ i ] - ybar )
20 return s / len ( X )
21 def fact ( k ) :
22 s =1
23 for i in range (1 , k +1) :
24 s *= i
25 return s
3ème année licence Recherche Opérationnelle (2022/2023) Module : Outils de programmation pour la RO
Section A et B 25 mai 2023

26 def Somme (n , k ) :
27 s =0
28 for i in range ( k +1) :
29 s +=(( -1) **( k - i ) ) *(( fact ( k ) *( i ** n ) ) ) /( fact (k - i ) * fact ( i ) )
30 return s / fact ( k )
31 # 2 - - - - - - - - - -0 pts - - - - - - - - - - - -
32 X =[1 ,2 ,3 ,5 ,4 ,6 ,8 ,4 ,5 ,2 ,1 ,6 ,10]
33 Y =[9 ,2 ,1 ,5 ,1 ,6 ,8 ,4 , -6 ,2 , -8 ,6 , -10]
34 print ( " xbar = " , X_bar ( X ) )
35 print ( " Var ( X ) = " , Var ( X ) )
36 print ( " Segma ( X ) = " , SegmaX ( X ) )
37 print ( " ybar = " , X_bar ( X ) )
38 print ( " Var ( Y ) = " , Var ( Y ) )
39 print ( " Segma ( Y ) = " , SegmaX ( Y ) )
40 print ( " Cov (X , Y ) = " , Cov (X , Y ) )

Partie 3 (3 pts) complexité. Soit n = |X|=|Y|


— Calcul de X̄ est en (O(n)) : n additions (O(n)) et une division (O(1)).
— Calcul de V ar(X) est en (O(n)) : un appel à la fonction X̄ donc O(n). n soustractions (O(n)),
n multiplications (O(n)), n carrés (O(n)), n additions (O(n)), et une division (O(1)).
— σX : Un appel à la variance O(n) et une opération puissance (O(1))
— Calcul de Cov(X, Y ) : deux appels à la fonction X̄ donc O(n), n soustractions (O(n)), n
multiplications (O(n)), n additions (O(n)), et une division (O(1)).
— Pour la fonction Somme(n, k), le nombre d’instructions dépend de la valeur de k car il y a une
boucle de la forme ”f or i in range(k + 1)” et nous avons besoin de la factorielle de k qui est
d’ordre de O(k) (voir Fact(k) : k multiplications ).
La complexité de Somme(n, k) est donc d’ordre O(k 2 ) : on a k appels a la fonction F act(k)
(O(k 2 )), k appels a la fonction F act(k − i) (O(k 2 )), k appels a la fonction F act(i) (O(k 2 )), 3k
multiplications (O(k)), 2k carrés (O(k)), k additions (O(k)), et k divisions (O(k)).
Exercice 2.(7 pts) Posons le PL suivant :


 min(ou max) Z(x) = αf (X) + βg(X)



 s.c.,

a11 x1 +... +a1n xn ≥ b1 ,

(P )

 a21 x1 +... +a2n xn = b2 ,




 a31 x1 +... +a3n xn ≤ b3 ,
minj ≤ xj ≤ maxj , j = 1, ..., n.

Où,

X = (x1 , ..., xn ), f (X) = p1 x1 + ... + pn xn , g(X) = c1 x1 + ... + cn xn et α, β ∈ [0, 1]tq.α + β = 1.

1. Écrire un programme Python pour l’initialisation de α, β, n, aij , pj , cj , bi , minj et maxj , avec i =


3ème année licence Recherche Opérationnelle (2022/2023) Module : Outils de programmation pour la RO
Section A et B 25 mai 2023

1, ..., 3 et j = 1, ..., n.
2. On considère que le choix de la maximisation ou de la minimisation du PL (P ) se fait grâce à
une variable booléenne (MiniMax) à initialiser par l’utilisateur.

maximisation, si M iniM ax = 0,
minimisation, si M iniM ax = 1.
Écrire un programme en Python permettant de résoudre (P ).

Solution exercice 2.(3+4)


Parties 1 et 2.
1 # 1) - - - - - - - - - - - - -3 pts - - - - - - - -
2 n = int ( input ( " Donner la valeur de n : " ) )
3 Min , Max ,P ,C , a1 , a2 , a3 =[] ,[] ,[] ,[] ,[] ,[] ,[]
4 Alpha = float ( input ( " Donner la valeur de Alpha (0 <= Alpha <=1) : " ) )
5 Beta =1 - Alpha
6 for i in range ( n ) :
7 Min . append ( float ( input ( " Donner la valeur de Min " + str ( i ) + " : " ) ) )
8 Max . append ( float ( input ( " Donner la valeur de Max " + str ( i ) + " : " ) ) )
9 P . append ( float ( input ( " Donner la valeur de P " + str ( i ) + " : " ) ) )
10 C . append ( float ( input ( " Donner la valeur de C " + str ( i ) + " : " ) ) )
11 a1 . append ( float ( input ( " Donner la valeur de a1 " + str ( i ) + " : " ) ) )
12 a2 . append ( float ( input ( " Donner la valeur de a2 " + str ( i ) + " : " ) ) )
13 a3 . append ( float ( input ( " Donner la valeur de a3 " + str ( i ) + " : " ) ) )
14 b1 = float ( input ( " Donner la valeur de b1 : " ) )
15 b2 = float ( input ( " Donner la valeur de b2 : " ) )
16 b3 = float ( input ( " Donner la valeur de b3 : " ) )
17

18 # 2) - - - - - - - - - -4 pts - - - - - - - - - -
19 import numpy as np
20 from scipy . optimize import linprog
21 a1 = np . array ( a1 )
22 a2 = np . array ( a2 )
23 a3 = np . array ( a3 )
24 P = Alpha * np . array ( P ) # alpha * f ( x )
25 C = Beta * np . array ( C ) # beta * g ( x )
26 # Au lieu de maximiser la fonc obj , vous pouvez la minimiser .
27 minimax = int ( input ( " Donner la valeur de minimax (0 si maximisation et 1 si
minimisation ) : " ) )
28 if minimax :
29 Obj = np . array ( P + C ) # alpha * f ( x ) + beta * g ( x ) cas de minimisation minimax =1
30 else :
31 Obj = - np . array ( P + C ) # - alpha * f ( x ) - beta * g ( x ) cas de maximisation minimax =0
32 # Les contraintes d ’ inegalite
33 lhs_ineq = [ - a1 , # Contrainte >= multiplier l ’ inegalite ( >=) par -1 pour obtenir
3ème année licence Recherche Opérationnelle (2022/2023) Module : Outils de programmation pour la RO
Section A et B 25 mai 2023

( <=) .
34 a3 ] # Contrainte <=
35 rhs_ineq = [ - b1 , # Contrainte >=
36 b3 ] # Contrainte <=
37 # Contrainte d ’ egalite
38 lhs_eq = [ a2 ]
39 rhs_eq = [ b2 ]
40 # Contraintes de Min_j <= x_j <= Max_j
41 bnd =[]
42 for i in range ( n ) :
43 bnd . append (( Min [ i ] , Max [ i ]) ) # Bornes de x_i
44

45

46 Opt = linprog ( c = Obj , A_ub = lhs_ineq , b_ub = rhs_ineq ,


47 A_eq = lhs_eq , b_eq = rhs_eq , bounds = bnd ,
48 method = " revised simplex " )

Exercice 3. (7 pts)

1. Ecrire une classe Cercle en langage Python, permettant de représenter un cercle avec trois
attributs : le Rayon et les coordonnées du centre (x,y). Cette classe possède :
— Un constructeur permettant l’initialisation des attributs lors de la création d’un objet.
— Une méthode P erimetre() permettant de calculer le périmètre du cercle.
— Une méthode Surf ace() permettant de calculer la surface du cercle.
— Une méthode P ointAppartenance(self, x, y) de la classe qui permet de tester si un point
avec les coordonnées (x, y) appartient ou non au cercle.
— Une méthode CircleInterconnects(self, C) qui permet de tester si deux objets "self" et
"C" de la classe Cercle sont interconnectés.
2. Écrire un programme permettant de tester la classe Cercle.
Solution exercice 3.(4+3 Parties 1 et 2.
1 # 1) - - - - - - - - - - - - -4 pts - - - - - - - -
2 from math import pi
3 class Cercle :
4 def __init__ ( self , rayon , x , y ) :
5 self . rayon = rayon
6 self . x = x
7 self . y = y
8 def Perimetre ( self ) :
9 return 2 * pi * self . rayon
10 def Surface ( self ) :
11 return pi * self . rayon ** 2
12 def Poi ntAppart enance ( self , x , y ) :
13 distance = ( ( self .x - x ) ** 2 + ( self .y - y ) ** 2) ** 0.5
14 return distance <= self . rayon
3ème année licence Recherche Opérationnelle (2022/2023) Module : Outils de programmation pour la RO
Section A et B 25 mai 2023

15 def Ce r c le I nt e r co n ne c ts ( self , C ) :
16 distance = ( ( self .x - C . x ) ** 2 + ( self .y - C . y ) ** 2) ** 0.5
17

18 return distance <= self . rayon + C . rayon


19

20 # 2 - - - - - - - - - - - - - - - - -3 - - - - - - - - - - - - - - - - - - - - - - - - - - - -
21 # Creation d ’ objets Cercle
22 C1 = Cercle ( 5 , 0 , 0)
23 C2 = Cercle ( 3 , 2 , 2)
24 # Appel des methodes Perimetre () et Surface ()
25 Perimetre_C1 = C1 . Perimetre ()
26 print ( ’ Perimetre de C1 = ’ , Perimetre_C1 )
27 Surface_C1 = C1 . Surface ()
28 print ( ’ Surface de C1 = ’ , Surface_C1 )
29 Perimetre_C2 = C2 . Perimetre ()
30 print ( ’ Perimetre de C2 = ’ , Perimetre_C2 )
31 Surface_C2 = C2 . Surface ()
32 print ( ’ Surface de C2 = ’ , Surface_C2 )
33 # Appel aux methodes Po intAppar tenance () et Ce r cl e I nt e rc o n ne c ts ()
34 point_test = ( 1 , 1)
35

36 poi n t _a p pa r t ie n t_ C 1 = C1 . Poi ntApparte nance (* point_test )


37 if po i nt _ ap p a rt i en t _ C1 :
38 print ( ’ point_test = ’ , point_test , " Appartien au cercle C1 " )
39 else :
40 print ( ’ point_test = ’ , point_test , " N ’ appartien pas au cercle C1 " )
41 poi n t _a p pa r t ie n t_ C 2 = C2 . P ointAppa rtenance (* point_test )
42 if po i nt _ ap p a rt i en t _ C2 :
43 print ( ’ point_test = ’ , point_test , " appartient au cercle C2 " )
44 else :
45 print ( ’ point_test = ’ , point_test , " n ’ appartien pas au cercle C2 " )
46 ce r c l e s _ i n t e r c o n n e c t e s = C1 . C e rc l eI n t er c on n ec t s ( C2 )
47 if c e r c l e s _ i n t e r c o n n e c t e s :
48 print ( " Les circuits C1 et C2 sont interconnectes " )
49 else :
50 print ( " Les circuits C1 et C2 ne sont pas interconnectes " )

Bonne chance !

Vous aimerez peut-être aussi