下料算法的 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
表示从 1
到 n
的矢量,速度为 1
。你也可以写 for i = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
.
我是 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
表示从 1
到 n
的矢量,速度为 1
。你也可以写 for i = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
.