标签: genetic-algorithm

我应该使用什么算法进行"遗传AI改善"

首先:这不是关于如何让节目连续播放的问题.去过也做过.

介绍性解释

我做了一个五行的游戏作为一个框架,试验基因改进AI(哎呀,这听起来非常自命不凡).与大多数回合制游戏一样,最佳动作是通过为每个可能的动作分配分数,然后以最高分数进行动作来决定.将分数分配给移动(正方形)的功能如下:

  1. 如果正方形已有令牌,则得分为0,因为在正方形中放置新令牌是非法的.

  2. 每个方格可以是多达20个不同获胜行的一部分(5个水平,5个垂直,10个对角线).平方的得分是这些行中每一行的得分之和.

  3. 连续得分取决于行中已有的友方和敌方令牌的数量.例子:

    • 有四个友方令牌的行应该有无限分数,因为如果你在那里放置一个令牌,你就赢了游戏.
    • 具有四个敌人令牌的行的得分应该非常高,因为如果你没有在那里放置一个令牌,则对手将在下一回合获胜.
    • 具有友方和敌方令牌的行将得0,因为此行永远不会成为获胜行的一部分.

鉴于此算法,我已经声明了一个名为TBrain的类型:

type
  TBrain = array[cFriendly..cEnemy , 0..4] of integer; 
Run Code Online (Sandbox Code Playgroud)

数组中的值表示具有N个友好令牌和0个敌人令牌的行的分数,或0个友好令牌和N个敌人令牌.如果连续有5个令牌,那么因为该行已满,所以没有得分.

实际上很容易确定数组中应该包含哪些值.Brain [0,4](四个友方代币)应该是"无限",让我们称之为1.000.000.vBrain [1,4]应该非常高,但不要太高,以至于大脑更愿意阻止几个敌人胜利而不是自我胜利

以下(不可能的)董事会:

  0123456789
 +----------
0|1...1...12
1|.1..1..1.2
2|..1.1.1..2
3|...111...2
4|1111.1111.
5|...111....
6|..1.1.1...
7|.1..1..1..
8|1...1...1.
Run Code Online (Sandbox Code Playgroud)

玩家2应该将他的令牌放入(9,4),赢得游戏,而不是(4,4),即使他会阻止玩家1的8个潜在获胜行.Ergo,vBrain [1,4]应该是(vBrain) [0,4]/8)-1.像这样工作,我们可以找到"大脑"的最佳值,但同样,这不是我感兴趣的.我想要一个算法来找到最佳值.

我已经实现了这个框架,因此它完全是确定性的.分数中没有添加随机值,如果几个方格具有相同的分数,则会选择左上角.

实际问题

这是介绍,现在到有趣的部分(对我来说,至少)

我有两个"大脑",vBrain1和vBrain2.我应该如何迭代地使这些变得更好?我想象这样的事情:

  1. 使用随机值初始化vBrain1和vBrain2.
  2. 模拟他们之间的游戏.
  3. 将赢家的值分配给输家,然后稍微改变其中一个.

这似乎不起作用.大脑并没有变得更聪明.为什么?

分数方法是否应该为结果添加一些小的随机值,以便同一个两个大脑之间的两场比赛会有所不同?每次迭代的值应该改变多少?应该如何初始化"大脑"?有恒定的价值?随机值?

此外,这与AI或遗传算法有什么关系吗?

PS:这个问题与五连胜无关.这只是我选择的东西,因为我可以宣布一个非常简单的"大脑"进行实验.

algorithm artificial-intelligence genetic-algorithm

7
推荐指数
2
解决办法
1238
查看次数

如何解决这个组合算法问题

N有人必须参加T考试.每次考试都需要"一些"时间,例如30分钟(没有提前完成的事情).考试必须在考官面前进行.

我需要安排每个人在整个时间段内在考官面前进行每次考试,但避免午休,在最短的时间内使用最少数量的考官(即没有/最小考官闲置)

