Wolfram mathematica Mathematica:Thread::tdlen:{Null}{}中长度不等的对象无法组合&燃气轮机&燃气轮机;

Wolfram mathematica Mathematica:Thread::tdlen:{Null}{}中长度不等的对象无法组合&燃气轮机&燃气轮机;,wolfram-mathematica,Wolfram Mathematica,我有一个问题: 线程::tdlen:{Null}{}中长度不等的对象无法组合。>> 它似乎发生在while测试中,这毫无意义,因为我只是在比较数字 该程序是一个解决0-1背包动态规划问题的程序,虽然我使用循环,而不是递归 我已经打印了一些文件,我只能认为问题在while循环中,没有意义 (* 0-1 Knapsack problem item = {value, weight} Constraint is maxweight. Objective is to max value.

我有一个问题:

线程::tdlen:{Null}{}中长度不等的对象无法组合。>>

它似乎发生在while测试中,这毫无意义,因为我只是在比较数字

该程序是一个解决0-1背包动态规划问题的程序,虽然我使用循环,而不是递归

我已经打印了一些文件,我只能认为问题在while循环中,没有意义

(*  0-1 Knapsack problem
 item = {value, weight} 
  Constraint is maxweight. Objective is to max value. 
 Input on the form:
 Matrix[{value,weight},
       {value,weight},
        ...
      ]
*)

lookup[x_, y_, m_] := m[[x, y]];

generateTable[items_, maxweight_] := {
  nbrofitems = Dimensions[items][[1]];
  keep = values = Table[0, {j, 0, nbrofitems}, {i, 1, maxweight}];
  For[j = 2, j <= nbrofitems + 1, j++,
   itemweight = items[[j - 1, 2]];
   itemvalue = items[[j - 1, 1]];
   For[i = 1, i <= maxweight, i++,
    {
     x = lookup[j - 1, i, values];
     diff = i - itemweight;
     If[diff > 0, y = lookup[j - 1, diff, values], y = 0];
     If[itemweight <= i ,
      {If[x < itemvalue + y,
        {values[[j, i]] = itemvalue + y; keep[[j, i]] = 1;},
        {values[[j, i]] = x; keep[[j, i]] = 0;}]
       },
      y(*y eller x?*)]
     }
    ]
   ];
  {values, keep}
  }

pickItems[keep_, items_, maxweight_] :=
 {
  (*w=remaining weight in knapsack*)
  (*i=current item*)
  w = maxweight;
  knapsack = {};
  nbrofitems = Dimensions[items][[1]];
  i = nbrofitems + 1;
  x = 0;
  While[i > 0 && x < 10,
   {
      Print["lopp round starting"];
      x++;
      Print["i"];
      Print[i];
      Print["w"];
      Print[w];
      Print["keep[i,w]"];
      Print[keep[[i, w]]];
      If[keep[[i, w]] == 1,
       {Append[knapsack, i];
        Print["tjolahej"];
        w -= items[[i - 1, 2]];
        i -= 1;
        Print["tjolahopp"];
        },
       i -= 1;
       ];
      Print[i];
      Print["loop round done"];
      }
     knapsack;
   ]
  }

Clear[keep, v, a, b, c]
maxweight = 5;
nbrofitems = 3;
a = {5, 3};
b = {3, 2};
c = {4, 1};
items = {a, b, c};


MatrixForm[items]
results = generateTable[items, 5];
keep = results[[1]][[2]];
Print["keep:"];
MatrixForm[keep]
Print["------"];
results2 = pickItems[keep, items, 5];
MatrixForm[results2]
(*0-1背包问题
项目={值,重量}
约束是最大权重。目标是最大值。
在表格上输入:
矩阵[{值,权重},
{值,权重},
...
]
*)
查找[x,y,m]:=m[[x,y]];
generateTable[项目,最大重量]:={
nbrofitems=尺寸[项目][[1]];
keep=values=Table[0,{j,0,nbrofitems},{i,1,maxweight}];
对于[j=2,j请尝试以下版本:

pickItems[keep_, items_, maxweight_] := Module[{},
  {(*w=remaining weight in knapsack*)(*i=current item*)w = maxweight;
   knapsack = {};
   nbrofitems = Dimensions[items][[1]];
   i = nbrofitems + 1;
   x = 0;
   While[i > 0 && x < 10,
    {
     Print["lopp round starting"];
     x++;
     Print["i"];
     Print[i];
     Print["w"];
     Print[w];
     Print["keep[i,w]"];
     Print[keep[[i, w]]];

     If[keep[[i, w]] == 1,
      {
       Append[knapsack, i];
       Print["tjolahej"];
       w -= items[[i - 1, 2]];
       i -= 1;
       Print["tjolahopp"];
       },
      i -= 1;
      ];

     Print[i];
     Print["loop round done"]
     };
     knapsack
    ]
   }
  ]
pickItems[keep_uu,items_u,maxweight_u]:=Module[{},
{(*w=背包剩余重量*)(*i=当前物品*)w=最大重量;
背包={};
nbrofitems=尺寸[项目][[1]];
i=nbrofitems+1;
x=0;
当[i>0&&x<10时,
{
打印[“lopp循环开始”];
x++;
打印[“i”];
打印[i];
打印[“w”];
打印[w];
打印[“保留[i,w]”;
打印[保留[[i,w]];
如果[保持[[i,w]]==1,
{
附加[背包,我];
打印[“tjolahej”];
w-=项目[[i-1,2]];
i-=1;
打印[“tjolahopp”];
},
i-=1;
];
打印[i];
打印[“循环结束”]
};
背包
]
}
]

现在没有错误,但我不知道它真正的作用是什么:)

这并不是对所问特定问题的回答,而是对发生此错误时的一般情况的一些提示。简短的回答是,这是将长度不等的列表传递给一些用户定义或内置的
可列出的
函数的标志

Mathematica的许多内置函数是(具有
Listable
属性)。这基本上意味着,给定列表代替部分或所有参数,Mathematica会自动在这些参数上执行函数线程。真正发生的是,
Thread
被内部调用(或者至少看起来是这样)。这可由

In[15]:= 
ClearAll[f];
SetAttributes[f,Listable];
f[{1,2},{3,4,5}]

During evaluation of In[15]:= Thread::tdlen: Objects of unequal length in 
f[{1,2},{3,4,5}] cannot be combined. >>
Out[17]= f[{1,2},{3,4,5}]
通过显式使用
线程
可以获得相同的行为:

In[19]:= 
ClearAll[ff];
Thread[ff[{1,2},{3,4,5}]]

During evaluation of In[19]:= Thread::tdlen: Objects of unequal length in 
ff[{1,2},{3,4,5}] cannot be combined. >>
Out[20]= ff[{1,2},{3,4,5}]

对于
Listable
函数,这是一个更隐蔽的例子。一些典型的例子包括
{1,2}+{3,4,5}
{1,2}^{3,4,5}
等等。我更详细地讨论了这个问题。

我在iPad上,所以这里没有Mma,但是对你的代码有一些评论。首先,
值定义不需要
I
j
。For
循环的外部
可以是一个
折叠列表
。此外,你还在函数中创建全局变量。哟你应该把它们放在一个
模块中
。这将有助于了解你正在使用的输入数据。如果我可以给出一个一般性的建议,我会尝试更好地定位代码中有问题的部分,并构建一个最小的自包含示例来说明问题。这对你来说是更多的工作,但你会学到更多,也会增加chanc这是一个更好的答案,因为更多的人愿意花时间看你的代码。这个问题:包含一些关于mma代码调试的讨论。