Besoin de l'aide d'un ordinateur puissant

Discutez d'informatique ici !
PaulMaillet
Messages: 4
Enregistré le: 15 Fév 2022, 22:41

Besoin de l'aide d'un ordinateur puissant

par PaulMaillet » 19 Mar 2023, 21:03

Bonjour ! J'ai besoin d'un ordinateur afin de faire tourner rapidement un programme qui prend du temps...
Je suis au lycée et je fais des recherches sur les tiroirs anti-sommes, c'est-à-dire des tiroirs dont la somme de deux éléments ne donne pas la valeur d'un autre élément dans le même tiroir.
(a + b !=c, a b et c dans le même tiroir)
Dans ce programme, il y a trois tiroirs, il teste toutes les combinaisons possibles qui permettent d'aller jusqu'à un nombre donné (n) et vérifie en même temps si celles-ci sont anti-sommes. Ce programme permet de prouver quelle est la meilleure combinaison pour trois tiroirs.
En observant le temps que mettait le programme pour les petits nombres, j'ai déduit que le programme était d'une complexité exponentielle, et qu'il faudrait donc plusieurs jours pour qu'il puisse trouver la solution.
(6-7 jours pour n = 23 avec mon ordinateur (pas très puissant)selon mes calculs :/ )
C'est pourquoi j'aurai besoin que quelqu'un teste avec un ordinateur plus puissant, qui serait donc plus rapide le programme avec la valeur 23 puis 24.
Le programme devrait renvoyer plusieurs solutions pour 23 et rien pour 24 ce qui prouverait que 23 est le maximum. Ça m'aiderait beaucoup ! :gene:
Je mets ci-dessous le programme, la fonction à lancer est combi(n) :
Code: Tout sélectionner
import time
def gen_combinations(numbers, n):
    if n == 0:
        yield []
    else:
        for i in range(3):
            for sub_comb in gen_combinations(numbers, n-1):
                yield [i] + sub_comb

def combi(n):
    start_time = time.time() # démarrer le chronomètre
    numbers = list(range(1, n+1))
    combinaisons = []
    for combinaison in gen_combinations(numbers, n):
        tiroir1 = []
        tiroir2 = []
        tiroir3 = []
        for i in range(n):
            if combinaison[i] == 0:
                tiroir1.append(numbers[i])
            elif combinaison[i] == 1:
                tiroir2.append(numbers[i])
            else:
                tiroir3.append(numbers[i])
        if est_anti_somme(tiroir1) and est_anti_somme(tiroir2) and est_anti_somme(tiroir3):
            combinaisons.append((tuple(tiroir1), tuple(tiroir2), tuple(tiroir3)))

    if combinaisons == []:
        print("Il n'y a pas de solutions allant jusqu'à", n)
    else :
        print("il y a", len(combinaisons), 'possibilités')
    # Convertir les tuples en sous-listes
    result = [[list(tiroir1), list(tiroir2), list(tiroir3)] for (tiroir1, tiroir2, tiroir3) in combinaisons]
    end_time = time.time() # arrêter le chronomètre
    print(f"Temps d'exécution : {end_time - start_time:.4f} secondes")
    return result

def est_anti_somme(tab):
    '''
    Renvoie True si on NE peut PAS obtenir un élément du tableau en ajoutant deux élements
    de ce tableau et False sinon
    : param tab (list) tableau d'entiers
    : return (bool)
    >>> est_anti_somme([1, 2, 3])
    False
    >>> est_anti_somme([1, 2, 4, 5])
    False
    >>> est_anti_somme([2, 3, 7, 11])
    True
    >>> est_anti_somme([])
    True
    >>> est_anti_somme([0, 0, 0, 0])
    False
    >>> est_anti_somme([0])
    True
    '''
    if len(tab) < 2:
        return True
    return all(tab[i]+tab[j] not in tab for i in range(len(tab)) for j in range(i+1, len(tab)))

    return result



