PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Calcul Optiimisé: Je cherche une méthode
Calcul Optiimisé: Je cherche une méthode
Débuté par Ralph IGCI, 13 déc. 2025 14:09 - 3 réponses
Membre enregistré
536 messages
Posté le 13 décembre 2025 - 14:09
Bonjour,
je cherche une procédure pour optimiser un tableau
J'ai une structure et je désire varier les qté pour trouver un total.
Je veux une méthode pour monter l'algorithme

J'ai dans la procédure globale

stfiche est une structure
id est une entier
qte est une réel
Val_Unit est un monétaire
Val_ligne est un monétaire //qte*Val_Unit
FIN




J'ai la procedure suivante :
Procedure Best(moMvaleur est un monétaire,tabLeaudetailsfichebase est un tableau de stfiche)


tabLeaudetailsfiche est un tableau de stfiche

//TAF


RENVOYER tabLeaudetailsfiche


Dans TAF, je dois jour sur le paramètres qte de jusqu'à obtenir la somme de Val_ligne =moMvaleur

Je cherche les pistes.
je ne souhaite pas jouer les Val_Unit, même comme c'est une option. En discutant avec le fournisseur, je ne dois pas depasser une variation de 3% en cas de besoin
Message modifié, 13 décembre 2025 - 14:26
Membre enregistré
1 011 messages
Posté le 13 décembre 2025 - 18:16
Bonjour,

si j'ai bien compris, vous avez une marge de 3% applicable sur : moMvaleur
dans ce cas, vous pouvez faire le calcul suivant :

UnitMax = PartieEntière((moMvaleur * 1.03) / Val_Unit)

par exemple, pour moMvaleur = 50 et 3% de variation soit 51.5, et val_Unit = 2.5
UnitMax = PartieEntière(51.5 / 2.5)
UnitMax = 20

donc vous pouvez faire varier votre tableau de 1 à 20 sans dépasser moMValeur + 3%

Cdlt
Membre enregistré
4 318 messages
Posté le 13 décembre 2025 - 21:31
Bonjour,
L'idée est de calculer le nombre de produit le plus cher qu'il est possible d'acheter. Avec ce qu'il reste on calcule la quantité d'article possible dont le prix est juste inférieur, etc.
Une fois cela terminé, on tente d'ajouter un produit dont le prix est le plus petit, et on vérifie que l'on ne dépasse pas les 3% de marge.

CArticle est une Classe
PRIVÉ
m_pkId_Article est entier sur 8
m_saDésignation est une chaîne
m_moPrixArticle est monétaire
m_nQuantité est entier
//Val_Ligne se calcule donc n'a rien à faire dans la sructure/classe
//car une modification de la quantité oblige à refaire le calcul (si on y pense)
//Ici, Val_Ligne est obtenue par ValeurCommandeArticle().et aurait pu être omise,
//Le nouveau plafond étant calculé via la formule moPlafond=moPlafond-(m_nQuantité*:m_moPrixArticle)
FIN

Procedure Constructeur(pkId est entier sur 8,saDésignation est chaîne,moPrix est monétaire)
//Syntaxe 1
:m_pkId_Article=pkId
:m_saDésignation=saDésignation
:m_moPrixArticle=moPrix

Procedure Constructeur()
//Syntaxe 2

Getter/Setter
Procedure PUBLIQUE p_pkId_Article() : entier sur 8 octets

RENVOYER m_pkId_Article
Procedure PUBLIQUE p_pkId_Article(pkValeur est un entier sur 8 octets)

m_pkId_Article=pkValeur
Procedure PUBLIQUE p_moPrixArticle() : monétaire

RENVOYER m_moPrixArticle
Procedure PUBLIQUE p_moPrixArticle(moValeur est un monétaire)

m_moPrixArticle=moValeur
Procedure PUBLIQUE p_saDésignation() : chaîne

RENVOYER m_saDésignation
Procedure PUBLIQUE p_saDésignation(saValeur est une chaîne)

m_saDésignation=saValeur
Procedure PUBLIQUE p_nQuantité() : entier

RENVOYER m_nQuantité
Procedure PUBLIQUE p_nQuantité(nValeur est un entier)

