PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2025 → Calcul Optiimisé: Je cherche une méthode
Calcul Optiimisé: Je cherche une méthode
Started by Ralph IGCI, Dec., 13 2025 2:09 PM - 9 replies
Registered member
543 messages
Posted on December, 13 2025 - 2:09 PM
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 modified, December, 13 2025 - 2:26 PM
Registered member
1,015 messages
Posted on December, 13 2025 - 6:16 PM
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
Registered member
4,322 messages
Posted on December, 13 2025 - 9:31 PM
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 modified, December, 13 2025 - 9:38 PM
Registered member
902 messages
Posted on December, 13 2025 - 11:05 PM
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 modified, December, 13 2025 - 11:05 PM
Registered member
543 messages
Posted on December, 14 2025 - 8:20 AM
Merci,
J'ai reconstituer. Mais j'ai une erreur à corriger.
Dans L'l'utillisation,
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


p_tabCommandeArticle n'est pas reconnu. COmment corriger ? Dois rendre m_tabCommandeArticle PUBLIQUE ou créer p_tabCommandeArticle PUBLIQUE ?
Merci encore
Message modified, December, 14 2025 - 9:47 AM
Registered member
543 messages
Posted on December, 14 2025 - 9:44 AM
Honnêtement, c'est plus que espéré pour la compréhension
Registered member
4,322 messages
Posted on December, 14 2025 - 2:45 PM
Ralph IGCI a écrit :
p_tabCommandeArticle n'est pas reconnu. COmment corriger ? Dois rendre m_tabCommandeArticle PUBLIQUE ou créer p_tabCommandeArticle PUBLIQUE ?

ça a du sauter à la copie,

Tu dois créer un getter :
Procedure PUBLIQUE p_tabCommandeArticle()

RENVOYER m_tabCommandeArticle


En POO, on ne rend visible (PUBLIC) que ce que l'utilisateur (de la classe) a le droit d'utiliser.
Note:
Il faut modifier la dernière ligne de la méthode Optimisation
SI moPlafond<>0 ALORS //Parfois, ça tombe juste
:Ajustement(moPlafond)
FIN

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Message modified, December, 14 2025 - 2:53 PM
Registered member
4,322 messages
Posted on December, 14 2025 - 3:17 PM
Par contre je me demande si la règle des 3% s'applique au montant total ou à l'article le moins cher.
En effet, dans notre cas, si avant l'ajustement, il reste 0,04€ à "dépenser" (moNouveauPlafond après le traitement de l'article le moins cher), pourquoi ajouter 12€.

A voir avec l'utilisateur
--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Message modified, December, 14 2025 - 3:28 PM
Registered member
543 messages
Posted on December, 15 2025 - 8:30 AM
Merci
Registered member
543 messages
Posted on December, 15 2025 - 9:09 AM
Bonjour
Ma question était de savoir, et si on mettait un article obligatoire. C'est ce qui arrive souvent dans ce genre d'exercice, il y a une chose qui doit être là à tout prix, comment la prendre en compte proprement.
je prends le cas d'une ménagère qui doit pour une cérémonie acheter tout mais l'huile et le sel sont obligatoire.
Toujours dans le sens de l'optimisation, les articles peuvent être choisis de façon aleatoire pour que l'optimisation sois variant.
Au besoin, fixer le budget pour l'article. Il faudrait dans ce cas faire évoluer l'Optimisation
Message modified, December, 15 2025 - 9:56 AM