前言
翻转游戏(Flip Game), 是20世纪90年代开始流行的一款电子游戏。该游戏由一个5*5的网格组成,每格里有一个圈。 游戏的初始状态是,25个圈中的颜色相同。点击任意一个圈将使得它和相邻格子的圈改变颜色。游戏的目标是用尽可能少的点击数让所有圈都变色。
举一个Flip Game的例子,来帮助理解游戏规则:
初始状态:
点击(3,3):
点击(3,1):
本文来介绍如何使用数学规划的方法来解决Flip Game。本文的主要内容如下:
- Flip Game的问题描述;
- Flip Game的数学规划模型;
- Python调用Gurobi求解Flip Game的模型。
问题描述
Flap Game的问题描述如下:
给定一个5*5的方格矩阵,其中格子中的圈两面颜色不同,比如要么绿色朝上,要么红色朝上,初始的圈颜色都相同。点击圈可以进行翻转,改变颜色,同时也会改变所有邻格的颜色。游戏的目的是:
- 使所有圈与初始颜色不同;
- 尽可能少的点击数。
数学模型
Flip Game可以被构建为整数规划,并使用求解器求解。本节就来介绍Flip Game的数学规划模型。
1.整理数据和参数
- 5 ∗ 5 网格
2.定义决策变量
- 决策:点击哪一个格子
- 变量: x i , j ( i , j = 1 , 2 , … , 5 ) x_{i, j}(i, j = 1,2,\ldots,5) xi,j(i,j=1,2,…,5)
- =1 如果 ( i , j ) (i,j) (i,j)被点,否则为0
- 类型:0-1
3.构建目标函数
- 最小化点击数
- min ∑ i , j = 1 , … , 5 x i , j \sum_{i,j=1,\ldots,5}x_{i,j} ∑i,j=1,…,5xi,j
4.设置约束条件
- 用逻辑约束来表达更简单
- x i , j + x i − 1 , j + x i + 1 , j + x i , j − 1 + x i , j + 1 x_{i, j}+x_{i-1, j}+x_{i+1, j}+x_{i, j-1}+x_{i, j+1} xi,j+xi−1,j+xi+1,j+xi,j−1+xi,j+1为奇数, ∀ i , j = 1 , …