编写程序,利用可变参数定义my_min函数,输入参数为任意个数的数值,返回这些数值中的最小值,

编写程序,利用可变参数定义my_min函数,输入参数为任意个数的数值,返回这些数值中的最小值

要求:在my_min函数内部不能直接调用内置函数min。

代码:

def my_min(a,*b):
	list=[]
	list.append(a)
	for k in b:
		k=int(k)
		list.append(k)
	length=len(list)
	for i in range(0,length):
		for j in range(0,length-i-1):
			if list[j]<list[j+i]:
				continue
			elif list[j]>list[j+1]:
				list[j],list[j+1]=list[j+1],list[j]
	return(list[0])

效果:
hh
tip:
可变长度参数
-可变长度参数有两种形式:在参数名前加1个*或2个**

1.args接收多个位置参数并将其放在一个元组中 ,亦称可变参数
2.kwargs接收多个关键参数并存放到字典中,亦称关键字参数
3.*args和
kwargs并不是python中的参数关键字,而是-种惯用写法
4.带
或**的参数必须位于形参列表的最后位置

*args的用法

>>> def demo(* args):
print(args)
>>> demo(1,2,3)
(1, 2, 3)
>>> demo(1,2)
(1, 2)

**kwargs的用法

>>> def demo(**kwargs):
for item in kwargs.items():
print(item)
>>> demo(x= 1,y=2,z=3)
('y',2)
(‘x’, 1)
(‘z’,3)

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
遗传算法是一种优化算法,可用于求解函数最小值。以下是基于Python的遗传算法实现: 首先,需要定义适应度函数,即目标函数。假设我们要求解的目标函数为f(x) = x^2 + 2x + 1,代码如下: ```python def fitness_func(x): return x**2 + 2*x + 1 ``` 接下来,定义遗传算法的参数,包括种群大小、交叉概率、变异概率、迭代次数等。 ```python POP_SIZE = 50 # 种群大小 CROSS_RATE = 0.8 # 交叉概率 MUTATION_RATE = 0.1 # 变异概率 N_GENERATIONS = 100 # 迭代次数 ``` 然后,生成初始种群。这里我们随机生成50个个体,每个个体为一个浮点数,表示x的取值。代码如下: ```python import numpy as np pop = np.random.uniform(-5, 5, size=(POP_SIZE,)) ``` 接下来,进入迭代过程。每次迭代包括选择、交叉、变异三个步骤。 首先,根据适应度函数计算每个个体的适应度值,然后根据适应度值选择一些个体作为下一代种群的父母。这里使用轮盘赌选择算法,代码如下: ```python def select(pop, fitness): idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True, p=fitness/fitness.sum()) return pop[idx] fitness = np.array([fitness_func(x) for x in pop]) parents = select(pop, fitness) ``` 然后,对父母个体进行交叉和变异。这里采用单点交叉和随机变异,代码如下: ```python def crossover(parent, pop): if np.random.rand() < CROSS_RATE: i_ = np.random.randint(0, POP_SIZE, size=1) # 选择另外一个个体 cross_points = np.random.randint(0, 2, size=pop.shape[1]).astype(np.bool) # 选择交叉点 parent[cross_points] = pop[i_, cross_points] # 交叉操作 return parent def mutate(child): for point in range(child.shape[0]): if np.random.rand() < MUTATION_RATE: child[point] = np.random.uniform(-5, 5, size=1) return child children = np.empty_like(parents) for i in range(0, POP_SIZE, 2): p1, p2 = parents[i], parents[i+1] c1 = crossover(p1, p2) c1 = mutate(c1) children[i] = c1 c2 = crossover(p2, p1) c2 = mutate(c2) children[i+1] = c2 ``` 最后,将父母和子代合并成新的种群,并重复以上步骤,多次迭代直到达到迭代次数。最终,返回最优解。 完整代码如下: ```python import numpy as np def fitness_func(x): return x**2 + 2*x + 1 POP_SIZE = 50 # 种群大小 CROSS_RATE = 0.8 # 交叉概率 MUTATION_RATE = 0.1 # 变异概率 N_GENERATIONS = 100 # 迭代次数 pop = np.random.uniform(-5, 5, size=(POP_SIZE,)) for i in range(N_GENERATIONS): fitness = np.array([fitness_func(x) for x in pop]) parents = select(pop, fitness) children = np.empty_like(parents) for i in range(0, POP_SIZE, 2): p1, p2 = parents[i], parents[i+1] c1 = crossover(p1, p2) c1 = mutate(c1) children[i] = c1 c2 = crossover(p2, p1) c2 = mutate(c2) children[i+1] = c2 pop = np.concatenate((parents, children)) fitness = np.array([fitness_func(x) for x in pop]) idx = np.argsort(-fitness) pop = pop[idx][:POP_SIZE] best_x = pop[fitness.argmax()] best_fitness = fitness.max() print('Generation:', i) print('Best X:', best_x) print('Best Fitness:', best_fitness) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值