Javascript 从多个对象中查找最接近的x特性值之和
假设我有一个具有3个属性x,y,z的类零件:Javascript 从多个对象中查找最接近的x特性值之和,javascript,algorithm,mathematical-optimization,linear-programming,Javascript,Algorithm,Mathematical Optimization,Linear Programming,假设我有一个具有3个属性x,y,z的类零件: class Part { constructor(x, y, z) { this.x = x this.y = y this.z = z } createNewFromParts(...parts){ } } 我希望createNewFromParts函数能够得到x个零件,并找到 要复制其特性的每个零件的常量,因此在复制所有零件后,所有零件的每个特性值之和将最接近原始零件特性。我还想记录成功的百分比。成功的
class Part {
constructor(x, y, z) {
this.x = x
this.y = y
this.z = z
}
createNewFromParts(...parts){
}
}
我希望createNewFromParts函数能够得到x个零件,并找到
要复制其特性的每个零件的常量,因此在复制所有零件后,所有零件的每个特性值之和将最接近原始零件特性。我还想记录成功的百分比。成功的百分比将根据之前的值,而不是个人,由所有3个属性一起计算
例如:
const whole = new Part(4,6,10);
const part1 = new Part(1,2,4);
const part2 = new Part(2,2,3);
在这个例子中,这很简单:将第1部分乘以1,第2部分乘以2,加法的结果将是(5,6,10),这可能是最好的匹配
假设会有这样的情况:
const whole = new Part(32,10,27);
const part1 = new Part(10,7,15);
const part2 = new Part(15,5,22);
我将如何找到常数来复制每个部分以获得最佳匹配
我想找到一个算法,它将为每个要复制的部分找到一个常数,以获得最接近原始部分的最佳匹配
感谢帮助:)这里有一种方法,它只是解决问题的众多方法之一
如果你把你的每一个部分看作一个有3个元素的向量,例如第1部分是:
然后,您可以编写一个线性系统,通过系数向量a
将部分p
与整个部分Y
关联起来:
然后,您可以找到系数A
的向量,该向量使残差平方和最小化:
残差平方和r
是整个Y
部分与“最佳”估计部分之间的平方差之和,其中hat表示“估计”
该平方残差最小化问题的解决方案是使用该方程获得的估计系数:
一旦对系数进行了估计,就可以这样计算:
const whole = new Part(32,10,27);
const part1 = new Part(10,7,15);
const part2 = new Part(15,5,22);
这是一个使用任意数量部件的实现。
函数findCoeffs(Y,部件){
常数P=数学转置(部分);
常数Pt=零件;
常数PtPinv=math.inv(math.multiply(Pt,P));
常数PtPinvPt=数学乘法(PtPinv,Pt);
返回数学乘法(PtPinvPt,Y);
}
功能测试(Y,…部件){
常数系数=findCoeffs(Y,部分);
常数round=n=>+n.toFixed(2);
const disp=ns=>JSON.stringify(ns.map(n=>Array.isArray(n)→n.map(round):round(n));
常数实际值=数学乘法(系数、部分);
常数误差=数学减法(Y,实际值);
const errorPercent=error.map((e,i)=>Math.abs(e/actual[i]);
const totalErrorPercent=errorPercent.reduce((和,e)=>和+e,0)*100/系数长度;
console.log('----------------------------');
console.log('expected(Y'),disp(Y));
控制台日志(“部分(P)”,显示(部分));
console.log('coeffs(A)'disp(coeffs));
控制台日志(“实际(PA)”和显示(实际));
log('coeff error',disp(errorPercent));
log('mean error(MAPE)”,四舍五入(totalErrorPercent)+'%');
}
测试([4,6,10],[1,2,4],[2,2,3]);
测试([32,10,27],[10,7,15],[15,5,22]);
测试([3.2,3,5],[1.1,1,1],[1.1,2,3],[1,-1,1])代码>
。作为控制台包装{最大高度:100%!重要;顶部:0;}
如果你搜索短语“带约束的线性规划”,你会找到比我们在这里的答案更好的解释它的资源。@Prune说:这是一个经典的线性优化问题。政府将能够解决这个问题。