下料算法的 Scilab

Scilab for Cutting Stock Algorithm

我是 Scilab 的新手(和一般编程)。我正在尝试实现一个 Scilab 代码来解决下料问题又名 'bin packing'。

问题:给定 'n' 个大小为 [] 的项目(从 s1 到 sn 的向量),以及所有容器的相同容量 (c=1000),我需要最小化所需的容器数量适合所有物品。

我正在尝试 'next item algorithm',即从向量中选择第一个项目,将其放入容器中,然后选择下一个项目并尝试放入同一个容器中,以防万一不够 space,然后再创建一个 bin。

实际上我不需要帮助改进算法,而是需要帮助实现这个特定算法的代码。

这是我到目前为止尝试过的方法:

// 'n' is the number of items to be packed
// 'c' is the capacity (how much items fit in the bin)
// 'sizes' a vector containing the size of n items
// 'nbins' number of bins used so far
// 'bin_rem' space left in current bin    

    sizes=[400,401,402,403,404,405,406,408,409,411,428,450,482]
    c=1000
    n=length(sizes)
    nbins = 0 
    bin_rem = c

    function y = bins(sizes,c,n)
    for i=0; i<n; i=i+1 
        if sizes[i] > bin_rem 
        nbins=nbins+1  
        bin_rem = c - sizes(i)
      bin_rem = bin_rem - sizes(i)
    end
    endfunction

    disp ("Number of bins needed "+string(bins([sizes,c,n])))
    end

我被下面的这个错误困住了,不知道如何解决它。

在执行文件的第 20 行 结束功能 ^~~~~~~~~~~^ 错误:语法错误,意外的结束函数,期待结束

有什么帮助吗?

首先,您似乎仍然不太了解 Scilab 的语法,因为我看到您使用 sizes[i] 而不是 sizes(i),并调用 bins([sizes,c,n])。所以,现在,尽量不要使用函数。至于你得到的错误,它发生是因为你忘记了一个 end。您编写代码的方式,只有 if 语句关闭,并且 for 循环仍然打开。

其次,当你更正它时,你会发现你的程序不能正常运行,那是因为你定义了错误的循环。在 Scilab 中,for 循环实际上是一个 "for each" 循环,因此,您需要为每次迭代提供完整范围的值,而不是起始值 (i=0)、条件 (i<n) 和递增函数 (i=i+1).

第三,您似乎了解您尝试使用的算法,但您实施错误:循环中的最后一行应该是 else 语句。

解决所有这些,你有以下代码:

sizes=[400,401,402,403,404,405,406,408,409,411,428,450,482]
c=1000
n=length(sizes)
nbins = 0  //should start as 0
bin_rem = 0 //should start as 0

for i = 1:n
    if sizes(i) > bin_rem
        nbins = nbins + 1;
        bin_rem = c - sizes(i);
    else
        bin_rem = bin_rem - sizes(i);
    end
end

disp ("Number of bins needed "+string(nbins))

澄清一下,1:n 表示从 1n 的矢量,速度为 1。你也可以写 for i = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].