C# 克努特';求解5次猜测策划的s算法
我读了knuth的算法,我想知道第三步。如果我对每个选项的理解正确(即使在步骤2中没有删除),我们将计算每个ffedback删除多少可能的猜测。对于这一步,我们采取最低限度的措施。之后,我们在极小值上找到最大值,并取最大值所属的代码。这将是我们的第二个猜测。我不确定下一步可以做什么,因为每次我们都不改变最小值上的最大值(或者最小值是多少)。此外,例如,我如何在c#中实现这一步骤。我该如何进行以及如何实施该步骤?反馈的最小值到底意味着什么 您需要一个所有可能结果的恒定集合,一个剩余备选方案的集合,以及一个可以在给定猜测和解决方案的情况下计算结果的方法 首先,对相关域对象进行建模:C# 克努特';求解5次猜测策划的s算法,c#,algorithm,C#,Algorithm,我读了knuth的算法,我想知道第三步。如果我对每个选项的理解正确(即使在步骤2中没有删除),我们将计算每个ffedback删除多少可能的猜测。对于这一步,我们采取最低限度的措施。之后,我们在极小值上找到最大值,并取最大值所属的代码。这将是我们的第二个猜测。我不确定下一步可以做什么,因为每次我们都不改变最小值上的最大值(或者最小值是多少)。此外,例如,我如何在c#中实现这一步骤。我该如何进行以及如何实施该步骤?反馈的最小值到底意味着什么 您需要一个所有可能结果的恒定集合,一个剩余备选方案的集合,
public class Outcome
{
public int White { get; set; }
public int Black { get; set; }
}
public class Combination
{
// however you like to model this
}
然后,创建将猜测与秘密进行对比的方法:
public static Outcome Check(Combination guess, Combination solution)
{
// your implementation
}
现在算法如下:
Outcome[] outcomes = new[] { new Outcome { White = 0, Black = 0 },
new Outcome { White = 1, Black = 0 },
// ... all other possibilities
};
// assume we have some list of combinations
int min = Integer.MaxValue;
Combination minCombination = null;
foreach (var guess in combinations)
{
int max = 0;
foreach (var outcome in outcomes)
{
var count = 0;
foreach (var solution in combinations)
{
if (Check(guess, solution) == outcome)
count++;
}
if (count > max)
max = count;
}
if (max < min)
{
min = max;
minCombination = guess;
}
}
在其中,我使用了.中的
MaxBy
,谢谢,但是检查(组合,c)
中的c是什么?@CoarguAliquis它是计数中lambda表达式的变量,表示解决方案。在这一行中,我计算了所有可能导致结果的解决方案。你也可以把它写成foreach循环。你在哪里定义它的?你所说的“lambada表达式”是什么意思?顺便说一句,我只能在这里找到下一个猜测,而不是后面的猜测,可以吗?@CoarguAliquis我刚刚更新了答案,使用了foreach循环。另一个版本使用Linq,你应该找一段时间看看,它真的很有趣,但是这个版本可能更容易理解。您可以反复使用这个片段来找到下一个猜测。您所需要做的就是使组合保持最新(根据您目前收到的结果,这些组合可能仍然是解决方案)。谢谢。在找到minCombination后,我从alreday reduced combinations数组中播放它并减少组合?如果是这样的话:为什么我们需要找到minimax-evry步骤,假设它们之间没有变化?
combinations.MaxBy(guess =>
outcomes.Min(outcome =>
combinations.Count(solution =>
Check(guess, solution) == outcome)));