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

三种编程方式

面向过程编程(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

IDEducation(受教育年限)Income(收入)
11026.6588387834389
210.401337792642127.3064353457772
310.842809364548522.1324101716143
411.244147157190621.1698405046065
511.645484949832815.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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值