有以下限制:

  • 没有人可以同时在两个地方
  • 每个人必须参加一次考试
  • 没有人应该由同一位考官两次检查

我意识到最佳解决方案可能是NP-Complete,并且我可能最好使用遗传算法来获得最佳估计(类似于此?座位计划软件建议(这样的野兽甚至存在吗?)).

我对遗传算法如何工作感到满意,我正在努力解决的是如何以编程方式对问题进行建模,以便我可以通过基因操作参数.

如果每次考试花费相同的时间,那么我将时间段划分为这些长度,然后简单地创建一个时间矩阵与审查员并将候选人放入.但是因为每次测试的时间不一定是同样,我对如何处理这个问题有点失落.

目前我这样做:

  • 列出每个候选人和考试之间需要进行的所有"测试"
  • 从有尽可能多的审查员开始,有测试
  • 反复遍历所有审查员,每个审查员:找到一个符合审查员资格的计划外测试(根据限制)
  • 继续,直到所有可以安排的测试,是
  • 如果有任何未安排的测试,请增加审查员人数并重新开始.

我正在寻找关于如何处理这个问题的更好的建议,因为它目前感觉相当粗糙.

language-agnostic algorithm genetic-algorithm

7
推荐指数
1
解决办法
497
查看次数

如何表示遗传算法中的时间表问题的时间表?

对于遗传算法,通常基因符号如下:

PARENT1: 101101010101001001001001110011100110101011101101
PARENT2: 010100111011010101110101001001101011001010010110
Run Code Online (Sandbox Code Playgroud)

如此交叉,突变可以通过这种表示来完成,如:

选择一个交叉点:

PARENT1: 1011010101010010 01001001110011100110101011101101
PARENT2: 0101001110110101 01110101001001101011001010010110
Run Code Online (Sandbox Code Playgroud)

执行交叉生成孩子:

CHILD: 1011010101010010 01110101001001101011001010010110
Run Code Online (Sandbox Code Playgroud)

然后变成一条全新的染色体:

CHILD: 101101010101001001110101001001101011001010010110
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在Java中表示每周计划基因?

示例来自本文:http://secretgeek.net/content/bambrilg.pdf

我正在克服Java中的这个时间表问题,并希望代表

FIGURE 10: An Entire University Timetable
Run Code Online (Sandbox Code Playgroud)

在Java中.

java algorithm genetic-algorithm

7
推荐指数
1
解决办法
3073
查看次数

按位交叉两个整数

我目前正在尝试实现遗传算法的一个非常简单的例子.

有一次,你必须用两个数字(父母)做一个"交叉"(生物学)才能得到一个"孩子".

你可以在这里找到交叉的解释:

如何"交叉"两个字符串(1234&abcd - > 12cd&ab34)

(第二个例子,更容易的"一点"交叉是我正在尝试做的.)

染色体(父母和孩子)是数字,但"交叉"将是一个操作.

我找到了其中一条"染色体"的解决方案,具体如下:

  • 将位X移动到右侧(>>>运算符)
  • 然后再次移动位X位置,但这次向左移动(<<操作员)

因此,这将保留一条染色体的末端,并以0开头填充开头.

但我真的不知道如何解决另一条染色体的问题,然后也做了交叉.

(一旦我保留染色体的开始/结束并用0填充其余部分,可能是异或.)

或者我应该从另一个角度处理这个问题?

javascript bit-manipulation genetic-algorithm

7
推荐指数
1
解决办法
423
查看次数

如何实现选择和交叉使用遗传算法求C中数的平方根

我试图用遗传算法找出一个浮点数的平方根.
我初始化了随机数和健身函数.如何从人口和统一交叉中实施父母的选择?

c c++ algorithm genetic-algorithm

7
推荐指数
1
解决办法
1594
查看次数

我怎样才能避免编译错误:std :: transform?

