我正在玩一个遗传算法来解决方程。所以我发现了这个名为 NCAL 的库,这似乎是一个不错的选择。
所以我尝试生成一些随机字符串,这些字符串将成为这样的 NCALC 表达式:
private Expression getRandomExpression(int i)
{
string expression = ""; ;
double nr = random.NextDouble() * random.Next(100);
int sign = 1;
if (random.Next(2) > 0)
{
sign = -1;
}
Console.WriteLine("sign: " + sign + " i: " + i);
switch (i)
{
case 1:
expression = (sign.ToString() + "*" + nr.ToString() + "x");
break;
case 2:
expression = (sign.ToString() + nr.ToString() + "/x");
break;
case 3:
expression = (sign.ToString() + "x/" + nr.ToString());
break;
case 4:
expression = (sign.ToString() + "Pow(x," + nr.ToString()+")");
break;
default:
expression = (sign.ToString() + "*" + nr.ToString());
break;
}
return new Expression(expression);
}
然后我想遍历这些元素并根据我的目标函数检查总和,如下所示:
public double calculateFitness(double[] goalFunction)
{
double fitness = 0.0;
for (int i = 1; i < goalFunction.Length; i++)
{
foreach (var element in genome)
{
try
{
element.Parameters["x"] = i;
var value = (double)element.Evaluate();
fitness += Math.Abs(goalFunction.ElementAt(i) - value);
}catch(Exception ex)
{
throw ex;
}
}
}
return fitness;
}
看起来很简单,但我一直收到这个异常说“第 1:1 行在 'x' 处缺少 EOF”。关于如何解决这个问题的任何建议?或者更简单的方法。:) 我希望能够找到一个代表目标函数的方程。
br