2017-04-21 591 views
-1

我试图解决的问题是分区问题,我必须将n个权重分为k个组,每个组的权重应尽可能均匀。VBA - 错误2042

我想将一些启发式的形式应用到我的初始解决方案中,尝试改进随机启动但不断遇到错误。

我的初始解法算法的基础是;选择下一个最大的未分类元素,并将其放置在权重最小的组中。注意:我已经将我的元素预先排列为大小顺序。

我已经开始使用下面的代码;

Sub initialsolution(s() As Integer, n As Integer, k As Integer, w() As Long) 
    Dim i As Long, j As Long, l As long 
    ReDim mass(1 To k) As Long 

    For i = 1 To n 
     j = WorksheetFunction.Min(mass) 
     l = Application.Match(j, mass) 
     mass(l) = mass(l) + w(i) 
    Next i 

End Sub 

其中s()是当前从1空数组到n,我稍后填充,n是权重的数量,k是基的数目,并且w()是排序后的数组权重,在我的审判案例中,n = 8,k = 3,w =(5,4,3,3,2,2,1,1)。

我的问题出现时,我= 6,我正在考虑的重量2.质量有(6,6,5)的值,因此最小质量,j,是5。然而,在下一行,设置形成错误的值。当我将l更改为变体时,它将其值设置为错误2042,当它应该为3.这会导致错误代码“运行时错误'13':类型不匹配”由于错误2042无法用作索引。

谢谢你提前

+0

你已经写了很多关于背景的内容,然后似乎没有发布导致错误的代码行...... VBA错误往往是相对通用的,所以有一个[可验证的例子] (https://stackoverflow.com/help/mcve)。尝试编辑您的问题,使其更容易回答特定的错误。 – Wolfie

+0

你是如何传递你的论点的? – SJR

+0

这是我的较大部分代码中的代码行,它运行子 “initialsolution s,n,k,w”其中所有参数已经预先定义 –

回答

0

我找到了答案。如果我使用

l = Application.Match(j, mass, 0) 

而不是

l = Application.Match(j, mass) 

它的工作原理。我不确定以前的错误是什么,但是这个新方法只考虑它第一次遇到匹配值并返回这个索引。