#include <iostream>
#include <vector>
// Tu wklejam klasę Perceptron z poprzedniego przykładu
class Perceptron {
private:
std::vector<double> weights;
double bias;
double learning_rate;
public:
Perceptron(int input_size, double learning_rate)
: weights(input_size, 0.0), bias(0.0), learning_rate(learning_rate) {}
int predict(const std::vector<double>& inputs) {
double suma = bias;
for (size_t i = 0; i < weights.size(); ++i) {
suma += weights[i] * inputs[i];
}
return (suma >= 0) ? 1 : 0;
}
void train(const std::vector<std::vector<double>>& inputs,
const std::vector<int>& labels,
int epochs) {
for (int epoch = 0; epoch < epochs; ++epoch) {
for (size_t i = 0; i < inputs.size(); ++i) {
int prediction = predict(inputs[i]);
int error = labels[i] - prediction;
for (size_t j = 0; j < weights.size(); ++j) {
weights[j] += learning_rate * error * inputs[i][j];
}
bias += learning_rate * error;
}
}
}
void printWeightsAndBias() const {
std::cout << "Wagi: ";
for (double w : weights) {
std::cout << w << " ";
}
std::cout << "\nBias: " << bias << std::endl;
}
};
int main() {
// Tworzymy perceptron z 2 wejściami i współczynnikiem uczenia 0.1
Perceptron p(2, 0.1);
// Dane treningowe (wejścia)
std::vector<std::vector<double>> training_inputs = {
{0, 0},
{0, 1},
{1, 0},
{1, 1}
};
// Etykiety zgodne z funkcją AND, ale wyjścia to 0 lub 2 (zgodnie z Twoim kodem)
std::vector<int> training_labels = {0, 0, 0, 1};
// Trenujemy perceptron przez 10 epok
p.train(training_inputs, training_labels, 10);
// Wypisujemy wagi i bias po treningu
p.printWeightsAndBias();
// Testujemy perceptron na danych treningowych
std::cout << "Test predykcji:" << std::endl;
for (const auto& input : training_inputs) {
int result = p.predict(input);
std::cout << "(" << input[0] << ", " << input[1] << ") -> " << result << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKLy8gVHUgd2tsZWphbSBrbGFzxJkgUGVyY2VwdHJvbiB6IHBvcHJ6ZWRuaWVnbyBwcnp5a8WCYWR1CgpjbGFzcyBQZXJjZXB0cm9uIHsKcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gd2VpZ2h0czsKICAgIGRvdWJsZSBiaWFzOwogICAgZG91YmxlIGxlYXJuaW5nX3JhdGU7CgpwdWJsaWM6CiAgICBQZXJjZXB0cm9uKGludCBpbnB1dF9zaXplLCBkb3VibGUgbGVhcm5pbmdfcmF0ZSkKICAgICAgICA6IHdlaWdodHMoaW5wdXRfc2l6ZSwgMC4wKSwgYmlhcygwLjApLCBsZWFybmluZ19yYXRlKGxlYXJuaW5nX3JhdGUpIHt9CgogICAgaW50IHByZWRpY3QoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgaW5wdXRzKSB7CiAgICAgICAgZG91YmxlIHN1bWEgPSBiaWFzOwogICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd2VpZ2h0cy5zaXplKCk7ICsraSkgewogICAgICAgICAgICBzdW1hICs9IHdlaWdodHNbaV0gKiBpbnB1dHNbaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAoc3VtYSA+PSAwKSA/IDEgOiAwOwogICAgfQoKICAgIHZvaWQgdHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZG91YmxlPj4mIGlucHV0cywKICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgbGFiZWxzLAogICAgICAgICAgICAgICBpbnQgZXBvY2hzKSB7CiAgICAgICAgZm9yIChpbnQgZXBvY2ggPSAwOyBlcG9jaCA8IGVwb2NoczsgKytlcG9jaCkgewogICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0cy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgaW50IHByZWRpY3Rpb24gPSBwcmVkaWN0KGlucHV0c1tpXSk7CiAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBsYWJlbHNbaV0gLSBwcmVkaWN0aW9uOwoKICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgd2VpZ2h0cy5zaXplKCk7ICsraikgewogICAgICAgICAgICAgICAgICAgIHdlaWdodHNbal0gKz0gbGVhcm5pbmdfcmF0ZSAqIGVycm9yICogaW5wdXRzW2ldW2pdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYmlhcyArPSBsZWFybmluZ19yYXRlICogZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdm9pZCBwcmludFdlaWdodHNBbmRCaWFzKCkgY29uc3QgewogICAgICAgIHN0ZDo6Y291dCA8PCAiV2FnaTogIjsKICAgICAgICBmb3IgKGRvdWJsZSB3IDogd2VpZ2h0cykgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgdyA8PCAiICI7CiAgICAgICAgfQogICAgICAgIHN0ZDo6Y291dCA8PCAiXG5CaWFzOiAiIDw8IGJpYXMgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICAvLyBUd29yenlteSBwZXJjZXB0cm9uIHogMiB3ZWrFm2NpYW1pIGkgd3Nww7PFgmN6eW5uaWtpZW0gdWN6ZW5pYSAwLjEKICAgIFBlcmNlcHRyb24gcCgyLCAwLjEpOwoKICAgIC8vIERhbmUgdHJlbmluZ293ZSAod2VqxZtjaWEpCiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxkb3VibGU+PiB0cmFpbmluZ19pbnB1dHMgPSB7CiAgICAgICAgezAsIDB9LAogICAgICAgIHswLCAxfSwKICAgICAgICB7MSwgMH0sCiAgICAgICAgezEsIDF9CiAgICB9OwoKICAgIC8vIEV0eWtpZXR5IHpnb2RuZSB6IGZ1bmtjasSFIEFORCwgYWxlIHd5asWbY2lhIHRvIDAgbHViIDIgKHpnb2RuaWUgeiBUd29pbSBrb2RlbSkKICAgIHN0ZDo6dmVjdG9yPGludD4gdHJhaW5pbmdfbGFiZWxzID0gezAsIDAsIDAsIDF9OwoKICAgIC8vIFRyZW51amVteSBwZXJjZXB0cm9uIHByemV6IDEwIGVwb2sKICAgIHAudHJhaW4odHJhaW5pbmdfaW5wdXRzLCB0cmFpbmluZ19sYWJlbHMsIDEwKTsKCiAgICAvLyBXeXBpc3VqZW15IHdhZ2kgaSBiaWFzIHBvIHRyZW5pbmd1CiAgICBwLnByaW50V2VpZ2h0c0FuZEJpYXMoKTsKCiAgICAvLyBUZXN0dWplbXkgcGVyY2VwdHJvbiBuYSBkYW55Y2ggdHJlbmluZ293eWNoCiAgICBzdGQ6OmNvdXQgPDwgIlRlc3QgcHJlZHlrY2ppOiIgPDwgc3RkOjplbmRsOwogICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dCA6IHRyYWluaW5nX2lucHV0cykgewogICAgICAgIGludCByZXN1bHQgPSBwLnByZWRpY3QoaW5wdXQpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiKCIgPDwgaW5wdXRbMF0gPDwgIiwgIiA8PCBpbnB1dFsxXSA8PCAiKSAtPiAiIDw8IHJlc3VsdCA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K