这是我的C++代码(我使用的是Visual C++ 2010):

int absd(int t)
{
    return abs(t);
}
int main()
{
    try
    {
        int dpi = 137;
        int dpiCriterionAry[] = {100, 150, 200, 300, 400, 500, 600};
        std::vector<int> vec(dpiCriterionAry, dpiCriterionAry + _countof(dpiCriterionAry));
        std::transform(vec.begin(), vec.end(), vec.begin(), std::bind1st(std::minus<int>(), dpi));
        std::transform(vec.begin(), vec.end(), vec.begin(), absd);
        //std::transform(vec.begin(), vec.end(), vec.begin(), abs);
        copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, "\t"));
        cout << endl;
    }
    catch(exception& e)
    {
        cerr << e.what() << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我取消注释该行时:

//std::transform(vec.begin(), vec.end(), vec.begin(), abs);
Run Code Online (Sandbox Code Playgroud)

我收到了错误消息:

1>------ Build started: Project: Console, Configuration: Release …
Run Code Online (Sandbox Code Playgroud)

c++ stl compiler-errors visual-c++ genetic-algorithm

7
推荐指数
1
解决办法
2835
查看次数

遗传算法优化

几个星期前我问了一个关于如何在R中进行优化的问题(使用Optimize R优化矢量).现在我已经掌握了R中的基本优化,我想开始使用GA来解决解决方案.

鉴于目标函数:

div.ratio <- function(weight, vol, cov.mat){
  weight <- weight / sum(weight)
  dr <- (t(weight) %*% vol) / (sqrt(t(weight) %*% cov.mat %*% (weight)))  
  return(-dr)
}
Run Code Online (Sandbox Code Playgroud)

我正在使用genalg包进行优化,特别是"rbga.bin"函数.但事情是似乎无法传递多个参数,即无法传递vol和cov.mat.我错过了什么或理解错误.

编辑:在genalg包中,有一个名为rbga.bin的函数,我正在使用它.

以下是上一个问题的简单代码,可以帮助您入门:

rm(list=ls())
require(RCurl)
sit = getURLContent('https://github.com/systematicinvestor/SIT/raw/master/sit.gz',     binary=TRUE, followlocation = TRUE, ssl.verifypeer = FALSE)
con = gzcon(rawConnection(sit, 'rb'))
source(con)
close(con)
load.packages('quantmod')


data <- new.env()

tickers<-spl("VTI,VGK,VWO,GLD,VNQ,TIP,TLT,AGG,LQD")
getSymbols(tickers, src = 'yahoo', from = '1980-01-01', env = data, auto.assign = T)
for(i in ls(data)) data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)

bt.prep(data, align='remove.na', dates='1990::2013')

prices<-data$prices[,-10]  
ret<-na.omit(prices/mlag(prices) - …
Run Code Online (Sandbox Code Playgroud)

optimization r genetic-algorithm

7
推荐指数
1
解决办法
4668
查看次数

寻找一种更好的遗传算法评估方法

我目前正试图用一种不常见的方法,一种遗传算法来解决reddit上的艰难挑战#151.

总之,一个分隔条件字符串之后consonantsvowels和移除spaces我需要把它放在一起不知道什么字符是第一位的.

hello world被分隔到hllwrldeoo和需要被重新组装起来.例如hlelworlod,一种解决方案是,但这没有多大意义.采用所有可能解决方案的详尽方法可行,但对于较长的问题集则不可行.

我已经拥有的

  • 具有英语单词频率的数据库
  • 一种算法,cost使用Zipf定律构造相对数据库,并且可以从没有空格的句子中始终分离单词(借用此问题/答案)
  • 将辅音和元音放入堆栈并随机从任一个中取出一个字符并将其编码为一个字符串的方法,该字符串由12有效地编码构造gene.这个gene例子的正确性是1211212111
  • 一种改变这种字符串的方法,随机交换字符

我尝试了什么

使用该infer_spaces()方法生成500个随机序列,并使用所有单词的成本评估适应度,取最佳值25%并从中修改4个新值,适用于小字符串,但经常落入局部最小值,尤其是对于较长序列.Hello World已经在第一代中发现(已经thisisnotworkingverygood正确分离并且具有成本)已经在第二代中41.223收敛到th iss n ti wo or king v rye good(270成本).

我需要的

显然,使用计算出的成本作为评估方法仅适用于语法正确的句子的分离,而不适用于此遗传算法.你有更好的想法吗?或者是解决方案的另一部分,例如问题的表示gene

python algorithm genetic-algorithm

7
推荐指数
1
解决办法
446
查看次数

如何使用遗传算法优化参数

我想在R中使用GA来优化eps-regression(SVR)中的三个参数(gamma,cost和epsilon).这就是我所做的.

library(e1071)
data(Ozone, package="mlbench")
a<-na.omit(Ozone)
index<-sample(1:nrow(a), trunc(nrow(a)/3))
trainset<-a[index,]
testset<-a[-index,]
model<-svm(V4 ~ .,data=trainset, cost=0.1, gamma=0.1, epsilon=0.1, type="eps-regression", kernel="radial")
error<-model$residuals
rmse <- function(error) #root mean sqaured error
{
  sqrt(mean(error^2))
}
rmse(error)
Run Code Online (Sandbox Code Playgroud)

在这里,我将cost,gamma和epsilon分别设置为0.1,但我不认为它们是最好的值.所以,我想使用遗传算法来优化这些参数.

GA <- ga(type = "real-valued", fitness = rmse,
         min = c(0.1,3), max = c(0.1,3),
         popSize = 50, maxiter = 100)
Run Code Online (Sandbox Code Playgroud)

在这里,我使用RMSE作为适应度函数.但我认为健身功能必须包括要优化的参数.但是,在SVR中,目标函数太复杂了,无法用R代码写出来,我试图找到它很长时间但无济于事.有人同时了解SVR和GA的人,有使用GA优化SVR参数的人,请帮帮我.请.

optimization r genetic-algorithm

7
推荐指数
1
解决办法
4646
查看次数

多线程galib247遗传算法卡在局部最大值

我为galib247(下面)添加了多线程支持,但我仍然看到解决方案陷入局部最大值的问题.

也许这是遗传算法的一个缺点.如果有人有任何建议,请告诉我.我已经尝试过运行1000个独立人群,根据最近人口找到更好的解决方案的优先次序,我仍然认为它没有找到最佳解决方案.

我也试过修改mutator.也许解决方案设置太复杂,有很多局部最大值.它通常在1000个池池中的每一个池中找到不同的局部最大值,但偶尔会有一个池池找到更好的答案并且优先用于调度.

我正在尝试做的是根据一组不断变化的历史价格,为FX交易信号发生器生成一个最佳技术分析指标列表,其中包含参数.几年前有一本关于它的书,我认为作者的名字是卡茨.

我正在测试结果与第二个历史价格集的差异,但基本上,真正的考验是它是否可以预测未来的价格.

GAPopulation.C(http://lancet.mit.edu/ga/Copyright.html):

#include <boost/thread.hpp>
#include <boost/threadpool.hpp>

boost::threadpool::pool GAPopulation::thpool(5);

void GAPopulationEvaluatorWorker(void* individual_ptr) {
    ((GAGenome*) individual_ptr)->evaluate();
    boost::this_thread::yield();
}

void GAPopulation::DefaultEvaluator(GAPopulation& p) {
    for(int i = 0; i < p.size(); i++) {
        thpool.schedule(boost::bind(GAPopulationEvaluatorWorker, p.individual_ptr(i)));
    }

    thpool.wait();
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading genetic-algorithm

7
推荐指数
1
解决办法
266
查看次数