离散优化问题局部搜索启发式探索框架。
heurisp的Python项目详细描述
启发式
启发式
是用python开发的面向对象框架。其目的是帮助用户获得使用本地搜索启发法(L.S.H.)的经验。
离散优化问题(d.o.p.)。
启发性的
设计时考虑了以下原则:
--它必须足够通用,以允许定义各种离散优化问题。
--在使用本地搜索启发法和编程方面,它需要能够被经验不足的用户所接受。
--它需要包含各种可用的本地搜索启发,以及添加新启发的通用类。
--它需要并行处理来加速过程和工具,以简化统计分析。
用户只需编程求解离散优化问题,并选择启发式算法即可运行。启发式
将处理启发式搜索并获取
用户作出明智决定所需的信息。
heurispy
是用python 3.7编程的,可以在这里下载并使用这些外部库:
--numpy:科学计算库。首页
--病理学:并行处理库。首页
--熊猫:数据分析库。首页
--pyfpdf:PDF文件库。主页
--pypdf2:一个pdf工具包。首页
--绘图库:绘图库。主页
--TQM:进度条库。首页
安装
启发式
在pypi中作为库提供,可以使用以下命令安装:
pip install heurispy
要验证安装,请运行其中一个示例脚本,如route/heurispy/ejemplos/中的"coloracion\u grafo\u recsim.py"。
许可证
版权所有2019,Lania,A.C.
根据apache许可证2.0版(以下简称"许可证")授权; 除非符合许可证,否则您不能使用此文件。 您可以在
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则软件 根据许可证分发是按"原样"分发的, 无任何明示或默示的保证或条件。 有关管理权限的特定语言和 许可下的限制。
它是如何工作的
启发式
有三个主要类,需要用户正常工作:
--问题a:处理用户编程的D.O.P.。
--启发式:接收属性以使用定义的用户参数进行启发式探索。
--框架:指导所有内部进程,如并行处理、数据重新收集和方法调用文件生成器。
定义D.O.P.
首先,我们需要在heurispi
上定义d.o.p.。为此,我们必须创建:
--创建新解决方案的方法。
--更改现有解决方案的方法。
--最小化的目标函数。
例如,在着色图问题中,我们给节点分配颜色,试图在没有重复的附加颜色的情况下最小化使用的颜色数。图是 用字典表示。字典是一组具有名为"keys"的标签的值。所以:
adyacencies_in_graph = {"0": [1, 4, 6],
"1": [0, 2, 7],
"2": [1, 3, 8],
"3": [2, 4, 9],
"4": [0, 3, 5],
"5": [4, 7, 8],
"6": [0, 8, 9],
"7": [1, 5, 9],
"8": [2, 5, 6],
"9": [3, 6, 7]}
nodes_amount = len(adyacencies_in_graph)
元素是""之间是节点,列表是它们的辅助节点。另外,字典的长度决定了节点的数量。
为了创建一个解决方案,我们给每个节点分配一个随机颜色(用整数表示)。其定义如下:
import random
def create_solution():
new_solution = []
for index in range(nodes_amount):
new_solution.append(random.randint(0, nodes_amount - 1))
return new_solution
新的解决方案是一个列表,其中的索引表示节点,索引值是指定的颜色。要更改解决方案,我们在解决方案中选择一个随机边,验证 Adyacent节点的颜色,并为所有节点选择不同的颜色。Adyacent颜色是通过以下方式获得的:
def get_adyacent_colors(solution, node):
nodes = adyacencies_in_graph[str(node)]
adyacent_colors = []
for current_node in nodes:
adyacent_colors.append(solution[current_node])
return adyacent_colors
我们用:
def change_solution(solution):
new_solution = solution.copy()
length_solution = len(new_solution)
node_to_change = random.randint(0, length_solution - 1)
colors = list(range(nodes_amount))
adyacent_colors = get_adyacent_colors(new_solution, node_to_change)
available_colors = [color for color in colors if color not in adyacent_colors]
new_solution[node_to_change] = random.choice(available_colors)
return new_solution
目标函数检查一个解决方案中不同颜色的数量,以及有多少节点具有重复的辅助颜色。如下所示:
def cost_different_colors(solution):
different_colors = set(solution)
return len(different_colors)
def cost_adyacent_colors(solution):
final_value = 0
length_solution = len(solution)
for index in range(length_solution)
color = solution[index]
adyacent_colors = get_adyacent_colors(solution, index)
repeated = adyacent_colors.count(color)
final_value = final_value + repeated
return final_value
我们为每个成本加上权重,以允许调整目标函数,并对其进行定义:
c_1 = 1
c_2 = 1
def objective_function(solution):
color_cost = cost_different_colors(solution)
adyacent_cost = cost_adyacent_colors(solution)
return c_1*color_cost + c_2*adyacent_cost
现在,我们需要创建problema类的一个实例,生成为:
from heurispy.problema import Problema
coloration_problem = Problema(dominio=create_solution, funcion_objetivo=objective_function, varia_soluciones=change_solution)
这个例子是在/heurispy/ejemplos/route中的scripy problema_coloracion_grafo.py中用西班牙语实现的。
准备启发式方法以供使用
在heurispiy
中实现的每个启发式都是启发式的子类。要使用它们,我们只需要导入对应的类,将其归类为一个problema实例,然后定义
一些一般参数。例如,要使用tabu搜索,我们执行以下操作:
pip install heurispy
0
然而,我们仍然需要定义特定的启发式参数来实现heurispiy
。
定义启发式参数
为了定义特定的启发式参数,我们需要创建一个字典。对于禁忌搜索:
pip install heurispy
1
这本词典是进行探索所需的基础。在这种情况下,我们有三个块参数:
-内存空间=50,最大搜索无改善=100(ms=50,mswi=100)
-内存空间=100,最大搜索无改善=100(ms=100,mswi=100)
-内存空间=150,最大搜索无改善=100(ms=150,mswi=100)
字典中的每个值都必须是包含每个参数的所有预期值的列表。下一步是定义每个参数块的重复。
确定重复次数
为了确定重复次数,我们使用下一种方法:
pip install heurispy
2
这样,执行30次:10次执行ms=50,mswi=100,10次执行ms=10,mswi=100,10次执行ms=150,mswi=100。
通过启发式和总执行,我们可以开始最后的启发式过程。
开始启发式探索
Inicia_exploracion_heuristica方法开始探索:
pip install heurispy
3
我们可以用nucleos_-cpu参数定义搜索中使用的核心数量。默认情况下,它使用所有的CPU内核。
启动搜索后,heurispy
显示一个进度条,其中统计已完成的执行,抛出进度信息和作为结果创建的文件。
检查文件
完成探索后,将创建两个文件夹:"resultados"(存储启发式探索生成的统计信息和图表)和"informacion"(包含 数据和高级信息。在"results"中,创建了一个文件夹,其中使用了启发式的名称,并且在其中有一个完成了探索的文件夹。它的名字是 勘探完成的日期和时间。例如,如果该示例是在2019年7月4日至2019年12:31 pm执行的,则它存储在文件夹"2019-07-04---12-31"中。 在这个文件夹中是一个pdf文件,它的名称包含使用的启发式、相应的参数块以及创建文件的日期和时间。信息 在这个pdf文件中显示了所使用的启发式方法的特定信息,因此其中的信息可能会有所不同。
因为启发式算法的性能取决于使用的参数和离散优化问题是,没有规则可以决定理想的组合 在启发式和使用的参数之间,因此建议使用各种启发式和变量集参数测试d.o.p.,尝试使执行多样化并获得 可用信息的主要数量,以尝试并搜索结果的一致性。