Avatar de l’utilisateur
chadok
Membre Relatif
Messages: 319
Enregistré le: 04 Nov 2017, 22:44
Localisation: Finistère Sud

Re: Besoin de l'aide d'un ordinateur puissant

par chadok » 02 Avr 2023, 12:17

Bonjour,

Je ne suis pas sûr de pouvoir beaucoup t'aider, désolé. Je sais juste que mes collègues sous-traitent leurs calculs d'aérodynamique / hydrodynamique sur des calculateurs externes, mais il me semble que ce n'est pas gratuit :-)
- Par curiosité, quelle config de PC utilises-tu ?
- Le Python a la réputation d'être facile à écrire, mais l'exécution des programmes reste lente. C'est un langage interprété, et non compilé. Pas moyen de l'écrire en C++ , ou autre ?

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Besoin de l'aide d'un ordinateur puissant

par lyceen95 » 06 Avr 2023, 16:09

Python est bien... tant qu'on ne fait pas des boucles. Ca devient une catastrophe dès qu'on doit faire une boucle sur 1 Million de lignes.
Il y a une librairie Itertools qui contient beaucoup d'utilitaires qui pourraient t'aider.
Lister toutes les façons de dispatcher 23 boules dans 3 urnes... puis vérifier quelles répartitions vérifient telles contraintes, ça devrait être raisonnable.
Ici, sauf erreur de ma part, tu recenses toutes les répartitions. Puis tu testes lesquelles sont conformes (fonction est_anti_somme() ) ; ce n'est pas optimisé du tout.
Une fois que 1,2,3 sont dans la même boite, toutes les répartitions qui commencent comme ça peuvent être éliminées, pas la peine de répartir les 20 autres boules.
Donc tu peux recenser par exemple toutes les solutions avec 10 boules (avec ton algorithme dans le pire des cas).
Puis tu testes, pour chaque solution, où peut on ajouter une boule n°11 , où peut-on ajouter une boule n°12, etc

Même en Python, même sans utiliser la librairie Itertools, ça devrait aller assez vite.

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Besoin de l'aide d'un ordinateur puissant

par lyceen95 » 08 Avr 2023, 10:08

J'ai fait l'expérience (pas en Python), et en moins d'une minute, avec l'algorithme que je décrivais, on a bien la confirmation qu'il y a des solutions pour 23, mais pas pour 24. J'essaie de voir ce qu'on obtient avec 4 tiroirs au lieu de 3, mais les premiers essais sont longs, et entrainent des dépassements de mémoire dans ma version 'basique'. Pour le fun, pour limiter les nombres de solutions, je vais peut-être modifier la contrainte : un nouveau nombre ne peut être ajouté dans un tiroir que si on ne peut pas l'obtenir par somme de 2 ou 3 éléments de ce tiroir.
Et donc par exemple, (1,2,4,7) dans le même tiroir serait impossible, parce que 7=1+2+4.

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Besoin de l'aide d'un ordinateur puissant

par lyceen95 » 08 Avr 2023, 10:37

Suite (et fin ?)
Donc, avec 4 tiroirs, avec la règle un peu plus contraignante ci-dessus, on trouve qu'on peut aller jusqu'au nombre 55.

phyelec
Membre Rationnel
Messages: 948
Enregistré le: 06 Mar 2020, 17:47

Re: Besoin de l'aide d'un ordinateur puissant

par phyelec » 08 Avr 2023, 16:38

Bonjour,
je veux bien tester votre programme sur mon PC avec python(x,y). Mais il me semble qu'il manque le programme principal.

lyceen95
Membre Complexe
Messages: 2255
Enregistré le: 15 Juin 2019, 00:42

Re: Besoin de l'aide d'un ordinateur puissant

par lyceen95 » 09 Avr 2023, 15:08

Le main contiendrait une seule ligne : combin(23)

Je pense que l'OP a l'habitude d'utiliser Python sans main(), ce que j'appelle en mode 'console'.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 11 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite