优化算法--以Python实现(1)

此文中讨论优化算法,诸如随机搜索,退火算法,爬山法,遗传算法之类。参考了《集体智慧编程》。由于对Python不太熟,因此也讨论了下Python。。。对算法的讨论最好以实例/或问题的方式入手,故我们引入了组团旅游问题。

 

但你会看到,组团旅游什么的都是浮云,真正有意义的是从第四点开始的优化算法:随机搜索,退火算法,爬山法,遗传算法

 

组团旅游:

 

该问题的Java版本在神人vivizhyy的博文中:http://vivizhyy.javaeye.com/blog/643048

问题描述可参见该博文。

 

以下一至三均不是优化算法的一部分,但却是正确有效使用优化算法的前提和关键所在。如果你仅对优化算法感兴趣,请下拉至四。

 

一。先定义数据集和辅助函数:

 

 

 

1.关于文件打开:

   在Python3中取消了file()函数,取代之以open函数。上述with的open文件代码块是with的一个妙用。参                见:http://woodpecker.org.cn/diveintopython3/files.html

2.line.strip()

   line.strip()是Python中取出字符串首尾空格(或字符)的函数。与VB中的Trim,Ltrim,Rtrim类似,但strip不仅能去掉空格,还可以去        掉其他字符。参见:http://blog.csdn.net/suofiya2008/archive/2010/05/19/5608309.aspx

3.flights实际上是一个以元组为键以元组为值的字典。

4.关于getminutes

5.打印字典

若要打印字典flights,应该用(想找一个直接print的函数妙用找到,貌似只能用for来辅助完成)

 

在Python3以前可以用

 

这在Python3中是不可行的。可参见:http://www.sciencenet.cn/blog/user_content.aspx?id=372718以及:http://topic.csdn.net/u/20090721/13/91bf1e47-3d94-4b40-a18b-9406ac6985f3.html

 

二、将flights中的字典数据结构转换为表格形式。

 

代码中的for idx in range( int(len(r)/2) ):一句中,如果不使用int转换len/2的返回值则会出错,因在Python3中除法返回float,因此需要进行int转换。也因此不会再出现:http://apps.hi.baidu.com/share/detail/23147749中的问题。

另,参见:http://hi.baidu.com/gofight/blog/item/a73e3e1fcf9e74fe1ad576e8.html

另,关于print的格式化,参见:http://blogold.chinaunix.net/u2/84280/showart_2068008.html,print很像C中的printf

 

三、成本计算:

此题中的成本计算函数如下:

 

 

算法可改进为以下形式:

 

但该算法并不是很直观。

 

成本函数的确定是优化算法有效使用的一个相当重要的方面。

 

实际上,当优化算法写好以后,定义合理的成本函数以及domain即成为了关键,对优化函数的使用并不是拿来用即可,在使用之前得却确保有正确的辅助函数。详情见本博《优化算法--Python实现(2)》。

 

 

开始的测试我们使用的是人为的随机指定一个往返时刻列表,以此来算花费;

该优化算法的主要用途即是:通过搜索,找到一个合理的序列,该序列能够使得花费最低。

以下开始便是各种有效的搜索算法:

(好吧,优化算法来了。。。请注意以下优化函数中domain的入内参数domain,在不同的使用优化函数的场合是不同,domain和成本函数是优化函数有效的关键。)

 

四:随机搜索算法

 

for i in range(1000):的用法是Python中for的一个很好的用法,甚至比VB中的for each更为好用,因在VB6中,for each仅对variant变量或对象集合有效。

另,domain = [(0,9)]*(len(people)*2)实际上是定义了一个长度为len(people)*2的元组列表,每个元组可以是重复的。列表元素可以是重复的。

 

事实证明,增加随机搜索的调用次数,或者增加随机搜索的尝试次数(randomoptimize中for的循环次数),并不能显著的得到更好的序列。在我的机子上,最好的结果是31XX,在增加循环次数后,并没有得到比之更低的结果。

 

五:爬山法

该方法充分利用了已发现的解序列,基于最有序列很可能接近已发现的解序列,且,已发现的解序列意味着,在它之前的所有序列中,它是最优的,那么基于该解序列的进化应该能得到更为优异的序列,当不能产生更为优秀的序列,则进化完毕。

该算法从一随机序列开始,在一次循环所得到的序列之上进行不断的进化,直到找到应该更为优秀的,或最为优秀的序列。如下:

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
以下是使用粒子群优化算法实现的SVM多分类Python代码: ```python import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.svm import SVC # 定义粒子群优化算法 class PSO: def __init__(self, num_particles, max_iter, c1, c2, w, dim): self.num_particles = num_particles self.max_iter = max_iter self.c1 = c1 self.c2 = c2 self.w = w self.dim = dim self.x = np.random.uniform(low=-1, high=1, size=(num_particles, dim)) self.v = np.random.uniform(low=-1, high=1, size=(num_particles, dim)) self.pbest_x = self.x.copy() self.pbest_y = np.zeros(num_particles) self.gbest_x = np.zeros(dim) self.gbest_y = float('inf') def update(self, X_train, y_train): clf = SVC(kernel='linear') for i in range(self.num_particles): # 训练支持向量机模型 clf.fit(X_train, y_train) # 使用支持向量机模型预测 y_pred = clf.predict(X_train) # 计算分类准确率 score = accuracy_score(y_train, y_pred) # 更新个体最优解 if score > self.pbest_y[i]: self.pbest_x[i] = self.x[i].copy() self.pbest_y[i] = score # 更新全局最优解 if score > self.gbest_y: self.gbest_x = self.x[i].copy() self.gbest_y = score # 更新粒子速度和位置 r1 = np.random.rand(self.dim) r2 = np.random.rand(self.dim) self.v[i] = self.w * self.v[i] + self.c1 * r1 * (self.pbest_x[i] - self.x[i]) + self.c2 * r2 * (self.gbest_x - self.x[i]) self.x[i] = self.x[i] + self.v[i] def fit(self, X_train, y_train): for i in range(self.max_iter): self.update(X_train, y_train) # 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data y = iris.target # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义PSO算法参数 num_particles = 30 max_iter = 100 c1 = 2 c2 = 2 w = 0.8 dim = X_train.shape[1] # 初始化PSO算法 pso = PSO(num_particles, max_iter, c1, c2, w, dim) # 训练PSO-SVM分类器 pso.fit(X_train, y_train) # 使用最优参数训练支持向量机模型 clf = SVC(kernel='linear') clf.fit(X_train, y_train) # 在测试集上测试模型性能 y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` 在上述代码中,我们首先定义了一个粒子群优化算法类 `PSO`,其中 `update` 方法用于更新粒子速度和位置,并在每次更新后训练支持向量机模型并计算分类准确率。在 `fit` 方法中,我们多次调用 `update` 方法来寻找最优解。最后,我们使用最优参数训练支持向量机模型,并在测试集上测试模型性能。 需要注意的是,这里使用的是线性核函数的支持向量机模型。如果需要使用其他核函数,可以在 `SVC` 的构造函数中设置。另外,由于粒子群优化算法通常是一种全局优化方法,所以在实际应用中需要考虑算法的收敛速度和计算复杂度等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值