Bonjour,

Tout d'abord je suis nouveau donc je me présente.
HATTRY Jean-Athanase, étudiant en école d'ingénieur 21ans.

Je ne vais pas y aller par quatre chemins, je suis sensé avoir eu des cours de c++ lors de ma seconde année en école d'ingénieur sauf que le prof a décidé d'enseigner le complément des bases du c++ sans donner les bases car trop trivial pour lui (pas besoin d'ajouter que personne avait fait de c++ avant, du coup on n'a rien compris) j'ai donc appris le c++ avec le net de mon côté et vu les réponses que j'ai pu lire lorsque je cherchais des réponses à des problèmes visiblement ma façon de programmer n'est pas bonne car on ne m'a pas appris à le faire correctement.

Je vais en venir aux faits. J'ai programmé un programme pour résoudre le problème du sac à dos sur demande d'un autre prof. Celui-ci fonctionne actuellement mais j'aimerais progresser dans la manière de programmer pour faire des programmes "propres". Le soucis ne sera ici pas le fond mais la forme, je suis conscient que la méthode de résolution n'est pas optimale mais le prof souhaite que je procède de cette manière pour résoudre le problème.

je vous met en lien le projet en entier sous forme de fichier .rar et je vais mettre le main sous balise C++ ci-dessous.

http://www.fichier-rar.fr/2014/10/08/sac-a-dos/

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <iostream>
#include "main.h"
 
using namespace std;
 
int main()
{
 
 
    cout << "Bonjour et bienvenue sur ce programme de resolution du probleme du sac a dos" << endl << endl;
 
    int n = -1;
    int capa = -1;
    cout << "Combien d'objets possedez-vous?";
    while(!(cin >> n) || n<0)
    {
        cout << "Combien d'objets possedez-vous?";
        cin.clear();
        cin.ignore(1000,'\n');
    }
 
    cout << "Quelle est la capacite de votre sac?";
    while(!(cin >> capa) || capa<0)
    {
        cout << "Quelle est la capacité de votre sac?";
        cin.clear();
        cin.ignore(1000,'\n');
    }
 
    double profit [n];
    double volume [n];
    cout << "Pour la selection, veuillez entrer le profit espace volume : profit volume" << endl;
    cout << "Veuillez entrer vos objets :" << endl;
    bool test = true;
    for (int i = 0; i < n ; i++)
    {
        test = false;
        while(!test)
        {
            cout << i+1 << " : ";
            cin >> profit[i] >> volume[i];
            if (profit [i]<1 || volume [i]<1 || cin.eof())
            {
                cin.clear();
                cin.ignore(1000,'\n');
                test = false;
                cout << "Veuillez entrer des donnees positives!";
            }
            else test = true;
        }
    }
    int tab[n];
    for(int i=0;i<n;i++) tab[i]=0;
    initiale(profit,volume,tab,n,capa);
    metaheuri(profit,volume,tab,n,capa);
 
    cout << endl << "La solution trouve est :" << endl;
    cout << "Profit : " << somme(profit,n,tab) << endl;
    cout << "Volume occupe : " << somme(volume,n,tab) << endl;
 
    int k = 1;
 
    for(int i=0 ; i<n ; i++)
    {
        if(tab[i]==1)
        {
            cout << k << " : " << profit[i] << " " << volume[i] << endl;
            k++;
        }
    }
}
 
int somme(double *tab,int n,int *tab2)
{
    int total=0;
    for(int i=0 ; i<n ; i++) total=total+tab[i]*tab2[i];
    return total;
}
 
void initiale(double profit[], double volume[], int tab[], int n, int capa)
{
    double division[n];
    for(int i=0; i<n; i++)
    {
        division[i]=profit[i]/volume[i];
    }
    bool tab_en_ordre = false;
    double tampon[3];
    while(!tab_en_ordre)
    {
        tab_en_ordre=true;
        int taille=n;
        for(int i=0;i<taille-1;i++)
        {
            if(division[i]<division[i+1])
            {
                tampon[0]=profit[i+1];
                tampon[1]=volume[i+1];
                tampon[2]=division[i+1];
 
                profit[i+1]=profit[i];
                volume[i+1]=volume[i];
                division[i+1]=division[i];
 
                profit[i]=tampon[0];
                volume[i]=tampon[1];
                division[i]=tampon[2];
 
                tab_en_ordre=false;
            }
        }
        taille--;
    }
    bool tab_ini = false;
    int j=0;
    while(!tab_ini)
    {
        tab[j]=1;
        if(somme(volume,n,tab)>capa)
        {
            tab[j]=0;
            tab_ini=true;
        }
        else j++;
    }
}
 
void voisinage(double volume[],int tab[],int n, int capa)
{
    //rand()%c fait un random entre 0 et c
    bool test=false;
    int c,j=0;
    while (!test || j<50)
    {
        c = rand() % n;
        tab[c]=pow((tab[c]-1),2);
        if(somme(volume,n,tab)>capa)
        {
            tab[c]=pow((tab[c]-1),2);
            j++;
        }
        else test = true;
    }
}
 
void metaheuri(double profit[],double volume[],int tab[],int n,int capa)
{
    int solu[n];
    for(int i=0;i<n;i++) solu[i]=tab[i];
    for (int i=0; i<MAX;i++)
    {
        voisinage(volume,tab,n,capa);
        if(somme(profit,n,tab)>somme(profit,n,solu))
        {
            for(int j=0 ; j<n ; j++) solu[j]=tab[j];
        }
        else
        {
            for(int j=0 ; j<n ; j++) tab[j]=solu[j];
        }
    }
    for(int i=0;i<n;i++) tab[i]=solu[i];
}
Si vous avez de quelconques questions je tenterais d'y répondre.

Merci d'avance pour vos réponses ainsi que votre indulgence.

Bonne soirée.