Advertisement
Guest User

Untitled

a guest
Apr 4th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 4.93 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, nbObj::Int64, nbBin::Int64)
  118.     m = Model(solver = solverSelected)
  119.  
  120.     @variable(m, x[1:nbObj,1: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[i in 1:nbObj], sum(x[i,j] for j in 1:nbBin) == 1)
  126.     @constraint(m, limiteTaille[j in 1:nbBin], (sum(t[i]x[i,j] for i in 1:nbObj)) <= (tailleBin * y[j]))
  127.    
  128.     return m
  129. end
  130.  
  131.     data = parser_data1D("B4.dat")
  132.     t=[0]
  133.     for m in 1:data.nb
  134.         for n in 1:data.tab[m].nb
  135.             push!(t, data.tab[m].taille)
  136.         end
  137.     end
  138.     tailleBin = data.T
  139.     nbObj = sum(data.tab[i].nb for i in 1:data.nb)
  140.     nbBin = best_fit(data)
  141.  
  142. m = modelImplicite(GLPKSolverMIP(), data, tailleBin, nbObj, nbBin)
  143.  
  144.     status = solve(m)
  145.  
  146.     if status == :Optimal
  147.      println("Problème résolu à l'optimalité")
  148.  
  149.       println("z = ",getobjectivevalue(m)) # affichage de la valeur optimale
  150.    
  151.       println("nbBin = ",getvalue(m[:y]))
  152.  
  153.     elseif status == :Unbounded
  154.       println("Problème non-borné")
  155.  
  156.     elseif status == :Infeasible
  157.       println("Problème impossible")
  158. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement