轮盘算法的小改进

网上看到很多用轮盘算法,都是采用的如下图的模式,

 

1.随机出N个个体的值,

2.遍历统计sum

3.double类型存储单个概率。

4.合计概率。

但个人觉得其实完全没必要这么计算,一方面double类型的转换要花时间,另一方面多次遍历感觉不大好。

故试作了另一种轮盘算法,思路是取消概率分算,直接用sum值来对比。

对比了一下两种计算,新算法快了几十倍,有兴趣的可以验证一下,下面是运行截图与测试代码。

import java.util.Arrays;

public class RotaryDemo {
	public static void main(String[] args) {
		select1();
		System.out.println();
		select2();
	}

	/**
	 * 第一种算法,对应累计概率确定选择是哪个,由于概率大的拥有数值大,故被选择概率大
	 */
	private static void select1() {
		long t1 = System.nanoTime();
		int arr[] = new int[10];// 单个数值
		double p[] = new double[10];// 计算概率
		double p_sum[] = new double[10];// 累计概率,对应轮盘值
		int sum = 0;
		for (int i = 0; i < 10; i++) {
			arr[i] = (int) (Math.random() * 100);
			sum += arr[i];
		}
		p[0] = 1.0 * arr[0] / sum;
		p_sum[0] = p[0];
		for (int i = 1; i < arr.length; i++) {
			p[i] = 1.0 * arr[i] / sum;
			p_sum[i] = p_sum[i - 1] + p[i];
		}
		System.out.println(Arrays.toString(arr));
		System.out.println(Arrays.toString(p));
		System.out.println(Arrays.toString(p_sum));
		double r = Math.random();
		for (int i = 0; i < p_sum.length; i++) {
			if (p_sum[i] > r) {
				t1 = System.nanoTime() - t1;
				System.out.println("选中第" + i + "个,概率为" + p_sum[i] + ",抽奖随机概率为:" + r + "费时:" + t1);
				break;
			}
		}
	}

	/**
	 * 第二种算法,不算概率,只求合计,得出累计值
	 */
	private static void select2() {
		long t1 = System.nanoTime();
		int arr[] = new int[10];// 单个数值
		int p_sum[] = new int[10];
		int sum = 0;
		for (int i = 0; i < 10; i++) {
			arr[i] = (int) (Math.random() * 100);
			if (i == 0) {
				p_sum[i] = arr[i];
			} else {
				p_sum[i] = p_sum[i - 1] + arr[i];
			}
			sum += arr[i];
		}
		System.out.println(Arrays.toString(arr));
		System.out.println(Arrays.toString(p_sum));
		double r = Math.random();
		int m = (int) (r * sum);
		for (int i = 0; i < p_sum.length; i++) {
			if (p_sum[i] > m) {
				t1 = System.nanoTime() - t1;
				System.out.println("选中:" + i + "个,概率为" + (arr[i] * 1.0 / sum) + ",抽奖随机概率为:" + r + "费时:" + t1);
				break;
			}
		}
	}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于Python遗传算法改进,可以考虑以下几个方向: 1. 改进遗传算法的选择、变异和交叉算子。可以尝试使用不同的选择策略,如轮盘赌选择、锦标赛选择等,以增加选择的多样性。对于变异操作,可以引入更多的变异方式,如插入、删除、替换等,以增加变异的随机性。对于交叉操作,可以采用多种交叉方式,如单点交叉、多点交叉、均匀交叉等,以增加交叉的多样性。 2. 引入自适应的参数调节机制。可以根据遗传算法的收敛情况,动态调节选择、变异和交叉的概率,以提高算法的收敛速度和性能。 3. 采用多目标优化的方法。可以将遗传算法扩展为多目标优化算法,通过引入适应度函数的权重或约束条件,寻求多个目标的最优解或非劣解集合。 4. 结合其他优化算法的思想。可以将遗传算法与其他优化算法结合,如模拟退火算法、粒子群算法等,以提高算法的全局寻优能力和收敛性能。 5. 并行化优化过程。可以采用并行计算的方式,将遗传算法中的选择、变异和交叉操作并行化,以加速算法的执行速度和搜索效率。 总结来说,改进Python遗传算法可以从改进选择、变异和交叉算子、引入自适应的参数调节机制、采用多目标优化的方法、结合其他优化算法的思想和并行化优化过程等多个方面入手。这样可以提高算法的全局寻优能力、收敛速度和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值