约束优化 - 在Unity3d

时间:2016-03-04 15:47:33

标签: c# unity3d mathematical-optimization

我是优化问题的新手,经历过像Alglib,DotNumerics和Microsoft Solver Foundation这样的几个数学库,我对如何启动没有好运,也许一些专家可以解决一些问题。

我希望从参考轮廓上的3d点到目标轮廓获得最佳平移。

ref-target-point

以下是约束优化问题。如果我想使用DotNumerics,我如何优化它,我不知道如何启动:

problem

  • Pr:参考轮廓上的3d点
  • Pt:目标轮廓上的3d点
  • t(Pr):点Pr 的翻译向量< - 这就是我要找的

下面是DotNumerics提供的示例,我应该如何将所有的3d点作为输入并生成翻译矢量?

public void OptimizationLBFGSBConstrained()
{
    //This example minimize the function
    //f(x0,x2,...,xn)= (x0-0)^2+(x1-1)^2+...(xn-n)^2
    //The minimum is at (0,1,2,3...,n) for the unconstrained case.

    //using DotNumerics.Optimization;

    L_BFGS_B LBFGSB = new L_BFGS_B();
    int numVariables = 5;
    OptBoundVariable[] variables = new OptBoundVariable[numVariables];
    //Constrained Minimization on the interval (-10,10), initial Guess=-2; 
    for (int i = 0; i < numVariables; i++) variables[i] = new OptBoundVariable("x" + i.ToString(), -2, -10, 10);
    double[] minimum = LBFGSB.ComputeMin(ObjetiveFunction, Gradient,variables);

    ObjectDumper.Write("L-BFGS-B Method. Constrained Minimization on the interval (-10,10)");
    for (int i = 0; i < minimum.Length; i++) ObjectDumper.Write("x" + i.ToString() + " = " + minimum[i].ToString());

    //Constrained Minimization on the interval (-10,3), initial Guess=-2; 
    for (int i = 0; i < numVariables; i++) variables[i].UpperBound = 3;
    minimum = LBFGSB.ComputeMin(ObjetiveFunction, Gradient, variables);

    ObjectDumper.Write("L-BFGS-B Method. Constrained Minimization on the interval (-10,3)");
    for (int i = 0; i < minimum.Length; i++) ObjectDumper.Write("x" + i.ToString() + " = " + minimum[i].ToString());

    //f(x0,x2,...,xn)= (x0-0)^2+(x1-1)^2+...(xn-n)^2
    //private double ObjetiveFunction(double[] x)
    //{
    //    int numVariables = 5;
    //    double f = 0;
    //    for (int i = 0; i < numVariables; i++) f += Math.Pow(x[i] - i, 2);
    //    return f;
    //}

    //private double[] Gradient(double[] x)
    //{
    //    int numVariables = 5;
    //    double[] grad = new double[x.Length];
    //    for (int i = 0; i < numVariables; i++) grad[i] = 2 * (x[i] - i);
    //    return grad;
    //}
}

编辑1: 为了使事情变得复杂,我已经添加了一直在Unity上工作的真正问题。我从参考模型中采样了5条等高线,并对目标模型(不同的网格和不同的顶点位置)进行了相同的测试 - 在参考模型上的第一个等高线上,我采样了8个归一化点(按距离平均分割),仍然是对目标模型做了同样的事情。因此,我有2对相应的点集(目标模型归一化点位置将始终改变,因为每个用户具有不同的体型) - 接下来,我重复上述步骤以覆盖其余的等值线。一旦我这样做,我将使用上面的公式来优化问题,以获得最佳的平移向量,以便我可以使用 1单个翻译向量将所有顶点从引用转换为目标模型(不确定)这是可能的) - 这是优化的工作原理吗?

enter image description here  请忽略黄色等值线中的红线

0 个答案:

没有答案