Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 克努特';求解5次猜测策划的s算法_C#_Algorithm - Fatal编程技术网

C# 克努特';求解5次猜测策划的s算法

C# 克努特';求解5次猜测策划的s算法,c#,algorithm,C#,Algorithm,我读了knuth的算法,我想知道第三步。如果我对每个选项的理解正确(即使在步骤2中没有删除),我们将计算每个ffedback删除多少可能的猜测。对于这一步,我们采取最低限度的措施。之后,我们在极小值上找到最大值,并取最大值所属的代码。这将是我们的第二个猜测。我不确定下一步可以做什么,因为每次我们都不改变最小值上的最大值(或者最小值是多少)。此外,例如,我如何在c#中实现这一步骤。我该如何进行以及如何实施该步骤?反馈的最小值到底意味着什么 您需要一个所有可能结果的恒定集合,一个剩余备选方案的集合,

我读了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)));