三种编程方式
面向过程编程(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]