Pas d'inquiétude, avec PBAdonf, c'est dans la poche ! ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 05-11-2008 15:20:41

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Algorithme (à la recherche du meilleur)

Bonjour,

Voici ce qui m'améne.

Prenons le tableau suivant :

Nb ope     Indice   P1   P2   P3   P4
    2              1       x     x
                    2              x      x     x
                    3       x             x     x
    3              1       x     x      x
                    2              x      x     x
                    3       x             x     x
                    4       x      x            x

Si je vous donne comme info : nb_ope = 3   et P1 = x, P3 = x, qu'elle est le meilleure indice.

A l'oeil, je veux bien, mais l'algo, vous avez ?


Attention, le codage doit se réaliser en TSQL sous MS SQL, donc algo simple (je demande pas la soluce en TSQL).

Attention:
Pour ceux qui aime bien se casser la tête seulement.

PS:
Je n'ai pas encore la soluce

Hors ligne

 

#2 05-11-2008 15:27:54

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Algorithme (à la recherche du meilleur)

qq précisions :
* ton tableau est un select * d'une table ou le résultat d'une requête plus complexe ? si oui laquelle ?
* P4 est le dernier élément, ou c'est un cas particulier d'un algo général avec Pn ?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 05-11-2008 15:46:58

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Ha,
J'aime les courageux.

Voiçi plus d'éléments...

Code: sql

Declare @T1 Table
 (
   nb_ope int,
   ind        int,
   pdt       varchar(10)
 )

Insert into @T1 values (2,1, 'P1')
Insert into @T1 values (2,1, 'P2')
Insert into @T1 values (2,2, 'P2')
Insert into @T1 values (2,2, 'P3')
Insert into @T1 values (2,2, 'P4')
Insert into @T1 values (2,3, 'P1')
Insert into @T1 values (2,3, 'P3')
Insert into @T1 values (2,3, 'P4')

Insert into @T1 values (3,1, 'P1')
Insert into @T1 values (3,1, 'P2')
Insert into @T1 values (3,1, 'P3')
Insert into @T1 values (3,2, 'P2')
Insert into @T1 values (3,2, 'P3')
Insert into @T1 values (3,2, 'P4')
Insert into @T1 values (3,3, 'P1')
Insert into @T1 values (3,3, 'P3')
Insert into @T1 values (3,3, 'P4')
Insert into @T1 values (3,4, 'P1')
Insert into @T1 values (3,4, 'P2')
Insert into @T1 values (3,4, 'P4')
/*
Le tableau est une vue créé dynamiquement à partir ces infos. La petite crois est appliqué quand il y a la valeur de l'entête dans pdt.

L'information peut être stocké sous la forme suivante :
*/
Declare @info Table
 (
  dateprod   datetime,
  nb_ope     int,
  pdtused    varchar(10)
 )

insert into @info values ('01/11/08', 3, 'P1')
insert into @info values ('01/11/08', 3, 'P3')

/*Pour compliquer la soluce */
insert into @info values ('02/11/08', 2, 'P3')
insert into @info values ('02/11/08', 2, 'P4')

/* Bien entendu, nous sommes ds le cas Pn */


[Message de modération]
la balise est code=sql

Hors ligne

 

#4 05-11-2008 16:06:15

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

J'ai la soluce.

Mais si vous êtes d'accord (les modérateurs), on peut offrir beaucoup de pépites pour celui qui trouve la solution sans utiliser de curseur.

C'est mieux qu'un Sudoku, non.

Hors ligne

 

#5 05-11-2008 16:07:16

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Merci modération.

Hors ligne

 

#6 05-11-2008 16:40:47

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: Algorithme (à la recherche du meilleur)

cposervices a écrit:

Si je vous donne comme info : nb_ope = 3   et P1 = x, P3 = x, qu'elle est le meilleure indice.

Je suis peut-être un peu fatigué - vu qu'erasorz est monté de suite au créneau - mais moi je comprend déjà pas la question...
Quand tu demande le meilleur indice, tu veux dire meilleur dans quel sens?

Hors ligne

 

