本文重点:
旅行商问题(Traveling Salesman Problem, TSP)是一个难以用传统迭代算法求解的NP困难问题,因此经常用模拟退火算法来解决,同时旅行商问题也是最著名的计算机科学问题之一。
旅行商问题描述的是有一个旅行商,在指定的多个城市中,从任意城市开始,要分别经过其他城市并最终回到起点城市,求解其最短路径的方案,其中除起点城市外的其他城市能且只能经过一次。旅行商问题还有好些个变体,其中有些变体允许多次经过同一城市,或者是给城市之间的双向路径赋予不同的“成本”。
乍一看寻找最短路径对常规的迭代算法而言好像是个轻而易举的事情,但随着给定城市数量的增多,可能的路径组合数量也急剧增加。假如城市只有一两个,那可能的路径也就只有一条;但3个城市的话,可能的路径就有6条。
这是阶乘式的,要使用暴力搜索的话,在城市数量增大的时候将无法完成,但是使用模拟退火算法可以在几分钟内找到50个城市下对应的最短路径。
行连续型模拟退火算法的时候,是在当前解的某个或某几个维度上加上一个随机值,而在离散型模拟退火算法上就有点儿不同了。在旅行商问题中,每个解都是一条遍历各城市的路径,当前解也是这么一条路径,而移动到新位置则意味着选取与当前相近的一条路径。
要应用模拟退火算法,首先要生成一个初始随机解。就旅行商问题而言,指的则是各城市的一个去重的有序随机列表,然后还必须通过添加微小的随机扰动来产生新解。在旅行商问题中,其实就是调换经过某两个城市的顺序,具体的实现方式是随机选取两个不同的索引并交换对应城市在列表中的顺序。
不管是模拟退火算法的哪一种实现形式,都必须具有以下3个要素:
在旅行商问题中,评估得分就是旅行商经过的距离,距离越小则认为表现越好;初始解是一个去重的随机城市列表;当前解变换为新解的操作则是由调换两个城市的顺序实现的。
如何才能衡量一个NP困难问题的算法性能呢?在NP困难问题中,我们多数时候并不知道确切的最优解,这也就使得判断算法的结果与最优解的接近程度变得非常困难。不过,倒是有一种方法可以评估模拟退火算法在旅行商问题上的表现。将所有城市排成一个圈,最优解就应当在这个圆圈或者是椭圆的圆周上。
模拟退火算法结果已经比较接近最优解了,但还不是最优解;不过没关系,多数情况下全局最优解都很难找得到。并且之所以立马能够知道当前路径不是最优解,还是因为我们对几何中的各种问题都研究得很透彻。如果你有某方面的知识储备可以帮助你解决问题,那么就尽管放手去干,用你的方法去解决问题。只有当你对某个问题一筹莫展的时候,人工智能才算得上是最佳解决方案。
背包问题讲的是一个在商店中陷入选择困难症的入室窃贼,他四周有很多货物,但却只有一个背包,要怎么样才能够使他的收获最大化呢?前提条件是选取的货物组合必须要背包能够放得下。
背包问题是一个离散型问题。背包问题最常见的一种形式是所选的东西数目固定,且每样东西一般最多只能选一次,被称为“0-1背包问题”。其他还有些变体的背包问题则允许每样东西重复选择。背包问题中给出的物品一般具有两个属性:重量和价值;并且也会指定背包能够承受的最大重量。此外你可能还会好奇背包的容积,但一般来说背包问题都不会考虑容积。
我们采用向量的方式表述结果,如下所示:
Coffee thermos(weight=5,profit=1):false
Baseball cap(weight=1,profit=1):true
确定了解的表达方式之后,还要让模拟退火算法具有这些条件:
Java都需要JavaSDK,注意是SDK,不仅仅是JRE,而是SDKjava8,安装好java了后,设置classpath为dt.jar和tools.jar两个文件,Path为bin目录为sdk和jre的bin目录。即可java客户端编程只需要IDE就可以了其实java后端编程需要的东西还是蛮多的,大概分为四大类IDE,服务器数据库,数据库客户端软件另外都..._学习java后端开发需要用到什么软件
kafka_sum of partition offsets
1.使用php的系统函数 number_format$num = 1234567890;echo number_format($num);//1,234,567,890echo number_format($num,2);//1,234,567,890.00echo number_format($num,2,'-','');//1,234,567,890-00 2...._"php将\"津a12345"
tf.contrib.layers.flatten(A)函数使得P保留第一个维度,把第一个维度包含的每一子张量展开成一个行向量,返回张量是一个二维的,返回的shape为[第一维度,子张量乘积)。一般用于卷积神经网络全连接层前的预处理,因为全连接层需要将输入数据变为一个向量,向量大小为[batch_size, ……]如下边,pool是全连接层的输入,则需要将其转换为一个向量。假设pool是一..._tensorflow flatten
因为今天的第三题不会(其实是不想打),所以转来一篇某大大的题解。 转自@Star_Weeper矩形 文件名:brother.pas/c/cpp 时限:1S 空间:256M Description 胜负胸中料已明,又从堂上出奇兵。秋实大哥是一个下棋好手,独孤求败的他觉得下棋已经无法满足他了,他开始研究一种新的玩法。 在一个n×m的棋盘上,放置了k个车,并且他在棋盘上标出了q个
author:JevonWei版权声明:原创作品官方网站下载httpd2.4、apr及apr-util的相关软件包,并传输到centos 7系统中的/usr/local/src(apr1.6版本过高不兼容,故需下载apr-1.5*版本)httpd2.4http://httpd.apache.org/download.cgi#apache2.4apr及apr-utilhttp://h...
国内科技博客极客公园PingWest爱范儿36Kr月光博客虎嗅网雷锋网钛媒体TechWeb互联网的那些事数字尾巴Engadget 中国cnBetaTech2ipo 创见TechCrunch 中国Donews科技娲母网易科技新浪科技腾讯科技_老赵点滴
下面是基于一个简单例子,一步一步注释加翻译A look at a very simple neural network inTensorFlow让我们来看一个基于tensorFlow创建一个非常简单的神经网络,实现线性回归的功能。 This is an introduction to working withTensorFlow. It works through an
NOJ-1045-六数码问题时限:1000ms 内存限制:10000K 总时限:3000ms描述现有一两行三列的表格如下:A B CD E F把1、2、3、4、5、6六个数字分别填入A、B、C、D、E、F格子中,每个格子一个数字且各不相同。每种不同的填法称为一种布局。如下:1 3 52 4 6布局12 5 64 3 1布局2定义α变换如下:把A格中的数字放入B格..._noj六数码
/* *Copyright(c)2017,烟台大学计算机学院 *All right reserved. *文件名:sk.cpp btree.h btree.cpp *作者:盛凯 *完成日期:2017年11月16日 *版本号:v1.0 * *问题描述:先序序列和中序序列构造二叉树*输入描述:无 *程序输出:见运行结果 sk.cpp:#inclu
首先,导入依赖<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10-FINAL</version> _maven org.apache.poi
记事本的打开与保存一些总结* Swing中有时方法不显示,需要把方setVisible(true)放到最后执行* AWT中的TextArea默认是中间布局* fileDialog对话框Load模式需要对取消事件进行处理* 快捷键使用需要用到JmenuItem主方法package cn.work.demo.demo03;public class NotePad {public static void..._java记事本打开功能