AND Gate 2x:
epoch: 1, w0= 1 | w1= 0.5 | w2= 0.5
epoch: 2, w0= 0 | w1= 1 | w2= 0.5
epoch: 3, w0= 0 | w1= 1.5 | w2= 0.5
epoch: 4, w0= -1 | w1= 1.5 | w2= 0.5
epoch: 5, w0= -1 | w1= 1.5 | w2= 1
epoch: 6, w0= -1 | w1= 1.5 | w2= 1.5
epoch: 7, w0= -2 | w1= 1.5 | w2= 1

سورس کد

<?php
defined
('BASEPATH') OR exit('No direct script access allowed');

class 
Perceptron extends CI_Controller {


    public 
$learningRate 0.5;
    
//public $output;
    
public $bias  0;
    public 
$vectorLength 2;
    public 
$weightVector// آرایه تصادفی ها به تعداد vectorLength 
    //public $epoch = 0;
    //public $epochLimit = 10000;

    
public function index()
    {
        echo 
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';

        
$this->setWeightRandom();
        
$epoch 0;
        
// AND Gate
        //مثال آموزشی
        
$data = [
            [[
00], 0],
            [[
01], 0],
            [[
10], 0],
            [[
11], 1],
        ];
        
        
$satisfied false;
        
$color="black";
        echo 
"<b>AND Gate 2x:</b> <br/>";
        while (!
$satisfied)
        {
            foreach (
$data as $trainSample)
            {
                
$this->train($trainSample[0], $trainSample[1]);
            }

            
//test weights
            
$status true;
            foreach (
$data as $trainSample)
            {
                if (
$this->test($trainSample[0]) != $trainSample[1])
                {
                    
$status false;
                }
            }
            if (
$status == true)
            {
                
$satisfied true;
            }
            
            
$epoch++;
            
            if(
$satisfied==true)
                
$color"red";
            
            echo 
"<span style='color:$color'>epoch: $epoch,  w0= ".$this->bias " | w1= ".$this->weightVector[0]." | w2= "$this->weightVector[1]. "</span><br/>" ;
            
            
        }
        

        echo 
'<div dir="ltr">';
echo 
'<h4>سورس کد</h4>';
        echo 
show_source(__FILE__);
    }
    
    

    private function 
train($input$result)
    {
        
// Test if current weights are Valid
        // Do test on input
        
        
$output $this->test($input);
        if (
$output != $result)
        {
            
//we need to change weights
            
for ($i 0$i $this->vectorLength$i++)
            {
                
//wi + 1/2(result - output)*xi
                
$this->weightVector[$i] =
                    
$this->weightVector[$i] + $this->learningRate * ((int)$result - (int)$output) * $input[$i];
            }
        }
        
        
$this->bias $this->bias + ((int)$result - (int)$output);
    }

    private function 
test($input)
    {
        
// return w0 + x1w1 + x2w2 
        
$testResult $this->dotVectors($this->weightVector$input) + $this->bias;
        return 
$testResult 0;
    }


    private function 
dotVectors($vector1$vector2)
    {
        
//وزن های تصادفی را با ورودی ها جمع میکند و برمیگرداند
        
$total 0;
        
$dim count($vector1);
        for (
$i 0$i $dim$i++) {
            
$total += $vector1[$i] * $vector2[$i];
        }
        return 
$total;
    }


    private function 
setWeightRandom()
    {
        
// وزن های تصادفی به W ها میدهد
        
for ($i 0$i $this->vectorLength$i++) {
            
$this->weightVector[$i] = rand(01);
        }
    }
}
1