我是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行 终端功能 ^ ~~~~~~~~~~ ^ 错误:语法错误,意外的终止功能,预期终止
有帮助吗?
答案 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:n
到1
且步速为n
的向量。您可能还写了1
。