m_nQuantité=nValeur

//Méthode de travail
FONCTION PUBLIQUE ValeurCommandeArticle() :monétaire

RENVOYER :m_moPrixArticle*:m_nQuantité

Procedure QuantitéMax(moPlafond est monétaire)
//moPlafond est global donc sa valeur sera répercutée dans le membre appelant

SI (moPlafond>=p_moPrixArticle) ALORS //l'article vaut moins cher que le plafond
m_nQuantité=PartieEntière((moPlafond)/:p_moPrixArticle)
moPlafond=moPlafond-:ValeurCommandeArticle() //Le nouveau plafond correspond à l'ancien moins le total des achats de l'article
FIN


Classe Commande
CCommande est une Classe
PRIVÉ
m_tabCommandeArticle est tableau de CArticle
FIN

//Méthode principale
Procedure Optimisation(moPlafond est monétaire)
nIndice est un entier
moNouveauPlafond est monétaire

TableauTrie(m_tabCommandeArticle,ttMembre,"-m_moPrixArticle")

moNouveauPlafond=moPlafond
POUR nIndice = 1 _À_ :NbArticle
//Calcule de la quantité d'achat possible pour l'article en cours (celui qui à ce moment vaut le plus cher)
m_tabCommandeArticle[nIndice]:QuantitéMax(moNouveauPlafond)
FIN

//A ce moment, il reste un peu d'argent mais pas assez pour acheter un article (le moins cher) en plus.
//On va tenter d'ajouter un article dont le prix est le plus bas et vérifier que nous ne dépassons pas le plafond fixé + 0,3%
Ajustement(moPlafond)

:Méthodes annexe
Procedure NouvelArticle(clUnArticle est un CArticle)
TableauAjoute(:m_tabCommandeArticle,clUnArticle)

FONCTION PRIVÉE TotalCommande() :monétaire
nIndice est un entier
moTotal est un monétaire

POUR nIndice=1 _À_ :m_tabCommandeArticle..Occurrence
moTotal+=:m_tabCommandeArticle[nIndice]:ValeurCommandeArticle
FIN

RENVOYER moTotal

Procedure PRIVÉE Ajustement(moPlafond)

m_tabCommandeArticle[:NbArticle]:p_nQuantité++
SI :TotalCommande()>moPlafond*1.03 ALORS //C'est la cas Épouse X, ça dépasse
//On revient à l’ancienne quantité
m_tabCommandeArticle[:NbArticle]:p_nQuantité--
FIN

Procedure PUBLIQUE NbArticle()
RENVOYER :m_tabCommandeArticle..Occurrence


Utilisation
clUnArticle est CArticle
clUneCommande est CCommande

<BLOC Initialisation exemple>
clUnArticle=allouer un CArticle(1,"Art 1",37)
clUneCommande.NouvelArticle(clUnArticle)

clUnArticle=allouer un CArticle(2,"Art 2",49)
clUneCommande.NouvelArticle(clUnArticle)

clUnArticle=allouer un CArticle(3,"Art 3",12)
clUneCommande.NouvelArticle(clUnArticle)

clUnArticle=allouer un CArticle(4,"Art 4",25)
clUneCommande.NouvelArticle(clUnArticle)
<FIN>

clUneCommande.Optimisation(1561)

POUR TOUT clArticle de clUneCommande:p_tabCommandeArticle
TraceConstruit("%1%4%2%4%3",clArticle:p_saDésignation,clArticle:p_moPrixArticle,clArticle:p_nQuantité,TAB)
FIN


--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Message modifié, 13 décembre 2025 - 21:38
Membre enregistré
902 messages
Posté le 13 décembre 2025 - 23:05
Waouuuuuu Voroltinquo ! ;)

Tu n'as pas l'algorytme pour gagner au loto ??

Ah oui, il faudrait que je joue !!
Dommage que le questionneur ne paie pas à la ligne et à l'aide fournie, tu serais riche.

En tout cas, programmation propre, structurée, moderne.
Même si je n'ai pas copié et testé :p
Bonne fin de week-end Voroltinquo
Message modifié, 13 décembre 2025 - 23:05