解决类似于bin包的搜索问题的方法

问题描述

我试图解决一个问题:我有15个不同长度的管道,我需要将其中的一部分分成四行。我必须找到一种组合,使所有行都满了。假设它们是填满所有行的组合,我怎么找到最短的方法呢? 我尝试使用DFS搜索算法,为了使效率更高,我从最长到最短对管道的向量进行了排序。 (解决方案的搜索就像一个图形:管道的每个入口都是DFS图中的新顶点,下一步将是在下一行中输入下一个管道,依此类推)。它太重了,花了很多时间才能运行(三行代码在几分钟内就成功了)。这是c ++中的代码: (在代码中,我称管道针为相同的想法)

'''

void LinesVector :: DFSvisit(vector&allneedles,int lineIndex,int depth) {

if (allNeedles.empty()|| isFull())//is full return true if all the lines are full
    return;

//Check if their is one empty line
bool flag = false;
for (size_t i = 0; i < v.size(); i++)
{
    if (!v[i].getNeedlesNum())
        flag = true;
}

for (int k = 0; k < allNeedles.size();k++)
{
    for (int j = 0; j < v.size(); j++)
    {
        
        //In case of empty line the needle  will be insert 
        //in ascending order of indexes in order to avoid returns

            //Check we can fill the rest lines
        if (flag)
        {
            if (allNeedles.size() == v.size() - 1 - lineIndex)
                return;
            if (lineIndex == v.size())
                return;
        }
        

        if (!allNeedles.empty())
        {
            v[(lineIndex + j) % LInesNUMBER].pushNeedle(allNeedles[k]);
            if (v[(lineIndex + j) % LInesNUMBER].isOverload())
                v[(lineIndex + j) % LInesNUMBER].popNeedle();
            else
            {
                allNeedles.erase(allNeedles.begin() + k);
                DFSvisit(allNeedles,(lineIndex + j + 1) % LInesNUMBER,depth + 1);

                if (isFull())
                    return;
                allNeedles.insert(allNeedles.begin() + k,v[(lineIndex + j) % LInesNUMBER].popNeedle());
            }
        }
    }
}

'''

如果他们是通过某种方式解决此问题的一种方式(以这种方式或完全不同的方式),我将很高兴获得答复。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)