我正在尝试使用基本遗传算法(随机通用采样,1点交叉,Canonical GA)来演化迭代囚徒困境的最优策略.我在Haskell中实现了这个算法,并且最近添加了图表输出.不幸的是,生成的图表不符合此问题的预期模式,因此看起来我有一个错误.
我在这个问题上看到的所有拟合图都看起来像这样:

其他例子可以在关于迭代囚徒困境的演化稳健策略中看到,PJ Darwen和X. Yao(1993)p6-7
但是我的输出看起来像这样:

如果我将突变率设置为1,我得到:

或许暗示我的选择功能并不像我想象的那么随机,因为图表意味着同质人口.
如果您想检查它,我的代码就在这个git存储库中.
现在提出一个问题:你们中的任何人都可以在我的GA实现中提出我可能做错的事情,使图表看起来像这样吗?
例如,我认为它不太可能是适应度函数,因为我使用相同的适应度函数进行输出,它正在最大化,因此即使适应度函数在某种程度上是错误的,它仍然会最大化错误的函数(尽管我是我确定在这里错了,我对遗传算法很陌生)
我想要了解哪些功能的建议,我正试图解决这个问题.
编辑:在我的组合函数中添加了一些调试代码后,它似乎总是被传递给相同的个体(即使突变设置为1),所以推测选择在某处出错.
编辑:选择出错了,但这并没有引起所有问题,只是人口中的同质性.
我正在尝试使用Python和gnomecanvas制作一个简单的绘图应用程序.遗憾的是,似乎没有任何关于gnomecanvas的Python绑定的文档.因此,我在使用代码示例并试图从C绑定中猜测时遇到了笨拙.
实际上,我通过在笔划中保留当前点列表并在每个新项目中从此列表生成新路径对象来使代码工作:
def get_pointer_coords(self, event):
return self.window_to_world(event.x, event.y)
def render_path(self):
path_def = gnomecanvas.path_def_new(self.cur_path)
self.current_item.set_bpath(path_def)
def button_press(self, event):
is_core = event.device is gdk.device_get_core_pointer()
if is_core:
return
self.drawing = True
(x, y) = self.get_pointer_coords(event)
self.cur_path = [(gnomecanvas.MOVETO_OPEN, x, y)]
self.current_item = self.root().add( gnomecanvas.CanvasBpath
, outline_color="#A6E22E"
, width_pixels=1
, cap_style=gdk.CAP_ROUND
)
def button_release(self, event):
self.drawing = False
def motion_notify(self, event):
is_core = event.device is gdk.device_get_core_pointer()
if not is_core and self.drawing:
(x, y) = self.get_pointer_coords(event)
self.cur_path.append((gnomecanvas.LINETO, x, y))
self.render_path()
Run Code Online (Sandbox Code Playgroud)
在我看来,这是一个相当低效的方法:每次指针移动时生成一个新对象; 并且考虑到我从平板电脑获得亚像素精度这是相当经常的.
我的问题是:有没有一种方法可以简单地附加到每个指针运动的现有bpath,就像在这个库的C版本中一样? …
是否有一种有效的机制来查询NDB中重复属性中的项目数量?
我想做点什么:
Class.query(class.repeated_property.count == 2)
Run Code Online (Sandbox Code Playgroud)
但当然这不起作用.