2015-04-22 2 views
2

У меня есть задача о назначенияхДинамические прог. Algo Прямоугольник Упаковка

Вам дается набор из п 2-мерных прямоугольников. Вам необходимо найти максимальную возможную упаковку подмножества прямоугольников размером . При упаковывании мы имеем , чтобы разместить меньший прямоугольник Ri в пределах большего прямоугольника Rj, если для этого соответствовать размерность . Например, если есть четыре прямоугольника R1 (2,3), R2 (2,4), R3 (4,5) и R4 (5,7), то наибольшая возможная упаковка размером имеет размер 3, который является {R4 < - R3 < -R1} или {R4 < -R3 < - R2} Разработать алгоритм динамического программирования для определения размера упаковки для любого заданного набора прямоугольников.

Я собираюсь решить это, сравнив размеры и подсчет, если один прямоугольник имеет меньшие размеры, чтобы его можно было упаковать.

Теперь как ученик мой вопрос, что другой подход должен должны быть приняты в связи с наличием этого предложения «Разработка алгоритма динамического программирования» Для меня это предложение не осуществление моего подхода. Я имею в виду, что единственная подсказка, которая приходит мне на ум, чтобы решить эту проблему, - это тот, о котором я упомянул.

Необходима помощь.

Я использовал следующий код;

package com.example.testing; 

import java.util.ArrayList; 
import java.util.List; 

public class RectangleTest { 
    public double height; 
    public double width; 

    public RectangleTest(double width, double height){ 
     this.width = width; 
     this.height = height; 
    } 
    public boolean canPutInside(RectangleTest r){ 
     if (this.width < r.width && this.height < r.height) 
      return true; 
     else 
      return false; 
    } 



    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     List<RectangleTest> rectangles = new ArrayList<RectangleTest>(); 
     rectangles.add(new RectangleTest(2 , 3)); 
     rectangles.add(new RectangleTest(2 , 4)); 
     rectangles.add(new RectangleTest(4 , 5)); 
     rectangles.add(new RectangleTest(5 , 7)); 
     rectangles.add(new RectangleTest(8 , 3)); 
     rectangles.add(new RectangleTest(26 , 4)); 
     rectangles.add(new RectangleTest(44 , 5)); 
     rectangles.add(new RectangleTest(5 , 1)); 
     rectangles.add(new RectangleTest(2 , 31 )); 
     rectangles.add(new RectangleTest(21 , 4)); 
     rectangles.add(new RectangleTest(6 , 51 )); 
     rectangles.add(new RectangleTest(7 , 7)); 
     rectangles.add(new RectangleTest(12 , 3)); 
     rectangles.add(new RectangleTest(31 , 4)); 
     rectangles.add(new RectangleTest(4 , 33 )); 
     rectangles.add(new RectangleTest(1, 7 )); 
     int highestPackaging = 0; 

     for(int i = 0 ; i < rectangles.size() - 1 ; i++){ 
      int count = 1; 
      for(int q = i +1 ; q < rectangles.size() ;q++){ 
       if(rectangles.get(i).canPutInside(rectangles.get(q))) 
       { 
        count++; 
       } 
      } 
      if(highestPackaging < count){ 
       highestPackaging = count; 
      } 
     } 

     System.out.println("Highest packaging size = "+ highestPackaging); 
    } 

} 
+0

Можете ли вы подробно остановиться на подходе, который вы пытаетесь? Это звучит как жадный (не уверен, не очень подробно), вы уверены, что это оптимально? – harold

+0

Я думаю, что я просто получаю грубую силу .. Я собираюсь проверить что-то вроде if (this.height SSH

+0

Мне кажется, что вы делаете жадный подход - что пахнет не оптимально для меня – amit

ответ

0

Это похоже на вариант longest path problem.

Предполагая, что это нормально, чтобы повернуть прямоугольники, чтобы подогнать их вместе, вы можете рассматривать каждый прямоугольник в качестве отправной точки в 2D-диаграммы рассеяния, где х (ширина) ≥ у (высота):

|        .   
    |       .   
    |       .    
    |      . A   
    |      .     
    |     . B   C 
    |     .   D   
y |    .      
    |    . E      
    |   .   F   G 
    |   .   H   I  
    |  .        
    |  .  J   K    
    | . L  M      
    | .  N   O     
    +-------------------------------------- 
        x 

Ваша задача состоит в том, чтобы найти самый длинный путь в графе, образованной эти точки (узлы), при условии ограничения, что ссылки могут быть расширены только к другим узлам с меньшим х и у координаты без обхода любых других узлов , Например, узел A может ссылаться на узлы B и D, но не на узел F, поскольку D находится в прямоугольнике, ограниченном F и A и в противоположных углах.

Свяжите каждый узел с числом, представляющим максимальную глубину пути, проходящим от этого узла, и запомните эти значения по мере продвижения. Затем ответ должен появиться довольно быстро.

+0

хм, ваш ответ действительно дает мне еще один способ взглянуть на эту проблему ... Я сделал некоторую работу с документом с приведенным примером ... так что снова небольшой запрос. Когда я собираюсь установить ограничения и проверить х и у для каждой точки она остается оптимальной? или я имею в виду, какой должен быть оптимальный способ, которым вы указываете. – SSH

+0

@SSH: Кажется, это дает оптимальное, но зачем сортировать коробки? Это не очень полезно. – Bytemain

Смежные вопросы