#7 05-11-2008 17:03:13

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Le plus petit (le premier dans l'ordre croissant, Si 1 pas bon, alors 2, ...).

Sorry pour ce manquement.

Hors ligne

 

#8 05-11-2008 17:52:00

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

heu,

On m'appelle l'erreur.

J'ai pas la soluce

Hors ligne

 

#9 05-11-2008 17:59:40

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Algorithme (à la recherche du meilleur)

un premier jet :

Code: sql

SELECT MIN( IND )
  FROM (   SELECT IND, COUNT( DISTINCT PDT ) 
             FROM ( SELECT IND, PDT FROM T1 WHERE NB_OPE = 3 AND PDT IN ( 'P1', 'P3' ) )
         GROUP BY IND HAVING COUNT( DISTINCT PDT ) >= 2 
       ) 
;


NB : si tu veux satisfaire plus de Pi, p.ex N, il faudra modifier le 2 en N dans HAVING COUNT(DISTINCT PDT)>=2, ce qui fait que ça n'est pas la requête la plus générale, mais je suis à cours de neurones actifs à cette heure-ci...


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#10 05-11-2008 18:25:16

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

C'est pas ça.

J'ai enfin trouvé la soluce.

Mais je vous laisse chercher. Au fait, les modérateurs, combien vous offrez de pépites ?

Hors ligne

 

#11 06-11-2008 07:09:51

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Algorithme (à la recherche du meilleur)

j'offre 1M (de ma poche) mais j'aimerais bien avoir un énoncé clair...
du genre, paramètres en entrées, résultat souhaité...


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#12 06-11-2008 09:19:33

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Bon je me reprends.

Soit la possibilité d'affecter des opérateurs à des postes de travails selon le nombre d'opérateur et un indice préférentiel, c'est à dire que selon ce que l'on doit produire, on priviligéria l'indice 1, sinon le 2, etc... (mais ce point est juste pour éclaircir le besoin d'un indice).

Ce qui donne lorsqu'on met en forme le tableau suivant :

Nb ope     Indice   P1   P2   P3   P4
    2              1       x     x
                    2              x      x     x
                    3       x             x     x
    3              1       x     x      x
                    2              x      x     x
                    3       x             x     x
                    4       x      x            x

On utilise donc cela pour attribuer des OF à des opérateurs sur des postes de travails. Ceci est stocké dans le système.

Selon le besoin, tout les postes de travails ne sont pas forcément attribué alors qu'il serait possible de le faire.

Lorsque l'on ressort la planif, on peut extraire l'information suivante :

Nb ope = 3 et P2 utilisé et P4 utilisé (je change par rapport au début du message, mais cela n'a aucune importance).

Si je dois replanifier, je dois tenir compte de ces OF déjà validé (choix du planificateur, il veut, il a).
Mais je dois trouver quelle est le meilleure indice associé.

Dans ce cas, c'est :
Nb ope     Indice   P1   P2   P3   P4
    2              1       x     x
                    2              x      x     x
                    3       x             x     x
    3              1       x     x      x
                    2              x      x     x
                    3       x             x     x
                    4       x      x            x

Facile à dire à l'oeil, mais comment le faire en SQL ?

Vous avez les tables ci-dessus.

Au fait, c'est faisable en une requête.

Est-ce clair ?

A+

Hors ligne

 

#13 06-11-2008 09:30:47

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Algorithme (à la recherche du meilleur)

erasorz a écrit:

du genre, paramètres en entrées, résultat souhaité...

je reformule , donne moi le prototype, p.ex :

Code: sql

FUNCTION RECHERCHE_MEILLEUR_INDICE( NB_OPE IN NUMBER, [...] ) RETURN NUMBER ;

-- c'est le  [...]  qui m'intéresse   :p

N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#14 06-11-2008 10:19:36

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Si tu regardes le code SQL un peu plus haut, tu trouveras ton ... dans la table info

Il faut à partir de cette table info retrouver les meilleures indices de la table T1.

Hors ligne

 

#15 06-11-2008 11:13:07

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: Algorithme (à la recherche du meilleur)

MS SQL hein?

Ben alors c'est super facile:

Code: sql

with temp(ind, ordre)
as
(
select a2.ind, rank() over(order by a2.ind asc) as ordre
  from @T1 a2
  where nb_ope = 3
  group by a2.ind
  having sum( case when a2.pdt in ('P2', 'P4') then 1 else 0 end ) >= 2
)
select ind
from temp
where ordre = 1


Les arguments étant le In('P2', 'P4'), le >= 2 et le nb_ope = 3

[modif]Hein? la table Info? Elle sert à quoi celle là? Je croyais que tu cherchais avec quel indice assigner les op à leur poste, qu'est ce qu'on est censé faire de la table des présence effectives?

Hors ligne

 

#16 06-11-2008 11:19:46

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

non,non

dejà tu as deux requêtes pour sortir le resultat.

De plus, il faut que tu utilises la table info.

En effet, le planning n'est pas tjrs le même, et je ne vais changer mon programme en fnct de celui-ci.

Le resultat doit être de la forme :

Select ... date_prod, indice
From ....
Order by ...

Tout en utilisant uniquement @T1 et @info.

J'aide beaucoup la, mais ca tient dans les ...

Dernière modification par cposervices (06-11-2008 11:20:41)

Hors ligne

 

#17 06-11-2008 11:22:48

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: Algorithme (à la recherche du meilleur)

cposervices a écrit:

non,non

dejà tu as deux requêtes pour sortir le resultat.

Négatif chef, c'est bien un seul select que tu vois là... Y a juste une clause with, c'est ça qui fait penser à 2 requêtes. En plus, SQL server 2005 est über-optimisé pour ces nouvelles clause CTP...

Hors ligne

 

#18 06-11-2008 11:31:12

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Ok,

Mais tu n'utilises pas @info et tu fixes P1 et P2.

C'est pas bon.

Hors ligne

 

#19 06-11-2008 11:35:48

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: Algorithme (à la recherche du meilleur)

cposervices a écrit:

Ok,

Mais tu n'utilises pas @info et tu fixes P1 et P2.

C'est pas bon.

Haaaa, j'ai compris!!!

Tu veux récupérer l'indice optimal pour un jour x (en lisant l'abaque @T1), sachant que ce jour x, tu as les postes y1 et y1 qui sont occupés (cf. table @info). Et afficher une liste de jours avec chaque fois son index optimum pour ce jour...

C'est ça? Pfiouuu, si c'est ça je vois enfin l'intéret de @info...

Hors ligne

 

#20 06-11-2008 11:37:58

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Hors ligne

 

#21 06-11-2008 11:41:59

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Je suis sous SQL Server 2000, mais si vous trouvez pour 2005, on dira que vous avez gagné.

Mais cette petite discussion m'aura déjà permis d'optimiser ma soluce. Merci.

Hors ligne

 

#22 06-11-2008 11:42:03

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: Algorithme (à la recherche du meilleur)

Code: sql

select i.dateprod, min(t.ind)
from @info i
  join @T1 t on i.nb_ope = t.nb_ope and i.pdtused = t.pdt
group by i.dateprod
having count(distinct i.pdtused) >= 2


Yatzee!




Ouups... avais oublié le having...

Hors ligne

 

#23 06-11-2008 11:50:20

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Ca ne marche pas !

si tu ajoutes ce cas :
/*Pour compliquer la soluce */
insert into @info values ('03/11/08', 2, 'P1')
insert into @info values ('03/11/08', 2, 'P3')
insert into @info values ('03/11/08', 2, 'P4')


Ta requête retourne 1.

C'est pas bon, parce que la, il n'y a pas le choix, c'est 3.

Nb ope     Indice   P1   P2   P3   P4
    2              1       x     x
                    2              x      x     x
                    3       x             x     x
    3              1       x     x      x
                    2              x      x     x
                    3       x             x     x
                    4       x      x            x

Hors ligne

 

#24 06-11-2008 11:51:23

cposervices  
Membre completement Geek
Date d'inscription: 02-07-2008
Messages: 106
Pépites: 1,000,382
Banque: 0

Re: Algorithme (à la recherche du meilleur)

Mais rassure toi, la mienne non plus du coup.

Hors ligne

 

#25 06-11-2008 12:11:42

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: Algorithme (à la recherche du meilleur)

Code: sql

select o.dateprod, (
  select top 1 t.ind
  from @info i
    join @T1 t on i.nb_ope = t.nb_ope and i.pdtused = t.pdt
  where i.dateprod = o.dateprod
  group by i.dateprod, t.ind
  having count(distinct t.pdt) >= (select count(z.pdtused) from @info z where z.nb_ope = o.nb_ope and z.dateprod = o.dateprod)
  order by i.dateprod asc, t.ind asc
)
from @info o
group by o.dateprod, o.nb_ope


...suis-je distrait...

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22