using System.Collections.Generic;
public const int SNumber = 16;
public const int SNumber_p = SNumber + 1;
public const int ANumber = 10;
public const int ANumber_p = ANumber + 1;
public const int letterNumber = 2;
public const int letterNumber_p = letterNumber + 1;
public const double step = 0.1;
m_R = new double [ ANumber_p ];
m_w = new double [ ANumber_p, SNumber_p ];
m_letter1 = new bool [ SNumber_p ];
m_letter2 = new bool [ SNumber_p ];
m_letterToA_Input = new double[ letterNumber_p, ANumber_p ];
m_tempWToT = new List< double[] >();
m_UInLetter1ToT = new List< double >();
m_UInLetter2ToT = new List< double >();
m_isFirsts = new List< bool >();
double[] temp = new double[] { 0.0, 0.2, 0.3, 0.8, 0.4, 0.3, 0.1, 0.4, 0.8, 0.3, 0.7 };
for ( int i = 1; i < ANumber_p; ++i )
double [] temp1 = new double[] { 0.0, 0.8, 0.2, 0.7, 0.7, 0.3, 0.5, 0.5, 0.5, 0.3, 0.3, 0.3, 0.1, 0.7, 0.7, 0.5, 0.7 };
double [] temp2 = new double[] { 0.0, 0.6, 0.7, 0.1, 0.4, 0.4, 0.7, 0.8, 0.6, 0.3, 0.1, 0.3, 0.8, 0.4, 0.5, 0.1, 0.1 };
double [] temp3 = new double[] { 0.0, 0.1, 0.3, 0.7, 0.4, 0.7, 0.7, 0.2, 0.4, 0.2, 0.5, 0.1, 0.4, 0.7, 0.5, 0.4, 0.3 };
double [] temp4 = new double[] { 0.0, 0.2, 0.6, 0.6, 0.7, 0.8, 0.3, 0.3, 0.2, 0.2, 0.2, 0.5, 0.2, 0.3, 0.6, 0.2, 0.6 };
double [] temp5 = new double[] { 0.0, 0.2, 0.2, 0.8, 0.4, 0.8, 0.1, 0.8, 0.8, 0.6, 0.5, 0.2, 0.7, 0.7, 0.5, 0.8, 0.7 };
double [] temp6 = new double[] { 0.0, 0.6, 0.1, 0.7, 0.6, 0.8, 0.3, 0.2, 0.7, 0.8, 0.6, 0.2, 0.5, 0.3, 0.8, 0.2, 0.5 };
double [] temp7 = new double[] { 0.0, 0.4, 0.4, 0.3, 0.5, 0.5, 0.1, 0.3, 0.1, 0.6, 0.6, 0.1, 0.3, 0.1, 0.5, 0.4, 0.6 };
double [] temp8 = new double[] { 0.0, 0.3, 0.6, 0.4, 0.3, 0.7, 0.4, 0.6, 0.8, 0.1, 0.2, 0.4, 0.3, 0.7, 0.3, 0.5, 0.7 };
double [] temp9 = new double[] { 0.0, 0.4, 0.6, 0.3, 0.3, 0.2, 0.3, 0.3, 0.6, 0.6, 0.6, 0.8, 0.2, 0.2, 0.7, 0.6, 0.3 };
double [] temp10 = new double[] { 0.0, 0.3, 0.5, 0.3, 0.6, 0.4, 0.8, 0.6, 0.8, 0.6, 0.4, 0.4, 0.3, 0.5, 0.1, 0.2, 0.4 };
AOChooser aoChooser = new AOChooser( this );
double[] temp = new double[ ANumber_p ];
for ( int i = 1; i < ANumber_p; ++i )
KeyValuePair< double, double > inRs = calculateInR( temp );
double sum = inRs.Key + inRs.Value;
private void copy( double[] _a, double[,] _target, int _line )
for ( int i = 1; i < length; ++i )
_target[ _line, i ] = _a[ i ];
private void initLetters()
private void initLetterToA_Input()
for ( int i = 1; i < ANumber_p; ++i )
for ( int j = 1; j < SNumber_p; ++j )
Sum += toDouble( m_letter1[ j ] ) * m_w[ i, j ] ;
m_letterToA_Input[ letter, i ] = Sum;
for ( int i = 1; i < ANumber_p; ++i )
for ( int j = 1; j < SNumber_p; ++j )
Sum += toDouble( m_letter2[ j ] ) * m_w[ i, j ] ;
m_letterToA_Input[ letter, i ] = Sum;
private void initUInLetterToT()
UtoTExecutor executor = new UtoTExecutor( this );
public static double toDouble( bool _v )
public KeyValuePair< double, double > calculateInR( double [] _w )
for ( int i = 1; i < ANumber_p; ++i )
inR1 += toDouble( isOpenA( m_letterToA_Input[ 1, i ] ) ) * _w[ i ];
for ( int i = 1; i < ANumber_p; ++i )
inR2 += toDouble( isOpenA( m_letterToA_Input[ 2, i ] ) ) * _w[ i ];
return new KeyValuePair< double, double >( inR1, inR2 );
public bool isOpenA( double _v )
public bool isSufficientR( double _r, bool _isFirstLetter )
public bool[] m_letter1, m_letter2;
public double [,] m_letterToA_Input;
public List< double[] > m_tempWToT;
public List< double > m_UInLetter1ToT;
public List< double > m_UInLetter2ToT;
public List< bool > m_isFirsts;
public Printer( Percentron _percentron )
m_percentron = _percentron;
ReportPrinter reportPrinter = new ReportPrinter( Percentron.ANumber_p, Percentron.SNumber_p );
for ( int i = 1; i < Percentron.SNumber_p; ++i )
StringBuilder sb = new StringBuilder();
sb.AppendFormat( "S{0}", i );
reportPrinter.m_data[ 0, i ] = sb.ToString();
for ( int i = 1; i < Percentron.ANumber_p; ++i )
reportPrinter.m_data[ i, 0 ] = "A" + i.ToString();
for ( int j = 1; j < Percentron.SNumber_p; ++j )
reportPrinter.m_data[ i, j ] = m_percentron.m_w[ i, j ].ToString();
public void printLetterToA_Input()
ReportPrinter reportPrinter = new ReportPrinter( Percentron.letterNumber_p, Percentron.ANumber_p );
for ( int i = 1; i < Percentron.ANumber_p; ++i )
reportPrinter.m_data[ 0, i ] = "A" + i;
for ( int i = 1; i < Percentron.letterNumber_p; ++i )
reportPrinter.m_data[ i, 0 ] = "letter" + i.ToString();
for ( int j = 1; j < Percentron.ANumber_p; ++j )
reportPrinter.m_data[ i, j ] = m_percentron.m_letterToA_Input[ i, j ].ToString();
public void printUInLetterToT()
ReportPrinter reportPrinter = new ReportPrinter( Percentron.ANumber_p + 2, m_percentron.m_tempWToT.Count + 1 );
for ( int i = 0; i < m_percentron.m_tempWToT.Count; ++i )
bool firstLetter = m_percentron.m_isFirsts[ i ];
letter = ( firstLetter ) ? "f" : "s" ;
reportPrinter.m_data[ 0, reportIndex ] = "t" + i.ToString() + letter;
for ( int i = 1; i < Percentron.ANumber_p; ++i )
reportPrinter.m_data[ i, 0 ] = "w" + i.ToString();
reportPrinter.m_data[ Percentron.ANumber_p + 0, 0 ] = "UR letter1";
reportPrinter.m_data[ Percentron.ANumber_p + 1, 0 ] = "UR letter2";
for ( int i = 0; i < m_percentron.m_tempWToT.Count; ++i )
for ( int j = 1; j < Percentron.ANumber_p; ++j )
bool minusSymbol = false;
bool isFirstLetterV = m_percentron.m_isFirsts[ i ];
int letter = ( isFirstLetterV )
if ( !m_percentron.isOpenA( m_percentron.m_letterToA_Input[ letter, j ] ) )
reportPrinter.m_data[ j, reportIndex ] = "-";
reportPrinter.m_data[ j, reportIndex ] = m_percentron.m_tempWToT[ i ][ j ].ToString();
for ( int i = 0; i < m_percentron.m_tempWToT.Count; ++i )
reportPrinter.m_data[ Percentron.ANumber_p + 0, reportIndex ] = m_percentron.m_UInLetter1ToT[ i ].ToString();
reportPrinter.m_data[ Percentron.ANumber_p + 1, reportIndex ] = m_percentron.m_UInLetter2ToT[ i ].ToString();
Console.WriteLine( "AO = {0}", m_percentron.m_OA );
Console.WriteLine( "OR = {0}", m_percentron.m_OR );
private Percentron m_percentron;
public class ReportPrinter
public ReportPrinter( int _height, int _length )
m_data = new string[ m_height, m_length ];
for ( int i = 0; i < m_length; ++i )
int maxColumnElementLength = getMaxElementLength( i );
normalizeColumn( i, maxColumnElementLength );
public int getMaxElementLength( int _columnIndex )
for ( int i = 0; i < m_height; ++i )
int elementLength = m_data[ i, _columnIndex ].Length;
if ( maxLength < elementLength )
maxLength = elementLength;
public void normalizeColumn( int _columnIndex, int _maxColumnElementLength )
for ( int i = 0; i < m_height; ++i )
string element = m_data[ i, _columnIndex ];
int elementLength = element.Length;
int lengthDifference = _maxColumnElementLength - elementLength;
if ( lengthDifference == 0 )
string spaces = new String( ' ', lengthDifference );
StringBuilder sb = new StringBuilder();
sb.AppendFormat( "{0}{1}", element, spaces );
m_data[ i, _columnIndex ] = sb.ToString();
for ( int i = 0; i < m_height; ++i )
for ( int j = 0; j < m_length; ++j )
Console.Write( "{0}\t", m_data[ i, j ] );
for ( int i = 0; i < m_height; ++i )
for ( int j = 0; j < m_length; ++j )
public AOChooser( Percentron _percentron )
m_percentron = _percentron;
HashSet< double > variants = new HashSet< double >();
int allNeuronsA = Percentron.letterNumber * Percentron.ANumber;
for ( int i = 1; i < Percentron.letterNumber_p; ++i )
for ( int j = 1; j < Percentron.ANumber_p; ++j )
variants.Add( m_percentron.m_letterToA_Input[ i, j ] );
int optimalNeuronsA = allNeuronsA * 7 / 10;
int maxGoodActiveNeuronsA = 0;
int minDiff = allNeuronsA;
double currentVariant = 0.0 ;
foreach ( double variant in variants )
double variant_p = variant + min;
int activeNeuronsCount = 0;
int goodActiveNeuronsCount = 0;
int tempGoodActiveNeuronsCount1 = 0;
int tempGoodActiveNeuronsCount2 = 0;
for ( int i = 1; i < Percentron.ANumber_p; ++i )
bool active1 = m_percentron.m_letterToA_Input[ letter, i ] >= variant_p;
bool active2 = m_percentron.m_letterToA_Input[ letter, i ] >= variant_p;
if ( active1 && ( !active2 ) )
++tempGoodActiveNeuronsCount1;
if ( ( !active1 ) && active2 )
++tempGoodActiveNeuronsCount2;
Math.Min( tempGoodActiveNeuronsCount1, tempGoodActiveNeuronsCount2 );
int diff = (int)Math.Abs( (double)optimalNeuronsA - activeNeuronsCount );
if ( goodActiveNeuronsCount > maxGoodActiveNeuronsA )
maxGoodActiveNeuronsA = goodActiveNeuronsCount;
currentVariant = variant_p;
else if ( goodActiveNeuronsCount == 0 )
maxGoodActiveNeuronsA = goodActiveNeuronsCount;
currentVariant = variant_p;
if ( currentVariant == 0.0 )
Console.WriteLine( "maxGoodActiveNeuronsA = {0}", maxGoodActiveNeuronsA );
m_percentron.m_OA = currentVariant;
public class UtoTExecutor
public UtoTExecutor( Percentron _percentron )
m_percentron = _percentron;
for ( int i = 0; i < iters; ++i )
double[] temp = new double[ Percentron.ANumber_p ];
for ( int i = 1; i < Percentron.ANumber_p; ++i )
temp[ i ] = m_percentron.m_R[ i ];
KeyValuePair< double, double > inRs = m_percentron.calculateInR( temp );
m_percentron.m_tempWToT.Add( temp );
m_percentron.m_UInLetter1ToT.Add( inRs.Key );
m_percentron.m_UInLetter2ToT.Add( inRs.Value );
m_percentron.m_isFirsts.Add( m_firstLetter );
return isSufficientR( false ) && isSufficientR( true );
public void makeIteration()
double[] temp = new double[ Percentron.ANumber_p ];
for ( int i = 1; i < Percentron.ANumber_p; ++i )
temp[ i ] = m_percentron.m_tempWToT[ m_percentron.m_tempWToT.Count - 1 ][ i ];
m_percentron.m_isFirsts.Add( m_firstLetter );
for ( int j = 1; j < Percentron.ANumber_p; ++j )
if ( m_percentron.isOpenA( m_percentron.m_letterToA_Input[ getLetter(), j ] ) )
temp[ j ] = changeWithRange( temp[ j ], Percentron.step, m_firstLetter );
KeyValuePair< double, double > inRs = m_percentron.calculateInR( temp );
m_percentron.m_tempWToT.Add( temp );
m_percentron.m_UInLetter1ToT.Add( inRs.Key );
m_percentron.m_UInLetter2ToT.Add( inRs.Value );
public void adjustLetter()
public void switchLetter()
m_firstLetter = !m_firstLetter;
private double changeWithRange( double _n, double _step, bool _isFirstLetter )
double difference = m_percentron.m_OR - getUR();
bool shouldIncrease = difference > 0.0;
public bool isSufficientR( bool _isFirstLetter )
? m_percentron.isSufficientR( m_percentron.m_UInLetter1ToT[ m_percentron.m_UInLetter1ToT.Count - 1 ], _isFirstLetter )
: m_percentron.isSufficientR( m_percentron.m_UInLetter2ToT[ m_percentron.m_UInLetter2ToT.Count - 1 ], _isFirstLetter )
public bool isSufficientR()
return isSufficientR( m_firstLetter );
? m_percentron.m_UInLetter1ToT[ m_percentron.m_UInLetter1ToT.Count - 1 ]
: m_percentron.m_UInLetter2ToT[ m_percentron.m_UInLetter2ToT.Count - 1 ]
private Percentron m_percentron;
private bool m_firstLetter;
public static void Main()
Percentron percentron = new Percentron();
Printer printer = new Printer( percentron );
printer.printLetterToA_Input();
printer.printUInLetterToT();
Console.WriteLine("Hello World");