二维装箱算法

摘要:
要求:将箱子装到车上/**策略上下文(打包工具)@author27381@versionV1.0@date2020/12/5.*/publicclassContextStrategyextendsAbstractloader{LoaderStrategyloaderStrategy;publicContextStrtegy(LoaderStrategyp_loaderStrateg){load
需求:把箱子装到车上

二维装箱算法第1张

/**

  • 策略上下文

  • 〈装箱工具〉

  • @author 27381

  • @version V1.0

  • @date 2020/12/5.
    */
    public class ContextStrategy extends Abstractloader {
    LoaderStrategy loaderStrategy;

    public ContextStrategy(LoaderStrategy p_loaderStrategy) {
    loaderStrategy = p_loaderStrategy;

    }

    public void build() {
    loaderStrategy.load(getSheet(), getTruck());
    }
    }

/**

  • DESCRIPTION: 策略接口,如果以后要扩展其他装载策略,请添加实现此接口,添加策略。
  • Created by hdk on 2020/12/5.
  • @version V1.0
    */

public interface LoaderStrategy {
void load(XSSFSheet c_sheet, Truck c_truck);
/**
* POI合并单元格及期样式设置
* @param sheet
* @param box
*/
default void PutBox(XSSFSheet sheet, Box box){
XSSFRow row = sheet.getRow(box.getFirstRow());
XSSFCell cell = row.getCell((short) box.getFirstCol());
cell.setCellValue(box.getContent().replace("R","").replace("L",""));
cell.getCellStyle().setAlignment(HorizontalAlignment.CENTER);
cell.getCellStyle().setVerticalAlignment(VerticalAlignment.CENTER);

    final CellRangeAddress cellRangeAddress = new CellRangeAddress(box.getFirstRow(), box.getLastRow() - 1, box.getFirstCol(), box.getLastCol() - 1);

    RegionUtil.setBorderBottom(BorderStyle.THIN, cellRangeAddress, sheet);
    RegionUtil.setBorderLeft(BorderStyle.THIN, cellRangeAddress, sheet);
    RegionUtil.setBorderRight(BorderStyle.THIN, cellRangeAddress, sheet);
    RegionUtil.setBorderTop(BorderStyle.THIN, cellRangeAddress, sheet);

    cell.getCellStyle().setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());// 增加颜色  灰色
    cell.getCellStyle().setFillPattern(FillPatternType.SOLID_FOREGROUND);

    sheet.addMergedRegion(cellRangeAddress);
}

}

/**

  • 〈装载抽象

  • 〈〉

  • @author hdk

  • @version V1.0

  • @date 2020/12/5.
    */
    abstract class Abstractloader {

    public Truck getTruck() {
    return truck;
    }

    public void setTruck(Truck truck) {
    this.truck = truck;
    }

    private Truck truck;

    public XSSFSheet getSheet() {
    return sheet;
    }

    public void setSheet(XSSFSheet sheet) {
    this.sheet = sheet;
    }

    XSSFSheet sheet;

}

**

  • 卡车

  • 〈〉

  • @author hdk

  • @version V1.0

  • @date 2020/12/5.
    */
    public class Truck {

    //宽
    private int width = 240;
    //长
    private int length = 1200;

    public int getWidth() {
    return width;
    }

    public int getLength() {
    return length;
    }

    public Truck(int p_width, int p_length) {
    width = p_width;
    length = p_length;
    }

    public List getBoxs() {
    return Boxs;
    }

    public Truck() {
    }

    private List Boxs = new ArrayList();

    public void put(Box box) {
    Boxs.add(box);
    }
    }

/**

  • @author hdk

  • @version V1.0

  • @date 2020/12/5.
    */
    public class Box {
    //宽
    private int width;
    //长
    private int length;

    public int getWidth() {
    return width;
    }

    public int getLength() {
    return length;
    }

    public int getFirstRow() {
    return firstRow;
    }

    public int getLastRow() {
    return lastRow;
    }

    public int getFirstCol() {
    return firstCol;
    }

    public int getLastCol() {
    return lastCol;
    }

    private int firstRow;

    public void setFirstRow(int firstRow) {
    this.firstRow = firstRow;
    }

    public void setLastRow(int lastRow) {
    this.lastRow = lastRow;
    }

    public void setFirstCol(int firstCol) {
    this.firstCol = firstCol;
    }

    public void setLastCol(int lastCol) {
    this.lastCol = lastCol;
    }

    private int lastRow;
    private int firstCol;
    private int lastCol;

    public Box( int y,int x, String p_content) {
    width = y;
    length = x;
    content = p_content;
    // 240 * 1200
    }

    public String getContent() {
    return content;
    }

    public void setContent(String content) {
    this.content = content;
    }

    private String content;

    public int getCellCountY(){
    return width/10;
    }

    /**
    *

    • @return
      */
      public int getCellCountX(){
      return length/10;
      }

}

/**

  • 240*1200

  • 卡车装箱策略

  • @author hdk

  • @version V1.0

  • @date 2020/12/5.
    */
    public class TruckLoaderStrategy implements LoaderStrategy {

    @Override
    public void load(XSSFSheet c_sheet, Truck c_truck) {
    int y = c_truck.getWidth();//2401200 厘米 24120
    int x = c_truck.getLength();

     int firstRow = 19, firstCol = 11;
    
     for (int i = 0; i < c_truck.getBoxs().size(); ) {
         final Box box = c_truck.getBoxs().get(i);
    
         if (i == 0) {//第一个箱子
             box.setFirstRow(firstRow);
             box.setFirstCol(firstCol);
    
         } else {
             final Box preBox = c_truck.getBoxs().get(i - 1);
    
             box.setFirstRow(preBox.getLastRow());
             box.setFirstCol(preBox.getFirstCol());
             //判断列是否装满
             if (preBox.getLastRow() + box.getCellCountY() > (firstRow + (y / 10))) {
                 box.setFirstRow(firstRow);
    
                 int prepreCol = 0;
                 if (i - 2 >= 0) {//比较前面两个箱子,以最长的箱子为准,不然会导致箱子重叠
                     prepreCol = c_truck.getBoxs().get(i - 2).getLastCol();
                 }
                 int max = Math.max(preBox.getLastCol(), prepreCol);
                 box.setFirstCol(max);
             }
    
         }
    
         box.setLastRow(box.getCellCountY() + box.getFirstRow());
         box.setLastCol(box.getCellCountX() + box.getFirstCol());
    
         //只能放右边
         if (box.getContent().indexOf("R") > -1 && box.getFirstRow() > firstRow) {
             c_truck.getBoxs().set(i, c_truck.getBoxs().get(i + 1));
             c_truck.getBoxs().set(i + 1, box);
             continue;
         }
         //只能放左边
         if (box.getContent().indexOf("L") > -1 && box.getFirstRow() == firstRow) {
             if (i < c_truck.getBoxs().size()) {//最后一位不能调换
    
                 c_truck.getBoxs().set(i, c_truck.getBoxs().get(i + 1));
                 c_truck.getBoxs().set(i + 1, box);
                 continue;
    
             }
         }
    
         if (box.getLastCol() <= (11 + x / 10)) {//判断是否超过车长
             PutBox(c_sheet, box);
         }
         i++;
    
     }
    

    }

}

测试

@Test
public void testContextStrategy() {

    int width2 = 300, height2 = 300;


    String fileToBeRead = "D:\out\生成模板.xlsx"; // excel位置
    String fileToBeRead1 = "D:\out\生成模板1.xlsx"; // excel位置
    int coloum = 11; // 比如你要获取第1列
    try {
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(
                fileToBeRead));
        XSSFSheet sheet = workbook.getSheet("Sheet2");

// XSSFSheet sheet3 = workbook.cloneSheet(0,"Sheet3");
Truck truck = new Truck(240, 1200);

        truck.put(new Box(150, 110,"1"));
        truck.put(new Box(110, 110,"2"));
        truck.put(new Box(130, 130,"3"));
        truck.put(new Box(130, 130,"4"));
        truck.put(new Box(110, 110,"5"));
        truck.put(new Box(150, 110,"6"));
        truck.put(new Box(90, 110,"7"));
        truck.put(new Box(200, 110,"8"));
        truck.put(new Box(120, 150,"9"));
        truck.put(new Box(120, 120,"10"));

        List<Box> Boxs = truck.getBoxs();

        final TruckLoaderStrategy truckLoaderStrategy = new TruckLoaderStrategy();

        ContextStrategy loaderStrategy = new ContextStrategy(truckLoaderStrategy);
        loaderStrategy.setSheet(sheet);
        loaderStrategy.setTruck(truck);
        loaderStrategy.build();


        FileOutputStream out = null;
        try {
            out = new FileOutputStream(fileToBeRead1);
            workbook.write(out);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
效果

二维装箱算法第2张

免责声明:文章转载自《二维装箱算法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#获取显示器宽度高度,桌面宽度高度等Windows使用ssh命令指定.pem文件出现: Load key "key.pem": Permission denied 和 Permissions for 'key.pem' are too open 问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

二维vector的使用

    和数组一样,数组有二维的数组,vector也有二维的vector。下面就介绍一下二维vector的使用方法。     一般声明初始化二维vector有三种方法     (1) vector< vector<int> > v(n,vector<int>(m));   //在声明的时候就一次性指定vector内外层的...

图像处理-余弦变换

什么是DCT? 一维DCT变换 一维DCT变换时二维DCT变换的基础,所以我们先来讨论下一维DCT变换。一维DCT变换共有8种形式,其中最常用的是第二种形式,由于其运算简单、适用范围广。我们在这里只讨论这种形式,其表达式如下: 其中,f(i)为原始的信号,F(u)是DCT变换后的系数,N为原始信号的点数,c(u)可以认为是一个补偿系数,可以使DCT变换矩阵...

Matlab图像处理系列4———傅立叶变换和反变换的图像

注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理。这些方法称为变换域方法,最常见的变换域是频域。 使用Fourier变换把图像从空间域变换到频域。在频域内做对应增强处理,再从频域变换到空间域得到处理后的图像。...

二维码(QR code)基本知识

1.二维码定义:   二维码(2-Dimensional Bar Code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。它是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、...

[POJ1195] Mobile phones(二维树状数组)

题目链接:http://poj.org/problem?id=1195 题意:四种操作: 0:初始化一个S*S的零矩阵 1:点(x,y)是值+A 2:查询一个子矩阵里所有数的和 3:退出 线段树由于不能在两棵树之间传递标记,所以这种求和的操作非常难处理。 改学了一下而为树状数组,发现可是比二维线段树简单多了。 记得之前曾经看过zkw线段树的ppt讲稿,好像...

二维矩形装箱问题(2D rectangular packing problem, 简称2DRP)介绍

写在前面 由于某些原因,这篇文章还没写完就作者就搞别的问题去了,写到一半很不好意思,大家可以去看原文对应的论文进一步研究:【A skyline heuristic for the 2D rectangular packing and strip packing problems】。祝大家学习顺利~ 前言 今天为大家介绍二维矩形装箱问题(2D recta...