• Aucun résultat trouvé

Algorithmique et Programmation — Examen sur machine: solution —

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithmique et Programmation — Examen sur machine: solution —"

Copied!
2
0
0

Texte intégral

(1)

Algorithmique et Programmation

Examen sur machine: solution

G1: keriven(at)certis.enpc.fr G2: thorstensen(at)certis.enpc.fr G3: aganj(at)certis.enpc.fr G4: etyngier(at)certis.enpc.fr G5: segonne(at)certis.enpc.fr G6: chariot(at)certis.enpc.fr

— 08/12/06

1 // Voyageur de commerce 2

3 #include <win>

4 #include <iostream>

5 #include <ctime>

6 #include <cmath>

7 using namespace Win;

8 using namespace std;

9

10 const int n=20;

11 const int tmax=10000000;

12 const int w=512,h=512;

13 const double Tinit=10;

14

15 void genere(Pixel c[n]) 16 {

17 for (int i=0;i<n;i++) { 18 c[i].x=10+rand()%(w-20);

19 c[i].y=10+rand()%(h-20);

20 }

21 } 22

23 void dessine(Pixel c[n]) 24 {

25 for (int i=0;i<n;i++)

26 DrawLine(c[i],c[(i+1)%n],Green);

27 for (int i=0;i<n;i++) 28 FillCircle(c[i],2,Red);

29 } 30

31 double longueur(Pixel c[n]) 32 {

33 double l=0;

34 for (int i=0;i<n;i++)

35 l+=sqrt(pow(c[i].x-c[(i+1)%n].x,2)+pow(c[i].y-c[(i+1)%n].y,2));

36 return l;

37 } 38

39 void copie(Pixel c[n],Pixel d[n]) { 40 for (int i=0;i<n;i++)

41 d[i]=c[i];

42 } 43

44 void mute(Pixel c[n],Pixel d[n]) { 45 copie(c,d);

46 int i1=rand()%n;

1

(2)

47 int i2;

48 do {

49 i2=rand()%n;

50 } while (i2==i1);

51 Pixel tmp=d[i1];

52 d[i1]=d[i2];

53 d[i2]=tmp;

54 } 55

56 void mute2(Pixel c[n],Pixel d[n]) { 57 copie(c,d);

58 int i1=rand()%n;

59 int i2;

60 do {

61 i2=rand()%n;

62 } while (abs(i2-i1)<2);

63 int imin=min(i1,i2);

64 int imax=max(i1,i2);

65 for (int i=0;i<=(imax-imin)/2;i++) { 66 Pixel tmp=d[i+imin];

67 d[i+imin]=d[imax-i];

68 d[imax-i]=tmp;

69 }

70 } 71

72 int main() 73 {

74 srand(unsigned(time(0)));

75 OpenWindow(w,h);

76 Pixel C[n];

77 genere(C);

78 dessine(C);

79 double lc=longueur(C);

80 cout << lc << endl;

81 for (int t=1;t<=tmax;t++) {

82 Pixel D[n];

83 //mute(C,D);

84 mute2(C,D);

85 double ld=longueur(D);

86 double T=Tinit/sqrt(double(t));

87 if (ld<lc || (ld-lc>1e-5 && (double(rand())/RAND_MAX)<exp(-(ld-lc)/T))) {

88 copie(D,C);

89 lc=ld;

90 Clear();

91 dessine(C);

92 cout << lc << endl;

93 }

94 }

95 Terminate();

96 return 0;

97 }

2

Références

Documents relatifs

Vous aurez aussi besoin d'un chier image de votre choix que vous copierez dans le même dossier que votre programme, par exemple forty-licks.png dans ce dossier.. [IMAGINEPP_ROOT] est

Dans un chier corde.h, écrivez une structure Corde, comprenant un tableau de float (les valeurs y des points) et le nombre d'intervalles n4. Dans corde.cpp, implémentez des

Dans le chier diagramme.h, écrivez la structure Diagramme avec 3 champs : n (le nombre d'automates, un entier), nmax (taille maximum du diagramme) et un tableau d'automates6.

Dans la fonction spirale, créez un tableau pour mémoriser le fait qu'une case a été visitée ou

[r]

Programmer une fonction décidant, de façon approchée après un nombre maximum d'itérations, si un complexe appartient à M.. Dessiner ces points d'une couleur intermédiaire entre noir

[r]

Le but de l’exercice demandé est de générer et de dessiner tous les chemins possibles entre deux points en utilisant une fonction récursive.. 1.2