在两个数据集中找到最佳匹配
本文关键字:集中 最佳 数据集 数据 两个 | 更新日期: 2023-09-27 18:36:34
我在一个文件中有两组数据:
a a0 x:7 y:7 z:10
a a1 x:2 y:1 z:1
a a2 x:7 y:6 z:4
b b0 x:3 y:9 z:2 a2,a0,a1
b b1 x:4 y:3 z:7 a0,a2,a1
b b2 x:4 y:0 z:10 a0,a2,a1
b b3 x:10 y:3 z:8 a2,a0,a1
b b4 x:6 y:10 z:1 a0,a2,a1
b b5 x:6 y:7 z:7 a0,a2,a1
b b6 x:8 y:6 z:9 a2,a1,a0
b b7 x:7 y:1 z:5 a2,a1,a0
b b8 x:8 y:2 z:3 a1,a0,a2
b b9 x:10 y:2 z:1 a1,a2,a0
b b10 x:6 y:4 z:5 a0,a2,a1
b b11 x:8 y:4 z:7 a0,a1,a2
我必须为集合 A 中的每行找到集合 B 中可能的最佳匹配行,而无需重复任何行 - 匹配必须基于 x,y,z 值完成。我必须考虑集合 B 具有"首选"行,这些行在值之前具有优先级。
这就是我开始接近这个的方式:
public struct SetValues
{
public string x;
public string y;
public string z;
}
public static Dictionary<string, SetValues>[] ReadFile(string fileName)
{
Dictionary<string, SetValues>[] dictionary = new Dictionary<string, SetValues>[]{
new Dictionary<string, SetValues>(),
new Dictionary<string, SetValues>()
};
string[] fileLines = System.IO.File.ReadAllLines(fileName);
string[] delimitersDict1 = new string[] { "a ", " ", " ", " " };
string[] delimitersDict2 = new string[] { "b ", " ", " ", " " };
foreach (string line in fileLines)
{
if (line != string.Empty)
{
char[] str = line.ToCharArray();
if (str[0].ToString() == "a")
{
string[] tmp = line.Split(delimitersDict1, StringSplitOptions.None);
dictionary[0].Add(tmp[1], new SetValues { x = tmp[2], y = tmp[3], z = tmp[4] });
}
else if (str[0].ToString() == "b")
{
string[] tmp = line.Split(delimitersDict2, StringSplitOptions.None);
dictionary[1].Add(tmp[1], new SetValues { x = tmp[2], y = tmp[3], z = tmp[4] });
}
}
}
return dictionary;
}
这就是我到目前为止所拥有的全部 - 2 个词典,行名作为键和值 (x,y,z)。
我的问题是:我应该在这里识别一些常见的算法吗?解决这个问题的最简单途径是什么?我从 C# 开始,所以我希望得到一些易于理解的提示或参考:)
我忘了补充一点,我有预期的输出,它应该看起来像这样:
a2
b6 a2:128 a1:31 a0:188
b3 a2:120 a0:171 a1:31
b10 a0:120 a2:86 a1:21
b0 a2:83 a0:104 a1:17
a1
b9 a1:23 a2:86 a0:94
b8 a1:21 a0:100 a2:80
b7 a2:75 a1:20 a0:106
b1 a0:119 a2:74 a1:18
a0
b5 a0:161 a2:112 a1:26
b11 a0:154 a1:27 a2:108
b2 a0:128 a2:68 a1:18
b4 a0:122 a2:106 a1:23
我认为a2:128
的价值来自哪里(a2 x * b6 x) + (a2 y * b6 y) + (a2 z * b6 z)
您描述的问题似乎是一个匹配问题,您试图在其中找到 A 数据集和 B 数据集之间的最低成本匹配。
您可以将此问题表述为最小成本匹配,如下所示。对于 A 列表中的每个条目,计算将其与 B 数据集中的某个元素匹配的"成本"。这形成了一个二分图,其中所有 A 元素都在第一类中,所有 B 元素都在第二类中。从那里,您可以使用任何您想要的最小成本匹配算法来找到 A 到 B 的最佳分配。
希望这有帮助!