削减库存算法的Scilab

时间:2018-08-22 00:45:00

标签: optimization scilab

我是Scilab的新手(和一般编程人员)。我正在尝试实施Scilab代码,以解决切割库存问题(又称“装箱”)。

问题:给定'n'个size []项目(从s1到sn的向量),并且所有垃圾箱的容量相同(c = 1000),我需要最小化适合所有项目的垃圾箱数量。

我正在尝试“下一项算法”,即从向量中选择第一项,将其放入垃圾箱,然后选择下一项,然后尝试放入相同的箱中,以防万一空间,然后创建另一个垃圾箱。

实际上,我不需要改进算法,而需要为该特定代码实现代码。

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

// '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行         终端功能         ^ ~~~~~~~~~~ ^ 错误:语法错误,意外的终止功能,预期终止

有帮助吗?

1 个答案:

答案 0 :(得分:1)

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

第二,当您更正该错误时,您会注意到程序无法正常运行,这是因为您定义了错误的循环。在Scilab中,for循环实际上是一个“ for each”循环,因此,您需要为每次迭代提供完整范围的值,而不是起始值(i=0),条件({{ 1}})和递增函数(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:n1且步速为n的向量。您可能还写了1