Javascript 从多个对象中查找最接近的x特性值之和

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个零件,并找到 要复制其特性的每个零件的常量,因此在复制所有零件后,所有零件的每个特性值之和将最接近原始零件特性。我还想记录成功的百分比。成功的

假设我有一个具有3个属性x,y,z的类零件:

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说:这是一个经典的线性优化问题。政府将能够解决这个问题。