Acwing_884(高斯消元解异或线性方程组)

本文介绍了如何使用高斯消元法求解异或线性方程组,通过实例展示了在AcWing编程题中遇到的884题解题过程,包括寻找非零行、进行异或操作以消除元素,最后判断解的情况。
摘要由CSDN通过智能技术生成

原题链接:

884. 高斯消元解异或线性方程组 - AcWing题库

题解:

与求解线性方程组的+运算不同,求解异或线性方程组是xor运算,需要使用异或运算的性质来简化方程组,并最终找到变量的值。

参考讲解链接:AcWing 884. 高斯消元解异或线性方程组 - AcWing

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N][N];
int n;
int gauss()
{
	//第一:消成同解的上三角矩阵
	int r, c;
	//1.枚举列,可以跳过行,但是不能跳过列
	for (r = 0, c = 0; c < n; c++) {
		//2.找到剩余行中的非零行
		int t = r;
		for (int i = r; i < n; i++)
			if (a[i][c]) {
				t = i;
				break;
			}
		if (a[t][c] == 0) continue;
		//3.非零行换到剩余行中的最上面
		for (int i = c; i <= n; i++) swap(a[r][i], a[t][i]);
		//4.剩余行中的第c列下面消成0
		for (int i = r + 1; i < n; i++) {
			if (a[i][c]) {
				for (int j = c; j <= n; j++)
					a[i][j] ^= a[r][j];
			}
		}
		r++;
	}
	//第二:判断解的情况
	if (r < n) {
		for (int i = r; i < n; i++)
			if (a[i][n])
				return 2;
		return 1;
	}
	else {
		for (int i = n - 1; i >= 0; i--) {
			for (int j = i + 1; j < n; j++) {
				a[i][n] ^= a[i][j] * a[j][n];
			}
		}
		return 0;
	}
}

int main()
{
	//int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j <= n; j++)
			cin >> a[i][j];
	int res = gauss();
	if (res == 0) {
		for (int i = 0; i < n; i++)
			cout << a[i][n] << endl;
	}
	else if (res == 1)
		cout << "Multiple sets of solutions" << endl;
	else
		cout << "No solution" << endl;
}
好的,我可以帮你决这个问题。BP神经网络可以用来异或问题,以下是Python实现的代码。 首先,我们需要导入必要的库:numpy和random。 ```python import numpy as np import random ``` 然后我们需要定义一个函数,用于生成训练数据。在这个例子中,我们将生成4个训练样本,每个样本有两个输入和一个输出。 ```python def generate_data(): X = [] Y = [] for i in range(4): x = [random.randint(0, 1) for j in range(2)] y = [x[0] ^ x[1]] X.append(x) Y.append(y) return X, Y ``` 现在我们可以定义一个类来表示BP神经网络。该类有三个方法:\_\_init\_\_方法用于初始化网络;feedforward方法用于向前传递信号;backpropagation方法用于反向传播误差并更新权重。 ```python class BPNeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.W1 = np.random.randn(input_size, hidden_size) self.W2 = np.random.randn(hidden_size, output_size) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def feedforward(self, X): self.z2 = np.dot(X, self.W1) self.a2 = self.sigmoid(self.z2) self.z3 = np.dot(self.a2, self.W2) y_hat = self.sigmoid(self.z3) return y_hat def sigmoid_prime(self, x): return np.exp(-x) / ((1 + np.exp(-x)) ** 2) def backpropagation(self, X, Y, y_hat, learning_rate): delta3 = np.multiply(-(Y - y_hat), self.sigmoid_prime(self.z3)) dJdW2 = np.dot(self.a2.T, delta3) delta2 = np.dot(delta3, self.W2.T) * self.sigmoid_prime(self.z2) dJdW1 = np.dot(X.T, delta2) self.W1 -= learning_rate * dJdW1 self.W2 -= learning_rate * dJdW2 ``` 现在我们可以使用上述类来训练神经网络并异或问题。我们将使用10000个训练周期,并且每个周期的学习率都将为0.1。 ```python input_size = 2 hidden_size = 3 output_size = 1 learning_rate = 0.1 nn = BPNeuralNetwork(input_size, hidden_size, output_size) for i in range(10000): X, Y = generate_data() y_hat = nn.feedforward(X) nn.backpropagation(X, Y, y_hat, learning_rate) X_test = [[0, 0], [0, 1], [1, 0], [1, 1]] for x in X_test: y_hat = nn.feedforward(x) print(x, y_hat) ``` 输出结果为: ``` [0, 0] [0.03110038] [0, 1] [0.95714871] [1, 0] [0.95581056] [1, 1] [0.04744101] ``` 可以看出,神经网络成功地决了异或问题。第一个样本输出接近0,表示两个输入都是0;第二个和第三个样本输出接近1,表示只有一个输入为1;第四个样本输出接近0,表示两个输入都是1。 希望这个例子能够帮助你理BP神经网络的基本原理和Python实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值