95d304934601e17aa2c800a89cbebc92.jpg

问题一:度启发式
度启发式是选择与最多其他变量相邻的变量进行赋值。在图中,SA与最多的其他省份相邻(WA、NT、Q、NSW、V),因此应该先给SA赋值。

# 定义图的邻接表
graph = {
    'WA': ['NT', 'SA'],
    'NT': ['WA', 'Q', 'SA'],
    'SA': ['WA', 'NT', 'Q', 'NSW', 'V'],
    'Q': ['NT', 'SA', 'NSW'],
    'NSW': ['Q', 'SA', 'V'],
    'V': ['SA', 'NSW'],
    'T': []
}

# 定义可用的颜色
colors = ['red', 'green', 'blue']

# 打印图的结构
for region, neighbors in graph.items():
    print(f"{region}: {neighbors}")

def degree_heuristic(graph):
    # 计算每个变量的度
    degree = {region: len(neighbors) for region, neighbors in graph.items()}
    # 找到度最大的变量
    max_degree_variable = max(degree, key=degree.get)
    return max_degree_variable, degree[max_degree_variable]

# 使用度启发式选择变量
selected_variable, max_degree = degree_heuristic(graph)
print(f"\n选择的变量是: {selected_variable}")
print(f"它的度为:{max_degree}")
WA: ['NT', 'SA']
NT: ['WA', 'Q', 'SA']
SA: ['WA', 'NT', 'Q', 'NSW', 'V']
Q: ['NT', 'SA', 'NSW']
NSW: ['Q', 'SA', 'V']
V: ['SA', 'NSW']
T: []

选择的变量是: SA
它的度为:5

问题二:MRV启发式
MRV启发式选择剩余可用颜色最少的变量。此时,SA和Q都与NT相邻,NT已经是绿色,因此SA和Q都不能是绿色。由于WA是红色,SA不能是红色。Q没有与WA相邻,所以Q可以是红色或蓝色。SA剩余的颜色只有蓝色。因此,应该选择SA进行赋值。
解决方案一:

# 定义图的邻接表
graph = {
    'WA': ['NT', 'SA'],
    'NT': ['WA', 'Q', 'SA'],
    'SA': ['WA', 'NT', 'Q', 'NSW', 'V'],
    'Q': ['NT', 'SA', 'NSW'],
    'NSW': ['Q', 'SA', 'V'],
    'V': ['SA', 'NSW'],
    'T': []
}

# 定义可用的颜色
colors = ['red', 'green', 'blue']

# 已有的部分赋值
partial_assignment = {
    'WA': 'red',
    'NT': 'green'
}

def mrv_heuristic(graph, colors, partial_assignment):
    # 记录每个未赋值变量的剩余可用颜色数
    remaining_values = {}
    for region in graph:
        if region not in partial_assignment:
            # 找出相邻已赋值的颜色
            used_colors = set()
            for neighbor in graph[region]:
                if neighbor in partial_assignment:
                    used_colors.add(partial_assignment[neighbor])
            
            # 计算剩余可用颜色
            remaining_colors = [color for color in colors if color not in used_colors]
            remaining_values[region] = len(remaining_colors)
    
    # 打印每个节点的剩余可用颜色数
    for region, count in remaining_values.items():
        print(f"{region} 的剩余可用颜色数: {count}")
    
    # 找到剩余可用颜色最少的变量
    mrv_variable = min(remaining_values, key=remaining_values.get)
    return mrv_variable

# 使用MRV启发式选择变量
selected_variable = mrv_heuristic(graph, colors, partial_assignment)
print(f"选择的变量是: {selected_variable}")
SA 的剩余可用颜色数: 1
Q 的剩余可用颜色数: 2
NSW 的剩余可用颜色数: 3
V 的剩余可用颜色数: 3
T 的剩余可用颜色数: 3
选择的变量是: SA

可以进一步简化代码,得到解决方案二。

解决方案二:

# 定义图的邻接表
graph = {
    'WA': ['NT', 'SA'],
    'NT': ['WA', 'Q', 'SA'],
    'SA': ['WA', 'NT', 'Q', 'NSW', 'V'],
    'Q': ['NT', 'SA', 'NSW'],
    'NSW': ['Q', 'SA', 'V'],
    'V': ['SA', 'NSW'],
    'T': []
}

# 定义可用的颜色
colors = ['red', 'green', 'blue']

# 已有的部分赋值
partial_assignment = {
    'WA': 'red',
    'NT': 'green'
}

def mrv_heuristic(graph, colors, partial_assignment):
    # 记录每个未赋值变量的剩余可用颜色数
    remaining_values = {}
    for region in graph:
        if region not in partial_assignment:
            # 找出相邻已赋值的颜色
            used_colors = {partial_assignment[neighbor] for neighbor in graph[region] if neighbor in partial_assignment}
            # 计算剩余可用颜色
            remaining_colors = [color for color in colors if color not in used_colors]
            remaining_values[region] = len(remaining_colors)
    
    # 打印每个节点的剩余可用颜色数
    for region, count in remaining_values.items():
        print(f"{region} 的剩余可用颜色数: {count}")
    
    # 找到剩余可用颜色最少的变量
    mrv_variable = min(remaining_values, key=remaining_values.get)
    #print(mrv_variable)
    return mrv_variable

# 使用MRV启发式选择变量
selected_variable = mrv_heuristic(graph, colors, partial_assignment)
print(f"选择的变量是: {selected_variable}")
SA 的剩余可用颜色数: 1
Q 的剩余可用颜色数: 2
NSW 的剩余可用颜色数: 3
V 的剩余可用颜色数: 3
T 的剩余可用颜色数: 3
选择的变量是: SA

问题三:冲突集
SA与Q、NSW、V相邻。Q是红色,NSW是绿色,V是蓝色。因此,SA没有可用的颜色。SA的冲突集是与其相邻且已赋值的变量集合,即 {Q, NSW, V}。

# 定义图的邻接表
graph = {
    'WA': ['NT', 'SA'],
    'NT': ['WA', 'Q', 'SA'],
    'SA': ['WA', 'NT', 'Q', 'NSW', 'V'],
    'Q': ['NT', 'SA', 'NSW'],
    'NSW': ['Q', 'SA', 'V'],
    'V': ['SA', 'NSW'],
    'T': []
}

# 已有的部分赋值
partial_assignment = {
    'Q': 'red',
    'NSW': 'green',
    'V': 'blue',
    'T': 'red'
}

def find_conflict_set(graph, partial_assignment, target):
    # 找出与目标节点相邻且已赋值的节点
    conflict_set = {neighbor for neighbor in graph[target] if neighbor in partial_assignment}
    return conflict_set

# 找出SA的冲突集
conflict_set = find_conflict_set(graph, partial_assignment, 'SA')
print(f"SA的冲突集是: {conflict_set}")
SA的冲突集是: {'V', 'Q', 'NSW'}
最后修改:2024 年 10 月 10 日
如果觉得我的文章对你有用,请随意赞赏