Advertisement
Guest User

test

a guest
Apr 4th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 4.70 KB | None | 0 0
  1. # NOM1 Prénom1 - NOM2 Prénom2
  2.  
  3. using JuMP, GLPKMathProgInterface # On va utiliser JuMP et GLPK
  4.  
  5.  
  6. # Structures contenant les données d'un problème de bin-packing mono-dimensionnel
  7. struct objet1D
  8.     taille::Int64 # Taille de l'objet
  9.     nb::Int64 # Nombre d'objets de la même taille
  10. end
  11.  
  12. struct donnees1D
  13.     T::Int64 # Taille d'un bin
  14.     nb::Int64 # Nombre de taille d'objets différents
  15.     tab::Vector{objet1D} # Tableau des objets à insérer dans les bins
  16. end
  17.  
  18.  
  19. # Structures contenant les données d'un problème de bin-packing bi-dimensionnel
  20. struct objet2D
  21.     l::Int64 # Largeur de la pièce
  22.     h::Int64 # Hauteur de la pièce
  23.     nb::Int64 # Nombre d'objets dans ce format
  24. end
  25.  
  26. struct donnees2D
  27.     L::Int64 # Largeur d'un bin
  28.     H::Int64 # Hauteur d'un bin
  29.     nb::Int64 # Nombre de types d'objet différents
  30.     tab::Vector{objet2D} # Tableau des objets à insérer dans les bins
  31. end
  32.  
  33.  
  34. # Fonction prenant en entrant un nom de fichier et retournant les données du problème
  35. function parser_data1D(nomFichier::String)
  36.     # Ouverture d'un fichier en lecture
  37.     f = open(nomFichier,"r")
  38.  
  39.     # Lecture de la première ligne pour connaître la taille d'un bin et le nombre de tailles différentes pour les objets à ranger
  40.     s::String = readline(f) # lecture d'une ligne et stockage dans une chaîne de caractères
  41.     ligne::Vector{Int64} = parse.(Int64,split(s," ",keepempty = false)) # Segmentation de la ligne en plusieurs entiers, à stocker dans un tableau
  42.     T::Int64 = ligne[1]
  43.     nb::Int64 = ligne[2]
  44.  
  45.     # Allocation mémoire pour le tableau des objets
  46.     tab = Vector{objet1D}(undef,nb)
  47.  
  48.     # Lecture des infos sur les objets (sur chaque ligne : taille + nombre)
  49.     for i in 1:nb
  50.         s = readline(f)
  51.         ligne = parse.(Int64,split(s," ",keepempty = false))
  52.         tab[i] = objet1D(ligne[1],ligne[2])
  53.     end
  54.  
  55.     # Fermeture du fichier
  56.     close(f)
  57.  
  58.     # Retour des donnees
  59.     return donnees1D(T,nb,tab)
  60. end
  61.  
  62.  
  63. # Fonction prenant en entrant un fichier et retournant les données du problème
  64.  
  65. function parser_data2D(nomFichier::String)
  66.     # Ouverture d'un fichier en lecture
  67.     f = open(nomFichier,"r")
  68.  
  69.     # Lecture de la première ligne pour connaître la largeur et la hauteur d'un bin et le nombre de types d'objets différents à ranger
  70.     s::String = readline(f) # lecture d'une ligne et stockage dans une chaîne de caractères
  71.     ligne::Vector{Int64} = parse.(Int64,split(s," ",keepempty = false)) # Segmentation de la ligne en plusieurs entiers, à stocker dans un tableau
  72.     L::Int64 = ligne[1]
  73.     H::Int64 = ligne[2]
  74.     nb::Int64 = ligne[3]
  75.  
  76.     # Allocation mémoire pour le tableau des objets
  77.     tab = Vector{objet2D}(undef,nb)
  78.  
  79.     # Lecture des infos sur les objets (sur chaque ligne : largeur + hauteur + nombre)
  80.     for i in 1:nb
  81.         s = readline(f)
  82.         ligne = parse.(Int64,split(s," ",keepempty = false))
  83.         tab[i] = objet2D(ligne[1],ligne[2],ligne[3])
  84.     end
  85.  
  86.     # Fermeture du fichier
  87.     close(f)
  88.  
  89.     # Retour des donnees
  90.     return donnees2D(L,H,nb,tab)
  91. end
  92.  
  93.  
  94. #Heuristique Best-fit
  95.  
  96. function best_fit(data::donnees1D)
  97.  
  98.     tab_bin = [0]
  99.     sort!(data.tab, by = x -> x.taille, rev=true)
  100.  
  101.     for i in 1:data.nb
  102.         for j in 1:data.tab[i].nb
  103.             for k in 1:size(tab_bin,1)
  104.                 if (tab_bin[k] + data.tab[i].taille <= 30)
  105.                     tab_bin[k] += data.tab[i].taille
  106.                     sort!(tab_bin, rev=true)
  107.                 elseif (k == size(tab_bin, 1))
  108.                     push!(tab_bin, data.tab[i].taille)
  109.                 end
  110.             end
  111.         end
  112.     end
  113.     return size(tab_bin, 1)
  114. end
  115.  
  116.  
  117. function modelImplicite(solverSelected, data::donnees1D, tailleBin::Int64, nbBin::Int64)
  118.     m = Model(solver = solverSelected)
  119.  
  120.     @variable(m, x[1:28,nbBin], Bin) #obj i rangé dans bin j
  121.     @variable(m, y[1:nbBin], Bin) #si obj dans bin j
  122.  
  123.     @objective(m, Min, sum(y[j] for j in 1:nbBin))
  124.  
  125.     @constraint(m, obligRange, sum((x[i,j] for j in 1:nbBin) for i in 28) == 1)
  126.     @constraint(m, limiteTaille, (sum(t[i]x[i,j] for i in 1:28)) <= (tailleBin * y[j] for j in 1:nbBin))
  127.    
  128.     return m
  129. end
  130.  
  131.     data = parser_data1D("A4.dat")
  132.     tailleBin = data.T
  133.     #nbObj = sum(data.tab[i,2] for i in 1:data.nb)
  134.     nbBin = best_fit(data)
  135.  
  136. m = modelImplicite(GLPKSolverMIP(),data, tailleBin, nbBin)
  137.  
  138.     status = solve(m)
  139.  
  140.     if status == :Optimal
  141.      println("Problème résolu à l'optimalité")
  142.  
  143.       println("z = ",getobjectivevalue(m)) # affichage de la valeur optimale
  144.    
  145.       println("nbBin = ",getvalue(nbBin))
  146.  
  147.     elseif status == :Unbounded
  148.       println("Problème non-borné")
  149.  
  150.     elseif status == :Infeasible
  151.       println("Problème impossible")
  152. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement