Optimization Scilab下料算法

Optimization Scilab下料算法,optimization,scilab,Optimization,Scilab,我对Scilab(以及一般的编程)是新手。我正在尝试实现一个Scilab代码来解决库存削减问题,也称为“装箱” 问题是:给定大小为[](从s1到sn的向量)的“n”个项目,并且所有箱子的容量相同(c=1000),我需要最小化容纳所有项目所需的箱子数量 我正在尝试“下一个项目算法”,即从向量中选取第一个项目,将其放入箱子,然后选取下一个项目并尝试放入同一个箱子,以防没有足够的空间,然后创建另一个箱子 实际上,我不需要帮助改进算法,而是需要帮助实现这个特定算法的代码 以下是我到目前为止所做的尝试:

我对Scilab(以及一般的编程)是新手。我正在尝试实现一个Scilab代码来解决库存削减问题,也称为“装箱”

问题是:给定大小为[](从s1到sn的向量)的“n”个项目,并且所有箱子的容量相同(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
/“n”是要打包的项目数
//“c”是容量(箱子中可容纳的物品数量)
//“大小”包含n个项目大小的向量
//“nbins”到目前为止使用的垃圾箱数量
//当前存储箱中剩余的“bin_rem”空间
尺寸=[40040140240204405406408409411428450482]
c=1000
n=长度(尺寸)
nbins=0
bin_rem=c
功能y=料仓(尺寸c、n)
对于i=0;我是宾瑞
nbins=nbins+1
bin_rem=c-尺寸(i)
bin_rem=bin_rem-尺寸(i)
结束
端功能
disp(“需要的箱子数量”+字符串(箱子([尺寸,c,n]))
结束
我被下面这个错误所困扰,不知道如何解决它

在已执行文件的第20行 端功能 ^~~~~~~~~~~^ 错误:语法错误,意外的endfunction,应为end


有什么帮助吗?

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


其次,当您纠正这个错误时,您会注意到您的程序不能正常工作,这是因为您错误地定义了循环。在Scilab中,
for
循环实际上是一个“for each”循环,因此,您需要为每个迭代提供完整的值范围,而不是起始值(
i=0
),条件(
i),首先,您似乎还不太理解Scilab的语法,因为我看到您使用的是
size[i]
,而不是
size(i)
,并调用
bin([size,c,n])
。因此,现在,请尽量不要使用函数。至于出现的错误,是因为您忘记了一个
end
。按照编写代码的方式,只有
if
语句是关闭的,而for循环仍然是打开的

其次,当您纠正这一点时,您会注意到您的程序工作不正常,这是因为您定义了错误的循环。在Scilab中,
for
循环实际上是一个“for each”循环,因此,您需要为每个迭代提供完整的值,而不是起始值(
i=0
)、条件(
i)
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))