离散优化问题局部搜索启发式探索框架。

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.,尝试使执行多样化并获得 可用信息的主要数量,以尝试并搜索结果的一致性。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript节点js require()和Rhino Shell load()之间的区别是什么?   While循环中的java If语句   java GXT如何在XTemplate中显示treeobject?   如何将黑白图像加载到二进制文件中?   java ORMLite不知道如何存储班级航班。扫描仪。modelFX。机场航空公司的AirlineFx。使用另一个类或自定义持久器   java组织。阿帕奇。德比。客户是SqlException JSP和JSTL查询   spring如何将clob数据分配给java变量   java从上的表获取数据(Spring)   javaphp使用Exec执行带有用户定义参数的Jar文件   java jsonschema2pojo:引用相同类型的对象   使用原语从Scala调用Java vararg方法   java ClassNotFoundException:ClientBuilder Jersey 2.25.1 Tomcat 9.0   Android(Java)cr_BindingManager:无法调用determinedVisibility()从未看到pid的连接:   Java使用LocalTime类比较没有日期的时间   Java如何初始化对象的参数?