1

我很难理解这个 python 脚本。任何 python 大师都愿意翻译几行吗?我主要说最后两个。这两行似乎包含了很多内容。我的主要动机是将这个算法转换成 Java。

u=matrix( [[1,2,2], [-2,-1,-2], [2,2,3]] )
a=matrix( [[1,2,2], [2,1,2], [2,2,3]] )
d=matrix( [[-1,-2,-2], [2,1,2], [2,2,3]] )
m=[ array([3,4,5]) ]
while m:
  for i in m:
    yield i
  g=( (i*j).getA1() for i in m for j in (u,a,d) )
  m=[ i for i in g if max is None or sum(i)<=max ]
4

2 回答 2

2

这应该更容易转换为 Java:

while len(m) != 0:
      for arr in m:
          queue.put(arr) # yield arr
      newm = []
      for arr in m:
          for mat in (u,a,d):
              i = multiply_array_matrix(arr, mat).getA1()
              if max_ is None or sum(i) <= max_:
                 newm.append(i)
      m = newm
于 2012-08-31T22:48:58.593 回答
2

感谢 JF Sebastian 和对 Python 的更多调查(但主要是对 JF),我能够将其转换为 Java。我更改名称不仅是为了保护无辜者,而且是为了让它更加自我记录。

用队列替换收益功能是让我走上正轨的火花。由于 Java 不能做“mat in (u, a, d)”的事情,我不得不把它分成三个非常相似的行。我已经为这篇文章删减了一些东西,但是在我完成的代码中,我在这三行中调用了一个方法,其中包括“<= max”检查。

它的运行速度比我预期的要快得多!

ArrayList<int[]> resultList = new ArrayList<int[]>();
ArrayList<int[]> workingList = new ArrayList<int[]>();
workingList.add(new int[]{3, 4, 5}); // add the base triple

while(workingList.size() > 0)
{
    for (int[] triple: workingList)
        addTriple(resultList, triple);

    ArrayList<int[]> additions = new ArrayList<int[]>();
    for (int[] triple: workingList)
    {
        additions.add(multiply(triple, u));
        additions.add(multiply(triple, a));
        additions.add(multiply(triple, d));
    }
    workingList = additions;
}
于 2012-09-05T20:26:11.840 回答