三种编程方式:面向过程编程(Python)、面向数据编程(TensorFlow)、面向约束编程(z3)

  • Post author:
  • Post category:python




三种编程方式

面向过程编程(Python)、面向数据编程(TensorFlow)、面向约束编程(z3)



一、面向过程编程



(一). 面向过程

面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后把这些步骤实现。



(二).案例



1. 鸡兔同笼

《孙子算经》: 今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

列方程式:设鸡有chick只,兔有rabbit只

chick + rabbit = 35

2 * chick + 4 * rabbit = 94



代码
# 1. 设置头、脚数量
head = 35
leg = 94

# 2. 循环验证鸡的数量
for chick in range(1,head):
	# 2.1 根据鸡获取兔的数量
	rabbit = head - chick
	# 2.2 验证此时鸡兔数量是否满足脚数量的要求
	if 2 * chick + 4 * rabbit == leg:
		# 2.2.1 满足要求则输出
		print('chick = %d, rabbit = %d' % (chick, rabbit))


输出
chick = 23, rabbit = 12



二、面向数据编程



(一). 机器学习

机器学习是一种统计学方法,计算机利用已有数据得出某种模型,再利用此模型预测结果。



(二). 案例



1. 历史数据集

表格文件:./dataset/Income1.csv

ID Education(受教育年限) Income(收入)
1 10 26.6588387834389
2 10.4013377926421 27.3064353457772
3 10.8428093645485 22.1324101716143
4 11.2441471571906 21.1698405046065
5 11.6454849498328 15.1926335164307


2. 训练模型、输入新数据&得出结果


代码
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv('./dataset/Income1.csv')

# 显示原始数据
# plt.scatter(data.Education, data.Income)
# plt.show()

x = data.Education
y = data.Income

model = tf.keras.Sequential() # 创建顺序模型
model.add(tf.keras.layers.Dense(1, input_shape=(1, ))) # 输出维度1(y),输入维度1 (x)
model.summary() # 显示,Dense层 -> y=ax+b方程

# 配置+编译模型
# optimizer 优化方法( adam 梯度下降算法 Adaptive momentum )
# loss 损失函数( mse 均方差 Mean Square Error )
model.compile(optimizer='adam', loss='mse')
history = model.fit(x, y, epochs=5000) # 训练15000次

print(model.predict(x)) # 使用模型出输出
print('20 year income:', model.predict(pd.Series([20]))) # 使用模型出输出


输出
20 year income: 76.098135379724



三、面向约束编程



(一). 约束求解(z3)

  • Z3是由Microsoft Research开发的高性能定理证明器。(可以理解为自动

    解方程组

    的感觉)。
  • z3是一个底层的工具,它最好是作为一个组件应用到其它需要求解逻辑公式的工具中。
  • Z3 在工业应用中实际上常见于软件验证、程序分析等。



(二). 案例



1. 约束求解(solve)

函数 Int(‘x’) 定义了一个叫x的Z3整型变量, solve 函数求解这一约束系统。上面的例子用到了两个变量 x 和 y ,还有三个约束。Z3Py和Python一样使用 = 赋值。运算符 <,<=,>,>=,==,!= 用于比较。在上述例子中,表达式 x+2*y=7 是一个Z3约束。Z3可以求解并处理该等式。



代码
from z3 import *
x = Int('x')
y = Int('y')
solve(x > 2, y < 10, x + 2*y == 7)


输出
[y = 0, x = 7]


2. 表达式化简(simplify)

合并同类项、约分、因式排序



代码
from z3 import *
x = Int('x')
y = Int('y')
print(simplify(x + y + 2*x + 3))
print(simplify(x < y + x + 2))
print(simplify(And(x + 1 >= 3, x**2 + x**2 + y**2 + 2 >= 5)))


输出
3 + 3*x + y
Not(y <= -2)
And(x >= 2, 2*x**2 + y**2 >= 3)


3. 鸡兔同笼

《孙子算经》: 今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

列方程式:设鸡有chick只,兔有rabbit只

chick + rabbit = 35

2 * chick + 4 * rabbit = 94



代码
from z3 import *

# Z3整型变量,分别代表鸡和兔的数量
chick, rabbit = Ints('chick rabbit')
# 创建求解器对象
s = Solver()

# 约束1:鸡兔同笼,至少有一只
s.add(chick >= 1, rabbit >= 1)
# 约束2:共35只动物
s.add(chick + rabbit == 35)
# 约束3:每只鸡2条腿,每只兔4条腿,共94条腿。
s.add(2 * chick + 4 * rabbit == 94)

# 输出检查结果
print(s.check())
# 输出解
print(s.model())


输出
sat
[rabbit = 12, chick = 23]



版权声明:本文为TysonSir原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。