这是针对一个项目,我被要求为旅行商优化问题以及汉密尔顿路径或周期决策问题实施启发式算法.我不需要实现本身的帮助,但对我正在进行的方向有疑问.
我已经有一个基于遗传算法的TSP启发式算法:它假设一个完整的图表,从一组随机解决方案开始作为一个群体,并努力改善人口数代.我还可以用它来解决汉密尔顿路径或循环问题吗?我只是想检查是否有路径,而不是优化以获得最短路径.
现在任何完整的图形都会有哈密顿路径,因此TSP启发式必须扩展到任何图形.如果两个城市之间没有路径,并返回作为有效哈密顿路径的第一条路径,则可以通过将边设置为某个无穷大值来完成此操作.
这是接近它的正确方法吗?或者我应该为汉密尔顿路径使用不同的启发式算法?我主要担心的是它是否是一种可行的方法,因为我可以肯定TSP优化是有效的(因为你从解决方案开始并改进它们),但是如果哈密尔顿路径决策器在固定数量的代中找到任何路径则不行.
我认为最好的方法是自己测试它,但是我受到时间的限制,并且在走下这条路线之前我会问...(我可以找到一个不同的启发式方法来代替汉密尔顿路径)
language-agnostic algorithm traveling-salesman genetic-algorithm
我在Java中开发一种遗传算法,就像所有这些算法一样,需要两条父染色体的交叉.这些染色体可能很长,从30到500不等(但无论它们长度如何,它们都将具有相同的大小,因此如果长度为80,那么GA运行的全部将为80).
我想以不同的方式发展,但他们在我看来都非常低效,所以我想我可能会要求新的,不同的观点和建议.
例如,我想的方式之一是将字符串转换为字符数组和迭代从起点到交叉轨迹(即,从端部的s1 & s2[25]至s1 & s2[40])复制到颞阵列每个阵列的字符的那些点之间和然后再次迭代并使用"伙伴"的时间数组中的字符交换它们.但就像我说的那样,一个拥有大约1000条染色体并且大约1000代的人群的程序似乎非常缓慢.
以下是两点交叉的示例:

还有一个更简单的点交叉:

因为在Java中根本不是很先进,你可以建议我采取什么方法,可能是一个我不知道的Java函数,或者我可以实现的一些算法?
我在Matlab中构建遗传算法的约束矩阵存在问题.我想在GA函数中导入这些矩阵,以解决具有以下约束的问题:
a1<a2<a3...an-1<an , 0<ai<90, n=number of variables.
Run Code Online (Sandbox Code Playgroud)
Matlab的文档对我没有帮助,因为它只涉及简单的方程而不是这种约束.
我是GA的新手,每一个帮助都是可以接受的!
我正在使用遗传算法"学习"草稿/跳棋AI的最佳参数.该参数存储在double的向量中.
[x1 x2 x3 x4 x5 x6 x7 x8 x9]
Run Code Online (Sandbox Code Playgroud)
实际上我使用两种简单的方法进行交叉:一点交叉和两点交叉.不幸的是,在我看来,这种方法还不够好.
例如,如果我有一个遗传池:
[10 20 1]
[30 10 9]
[100 1 10]
Run Code Online (Sandbox Code Playgroud)
如果x1值的理论最优值为50,我就无法通过交叉找到它.我唯一的希望是产生一个x1 = 50的突变,足以传递给下一代.
那么,有一种更好的方法可以使用数组来执行交叉吗?
我一直在为我ai班上的一个项目做遗传算法研究,但我对传统算法看起来有点困惑.
基本上,我想知道为什么他们使用不同的选择,如轮盘赌选择父母重现.为什么不选择健康评分最高的父母并称之为一天?
交叉也让我感到困惑.它每次随机选择点来拼接父信息.但是,基于以前的信息,交叉变换似乎更有意义.如果已知染色体串达到某一点,则交叉仍然可以是随机的,但不在字符串中良好部分的范围内.
有什么想法吗?
algorithm artificial-intelligence selection genetic-algorithm crossover
我有两个描述神经网络结构的对象数组,如何将它们组合起来产生一个逼真的后代?"染色体"看起来像这样:
chromosome = [
[Node, Node, Node],
[Node, Node, Node, Node, Node],
[Node, Node, Node, Node],
[Node, Node, Node, Node, Node],
[Node, Node, Node, Node, Node, Node, Node],
[Node, Node, Node],
];
Run Code Online (Sandbox Code Playgroud)
示例节点:
Node {
nodesThatThisIsConnectedTo = [0, 2, 3, 5] // These numbers identify which nodes to collect output from in the preceding layer from based on their index number
weights = [0.34, 0.33, 0.76, -0.56] // These are the corresponding weights applied to the mentioned nodes
}
Run Code Online (Sandbox Code Playgroud) 我有一个运行F#程序,运行Dominion,一款纸牌游戏.我想用遗传算法来确定最佳的游戏策略.但是,我对AI或遗传算法知之甚少.你能指点我一些好的文学入门吗?
比赛的策略包括对特定牌的反应.在每个回合中,机器人都会获得一手牌.它可以根据已经处理的内容选择玩动作卡或购买新卡.目标是尽可能多的胜利点卡结束游戏.
硬编码方法可能类似于:
def play(hand, totalDeck):
if hand contains Smithy then use Smithy
if hand contains enough coins for Province then buy Province
if more than 30% of the totalDeck is Smithy, then buy coins
Run Code Online (Sandbox Code Playgroud)
我正在考虑用每张卡的总牌组的目标部分向量来描述策略:
[Smithy, Province, Copper, ...]
[.3, .2, .1, ...]
Run Code Online (Sandbox Code Playgroud)
然后为了改变机器人,我可以改变那个向量,看看变异版本是否做得更好.健身功能将是玩Dominion对抗各种其他机器人的平均分数.(一个机器人的分数取决于它与谁对抗,但希望通过对许多机器人玩很多游戏,这甚至可以解决.)
这有意义吗?我走向正确的道路吗?
这是我到目前为止所做的输出:

虽然这只显示黑白图像,但代码也适用于彩色图像.代码基本上使用来自小型数据库的较小图像填充较大的图像.
所以这就是我被困住的地方,相当无能为力.
我怎样才能得到像这样的效果.或者这个.
Qn1:我需要拍摄另一个输入(大)图像*(其中一个效果可见)*并合并它们,但是如何?
Qn2:我怎样才能评估照片拼接的好坏?我有一个为此编写的遗传算法,但我无法修复适应度函数,(突变和交叉工作完美).
这就是我能想到的(对于Qn1):
1.取上面显示的图像的交替像素和必须制作马赛克的图像.
2.取上述像素值的平均值和输入图像,必须为其制作马赛克.
但是没有任何线索来评估善意.
我正在尝试使用遗传算法构建一个4 x 4数独求解器.我有一些问题,价值收敛到局部最小值.我正在使用排名方法并删除最后两个排名答案的可能性,并用两个排名最高的答案可能性之间的交叉替换它们.为了避免局部mininma的其他帮助,我也使用变异.如果在特定的生成量内未确定答案,则我的人口中充满了全新的随机状态值.但是,我的算法似乎陷入局部最小值.作为健身功能,我正在使用:
(开放平方的总金额*7(每个方格可能违反;行,列和方框)) - 违规总数
population是整数数组的ArrayList,其中每个数组都是基于输入的sudoku可能的结束状态.确定人群中每个阵列的适应度.
有人能够帮助我确定为什么我的算法会收敛于局部最小值,或者可能会建议使用一种技术来避免局部最小值.任何帮助是极大的赞赏.
健身功能:
public int[] fitnessFunction(ArrayList<int[]> population)
{
int emptySpaces = this.blankData.size();
int maxError = emptySpaces*7;
int[] fitness = new int[populationSize];
for(int i=0; i<population.size();i++)
{
int[] temp = population.get(i);
int value = evaluationFunc(temp);
fitness[i] = maxError - value;
System.out.println("Fitness(i)" + fitness[i]);
}
return fitness;
}
Run Code Online (Sandbox Code Playgroud)
交叉功能:
public void crossover(ArrayList<int[]> population, int indexWeakest, int indexStrong, int indexSecStrong, int indexSecWeak)
{
int[] tempWeak = new int[16];
int[] tempStrong = new int[16];
int[] tempSecStrong = new …Run Code Online (Sandbox Code Playgroud) 我正在尝试开始使用Jenetics JAVA库进行遗传算法,而且我的GA有限背景中有一些我不理解的东西;
据我所知,GA生成了一组m元素阵列,其中每个数组都是一个可以评估的潜在解决方案,一旦评估,潜在的解决方案就会被排序,最好的选择是为了创建一个新的人口,等等.但我发现Jenetics中的解决方案(基因型)是一个数组列表,其中每个数组都是我理解的潜在解决方案,每个数组也可以有不同的长度,我不明白为什么要使用这个结构而不是基因载体.
参见手册第6页,第3.1.3节.
如果可能的话我想知道为什么会这样.我希望这个问题足够明确.