Как создать алгоритм, который будет продолжать работать алгоритм до успеха в Java

Еще один -

 #  ^-?0*(?:20(?:[0-4][0-9]|5[0-5])|[0-9]{1,3})$

 ^ 
 -?
 0*
 (?:
      20
      (?:
           [0-4] [0-9] 
        |  
           5 [0-5] 
      )
   |  
      [0-9]{1,3} 
 )
 $
0
задан boo 21 January 2019 в 05:40
поделиться

2 ответа

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

создайте метод, который находит наименьшее количество самых больших пакетов, в которые может поместиться ваш заказ. допустим, он помещается в 4 больших ящика. затем возьмите каждую большую коробку и попытайтесь упаковать ее в меньшие коробки. трассы будут выглядеть примерно так, где прямоугольник 5 - самый большой прямоугольник, а прямоугольник 1 - самый маленький прямоугольник.

box5 - box5 - box5- box5
box5 - box5 - box5- box4
box5 - box5 - box5- box3
box5 - box5 - box5- box2
box5 - box5 - box5- box1

, что пробег будет вписываться в 3 больших ящика и 1 маленький ящик.

Код для поиска самого большого ящика, вероятно, будет подобным циклу while

int boxCount = getInitBoxCount(products);

public int getInitBoxCount(ArrayList<BoxItems> items)
{
    if(productsFit(products,sizeLarge) == null)
    {
        ArrayList<BoxItems> temp1 = new ArrayList<BoxItems>();
        ArrayList<BoxItems> temp2 = new ArrayList<BoxItems>();

        for(int x = 0; x < items.length ; x++)
        {
           if(x > items.length/2)
           {
               temp1.add(items.get(x)) 
           }
           else
           {
               temp2.add(items.get(x))
           }
        }
        return getInitBoxCount(temp1) + getInitBoxCount(temp2);
    }
    return 1;
}

. Это будет постоянно разбивать ваш список BoxItems пополам, пока он не уместится в число ящиков

[119 ] так что теперь мы определили порядок доставки, который будет работать, но, возможно, у него будет много дополнительного места.

Следующие 2 шага состоят в создании рекурсивного способа обрезки размера блока, такого как

// 5 is the largest

public int getSmallestBox(int boxsize,ArrayList<BoxItems> items)
{
    if(productsFit(boxsize -1)!= null)
    {
        return getSmallestBox(boxsize -1, items)
    }
    else
        return boxsize;
}

, и который получит наименьшую коробку, в которую мы можем поместить элементы. Последнее, что вам нужно проверить, это комбинирование ящиков. Вы можете обнаружить, что у вас есть 4 маленьких коробки, и вы можете объединить их в 2 средних коробки. после того, как вы сможете комбинировать и сокращать поля, вы сможете отслеживать результаты после каждого запуска. Таким образом, общий поток программы будет выглядеть примерно так в грубом псевдокоде.

Container[getInitBoxCount()] shipments //create an array of containers with the size of the inital box count 

for(Container c : shipments)
{
    c = new LargeContainer();
}


Container[] check; //create new objects into the check array. dont set one array = to anoter

do
{
    check = shipments //create new objects into the check array. dont set one array = to anoter
    for(Container c: shipments)
        getSmallestBox(5, c);
    combineBoxes(shipments);
}
while(check == shipments)
0
ответ дан caleb baker 21 January 2019 в 05:40
поделиться

Посмотрите, может ли репринг Spring быть полезным. Чтобы в методе было повторение и другая логика, когда вы сомневаетесь, вы не получите свой первый список и т. Д.

0
ответ дан LNP 21 January 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: