Wolfram mathematica Mathematica:Thread::tdlen:{Null}{}中长度不等的对象无法组合&燃气轮机&燃气轮机;
我有一个问题: 线程::tdlen:{Null}{}中长度不等的对象无法组合。>> 它似乎发生在while测试中,这毫无意义,因为我只是在比较数字 该程序是一个解决0-1背包动态规划问题的程序,虽然我使用循环,而不是递归 我已经打印了一些文件,我只能认为问题在while循环中,没有意义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.
(* 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代码调试的讨论。