Портфель инвестиционных проектов в нефтедобывающей компании

Чистый дисконтированный доход, генетический алгоритм. Объектно-ориентированное программирование, основы баз данных. Инструментальные методы моделирования системы инвестиционной стратегии. Алгоритм и математическая модель оценки инвестиционного портфеля.

Рубрика Финансы, деньги и налоги
Вид дипломная работа
Язык русский
Дата добавления 28.08.2016
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

4. О программе - открывает форму "Oprogramm"

Далее показана структура верхней части формы. (Рис. 16)

Рис. 16. Верхняя часть формы "Glavnoie"

Более подробно о всех этих формах будет рассказано ниже.

Oprogramm

Данная форма несет в себе информативный характер. В ней находится логотип приложения и информация о нем.

Внизу можно увидеть интерфейс формы Oprogramm.(Рис. 17)

Рис. 17. Интерфейс формы "Oprogramm"

Nastroiki

Форма "Nastroiki" создана для определения параметров нефтяной компании и Банковского сектора. Также на данной форме определятся год, на момент которого нужно максимизировать целевую функцию. Данная форма состоит из пяти Textbox-ов и 5 Label-ов.

Каждый textbox соответствует одному параметру экзогенных данных.

Далее представлен интерфейс формы "Nastroiki". (Рис. 18)

Рис. 18. Интерфейс формы "Nastroiki"

Как следует из рисунка 18, благодаря форме "Nastroiki" пользователь может изменить следующие параметры c помощью соответственного textbox -а:

1. YrtextBox - год, на момент, которого нужно найти максимум суммарного NPV.

2. MntextBox - денежные средства, которые необходимо вложить в эти проекты.

3. DeptextBox - депозитная ставка процента.

4. KredtextBox - кредитная ставка банка.

5. DisctextBox - ставка дисконтирования.

При загрузке формы данные заполняются в форму автоматически из класса "Ekzogen". Для предотвращения ошибок при вводе данных пользователем в данном классе реализован отлов ошибок.

Далее представлена форма сообщения об ошибке при вводе. (Рис. 19)

Рис. 19 Сообщение об ошибке.

Dannie

Форма "Dannie" служит для показа исходных данных о проектах. Данные берутся из локальной базы данных.

Элементами данной формы служат таблица с данными и кнопка "Ok", которая закрывает эту форму и возвращается на главную.

Далее представлен интерфейс формы "Dannie". (Рис. 20)

Рис. 20. Интерфейс формы "Dannie".

NastroikiGA

Данная форма служит для изменения параметров генетического алгоритма. Она состоит из следующих textbox-ов:

1. verchrom - задает вероятность мутации хромосомы.

2. vergene - пользователь определяет вероятность мутации гена.

3. Itercount - количество итераций, которое должно совершить приложение, чтобы закончиться

4. Chromoscount - количество особей в популяции.

Далее показан интерфейс формы "NastroikiGA". (Рис. 21)

Рис. 21. Интерфейс формы "NastroikiGA".

Также, как и в форме "Nastroiki", при загрузке формы данные по умолчанию заполняются в нее автоматически из класса "Ekzogen" и производится отлов ошибок.

Далее представлена форма сообщения об ошибке при вводе на форме "NastroikaGA". (Рис. 22)

Рис. 22 сообщения об ошибке при вводе на форме "NastroikaGA".

Result

Форма "Result" служит для показа информации, найденной в приложении. Данные отображаются в виде таблицы, в которой представлена информация об особи.

Таблица состоит из трех столбцов:

1. Проект - в данной строке записывается номер проекта.

2. Год начала - год начала проекта.

3. Вариант проекта - вариант проекта, который был выбран.

Каждая строка в этой таблицы соответствует одному проекту. Кнопка Ок служит для возврата на главную форму.

Далее приведен интерфейс формы "Result". (Рис. 23)

Рис. 23. Интерфейс формы "Result".

Genetic

Класс "Genetic" является ключевым классом разработанного приложения. В этом классе написаны методы для генетического алгоритма. Эти методы написаны таким образом, что могут с легкостью быть преобразованы для решения других задач. Все методы в данном классе являются статичными и могут быть вызваны из любой части программы.

В классе "Genetic" находятся следующие методы:

1. Generacia - данный метод генерирует случайным образом начальную популяцию. На вход метода подается массив из хромосом, количество проектов и год максимизации суммарных дисконтированных денежных средств компании.

Далее представлена блок-схема алгоритма генерации начальной популяции реализованного в программе. (Рис. 23)

Рис. 24. Блок - схема генерации начальной популяции.

2. Parentchoose - метод выбора родителей для последующего скрещивания. На вход метода подается пустой массив хромосом, а также текущая популяция в виде массива из особей. Программа обрабатывает данные и заполняет пустой массив особями способом, выбранным в главе 2.

3. Crossing - данная функция на входе принимает массив хромосом родителей, полученных из метода "Parentchoose" и создает новый пул хромосом с помощью алгоритма, выбранного в главе 2.

4. Mutation - в данном методе производится мутация хромосом по заданным вероятностям мутации.

5. Prigodnost - рассчитываются значения NPV для всех членов массива с помощью метода, реализованного в классе "Chromosome". На вход метода подается массив хромосом.

6. Otbor - в данном случае осуществляется отбор хромосом из массива родителей и потомков, которые войдут в новую популяцию способом, описанным во второй главе.

Варианты использования

После запуска приложения перед пользователем появляется главный экран программы. На данной форме пользователь может запустить оптимизационный алгоритм, после чего он увидит результаты работы алгоритма в реальном времени на графике. При обнаружении удовлетворяющего результата, он может с помощью кнопки "Остановить" прервать работу алгоритма поиска максимума.

Далее представлен главный экран приложения во время работы алгоритма поиска экстремума. (Рис.25)

Рис. 25. Интерфейс главного экрана во время работы алгоритма

Для просмотра исходных данных и проверки успешного подключения к локальной базе, пользователь может нажать на кнопку "Данные". Откроется окно, где будет располагаться таблица с данными из базы данных. (Рис.20)

Для изменения настроек Генетического алгоритма пользователь должен нажать на кнопку "Настройки ГА", находящуюся в меню баре. Откроется окно где он сможет внести изменения. (Рис.21) После внесения изменений в настройках, нажатием кнопки "ОК" пользователь переходит на главный экран приложения, где может запустить программу с новыми настройками.

С помощью кнопки "Настройки", пользователь перейдет на новую форму, где сможет изменить параметры, при которых нужно найти максимум суммарного NPV. (Рис.18) Внесенные изменения моментально вступят в силу и повлияют на результаты, полученные во время следующего запуска алгоритма.

Результат работы алгоритма пользователь может увидеть, нажав на кнопку "Наилучшее портфолио" (Рис.23)

Далее представлена диаграмма вариантов использования для пользователя. (Рис.26)

Рис.26, Диаграмма вариантов использования для пользователя

Выводы к главе 3

В третьей главе нами было дано описание базы данных и показана структура программной реализации. В ней были описаны все главные формы и классы, а также используемые в них переменные. Кроме того, нами был продемонстрирован интерфейс работы приложения и блок-схемы наиболее значимых частей алгоритма.

Заключение

Данная Выпускная квалификационная работа посвящена нахождению оптимального портфеля инвестиционных проектов с помощью планирования денежных вкладов по годам в эти проекты в целях максимизации прибыли нефтедобывающего предприятия при ограниченном количестве денежных средств.

Нами была построена математическая модель подсчета суммарного NPV для инвестиционного портфеля нефтедобывающей компании и разработан генетический алгоритм для нахождения оптимума для этой функции.

Эмпирическим путем было доказано превосходство построенного модифицированного генетического алгоритма над классическим его типом. Кроме того, нами была продемонстрирована статичность работы программы, реализованной данным способом. В программе нами был использован интуитивно понятный графический интерфейс, а также была представлена наглядная демонстрация работы приложения в виде графика.

Среднее время работы программы для 20000 итераций равно 5 минутам.

Список использованной литературы

1. Акопов А.С. Системно-динамический подход в управлении инвестиционной деятельностью нефтяной компании, Аудит и финансовый анализ. 2006. № 2. С. 153-188.

2. Бекларян Л.А., Крученов М.Б. Финансовый менеджмент. М.: 2008. 58 с.

3. Жданов И.Ю. Чистая текущая стоимость NPV. Достоинства и недостатки.

4. Карпова И.П. Базы данных. Учебное пособие, М., 2009.

5. Панченко Т.В. Генетический алгоритм, Издательский дом "Астраханский университет", 2007. - 88 c.

6. Холт Н. Роберт, Барнес Б. Сет., Планирование инвестиций, М.: Дело,1994. - 120 с.

7. Herbert Schildt C# 4.0: The Complete Reference, 2010 Chapter 2 pp. 11-37

8. Программирование многопоточности, 14.06.2004

9. Array.Sort. - URL: https://msdn.microsoft.com/library/6tf1f0bc(v=vs.110).aspx (Дата обращения 19.05.2016)

10. Bierman H. Jr., Smidt S. The Capital Budgeting Decision. 9th ed. New York and London: Routledge, 2007.

11. Genetic Algorithms. - URL: http://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol1/hmw/article1.html#top (Дата обращения: 27.04.2016)

12. Herrera F., Lozan M., Verdegay J.L. Tackling Real-Coded Genetic Algorithms: Operators and Tools for Behavioural Analysis, paper 1998-08, Volume 12, Issue 4. P. 265-319.

13. Herrera F., Lozano M., Verdegay J.L. Tackling real-coded Genetic algorithms: operators and tools for the behaviour analysis // Artificial Intelligence Review, Vol. 12, No. 4, 1998. - P. 265-319.

14. Mitchell M. Introduction of genetic Algorithms, Fifth printing, 1999.

15. Moslem Shahsavar , Seyed Taghi Akhavan Niaki , Amir Abbas Najafi . An efficient genetic algorithm to maximize net present value of project payments under inflation and bonus-penalty policy in resource investment problem, 2010 Elsevier Ltd. P. 1-8.

16. Multithreaded Applications (C#). - URL: https://msdn.microsoft.com/en-us/library/mt679047.aspx (Дата обращения 19.05.2016)

17. Multithreaded Applications. - URL: https://msdn.microsoft.com/ library/ck8bc5c6.aspx (Дата обращения 19.05.2016)

18. Nirosh. Introduction to Object Oriented Programming Concepts (OOP) and More, 2015 URL: http://www.codeproject.com/Articles/22769/Introduction-to-Object-Oriented-Programming-Concep (Дата обращения 17.05.2016).

URL: http://www.realcoding.net/article/view/1738 (Дата обращения 19.05.2016)

19. IBDBLOGGER. Methods to Calculate Discount Rates - DCF: January 20,2009

20. Smith B. Object-Oriented Programming, 2015. P. 1-23.

21. Wright A. Genetic algorithms for real parameter optimization // Foundations of Genetic Algorithms, Vol. 1. - 1991. - P. 205-218.

Приложение

Программный код класса "Chromosome"

class Chromosome

{

public static List<Projectpr> pr=new List<Projectpr>();

public double npv=0;

public List<Gene> chrom=new List<Gene>();

//yr -год до которого мы хотим максимизировать npv,d -ставка дисконтирования,r-гоовая ставка банка,vklad -количество денег на все проекты

public void Value()

{

npv = 0;

double[] inc =new double[Ekzogen.yr];

double[] outc = new double[Ekzogen.yr];

//получения массивов дохода и рассхода

for (int i = 0; i < chrom.Count; i++)

{

if(chrom[i].var==1)

{

int j = 0;

for (int k = chrom[i].place; j < pr[i].var1.income.Count && k < Ekzogen.yr;j++, k++)

{

inc[k] += pr[i].var1.income[j];

outc[k] += pr[i].var1.outcome[j];

}

}

if (chrom[i].var == 2)

{

int j = 0;

for (int k = chrom[i].place; j < pr[i].var2.income.Count && k < Ekzogen.yr; k++,j++)

{

inc[k] += pr[i].var2.income[j];

outc[k] += pr[i].var2.outcome[j];

}

}

if (chrom[i].var == 3)

{

int j = 0;

for (int k = chrom[i].place; j < pr[i].var3.income.Count && k < Ekzogen.yr; k++, j++)

{

inc[k] += pr[i].var3.income[j];

outc[k] += pr[i].var3.outcome[j];

}

}

}

//подсчет NPV,используется стандартная модель подсчета

double dox = Ekzogen.vklad;

double[] bank=new double[Ekzogen.yr];

double sumbank=0;

for (int i = 0; i < inc.Length; i++)

{

outc[i] += Ekzogen.r * sumbank;

if (dox != 0)

{

if (dox+inc[i]>= outc[i])

{

if (inc[i] < outc[i])

{

dox = dox - outc[i] + inc[i];

npv =npv + (inc[i] - outc[i]) / Math.Pow(1 + Ekzogen.d, i);

}

else

{

npv = npv + (inc[i] - outc[i]) / Math.Pow(1 + Ekzogen.d, i);

}

}

else

{

sumbank += outc[i]-dox-inc[i];

bank[i] = outc[i] - dox - inc[i];

dox = 0;

npv += (inc[i] - outc[i]) / Math.Pow(1 + Ekzogen.d, i);

////wtf???

// npv += bank[i] / Math.Pow(1 + Ekzogen.d, i);

}

}

else

{

if (i != inc.Length - 1)

{

if (inc[i] < outc[i])

{

sumbank += outc[i] - inc[i];

bank[i] = outc[i] - inc[i];

npv += (inc[i] - outc[i]) / Math.Pow(1 + Ekzogen.d, i);

// npv += bank[i] / Math.Pow(1 + Ekzogen.d, i);

}

else

{

npv += (inc[i] - outc[i]) / Math.Pow(1 + Ekzogen.d, i);

}

}

else

{

outc[i] += sumbank;

npv += (inc[i] - outc[i]) / Math.Pow(1 + Ekzogen.d, i);

// npv += bank[i] / Math.Pow(1 + Ekzogen.d, i);

}

}

}

}

}

Программный код класса "Ekzogen"

class Ekzogen

{

public static int yr=10;

public static double d=0.15;

public static double r = 0.1;

public static double vklad = 9000000;

public static double dep = 0.09;

public static Chromosome luch = new Chromosome();

public static int iterat = 20000;

public static int chromoscount=20;

public static double vergen = 0.05;

public static double verchrom = 0.1;

}

Программный код класса "Funnctions"

class Functions

{

static public void Sortirovka(List<Chromosome> dat)

{

dat.Sort(delegate(Chromosome d1, Chromosome d2)

{

return d2.npv.CompareTo(d1.npv);

});

}

static public int DoubleBinarySearch(double chislo, double[] massiv)

{

for (int i = 0; i < massiv.Length; i++)

{

if (massiv[i] >= chislo)

{

return i;

}

}

return massiv.Length - 1;

}

static public double MaxiNPV(List<Chromosome> chr,Chromosome luch,double maxi)

{

double maxim = -98557425415;

for (int i = 0; i < chr.Count; i++)

{

if (maxim < chr[i].npv)

{

maxim = chr[i].npv;

if (maxim > maxi)

{

maxi = maxim;

luch.chrom.Clear();

luch.npv = maxi;

for (int j = 0; j < chr[i].chrom.Count; j++)

{

Gene promgen = new Gene();

promgen.place = chr[i].chrom[j].place;

promgen.var = chr[i].chrom[j].var;

luch.chrom.Add(promgen);

}

}

}

}

return maxim;

}

}

Программный код класса "Gene"

class Gene

{

public int place; // место

public int var; // вариант проекта

}

Программный код класса "Genetic"

class Genetic

{

//////////////////////////////////////////////////////////////////////////////////

public static void Generacia(List<Chromosome> chr,int n,int yr)

{

Random ran = new Random();

for (int i = 0; i < Ekzogen.chromoscount; i++)

{

Chromosome chromos = new Chromosome();

int t = ran.Next(0, n);

for (int j = 0; j < n; j++)

{

Gene gen = new Gene();

gen.place = ran.Next(0,yr);

gen.var = ran.Next(0, 4);// 0 значает, что проект не осуществляется

// чтобы хотя бы один проект точно начинался с 0 года

if (j == t)

{

gen.place = 0;

gen.var = ran.Next(1, 4);

}

chromos.chrom.Add(gen);

}

chr.Add(chromos);

}

}

/////////////////////////////////////////////////////////////////////////////////

//// Рулетка

public static void Parentchoose(List<Chromosome> parents,List<Chromosome> chr)

{

parents.Clear();

double SumNpv=0;

Random ran = new Random();

for (int i = 0; i < chr.Count; i++)

{

SumNpv += chr[i].npv;

}

double[] ver = new double[chr.Count];

////сделаем функцию распределения

ver[0] = chr[0].npv / SumNpv;

for (int i = 1; i < ver.Length;i++)

{

ver[i] = chr[i].npv / SumNpv + ver[i - 1];

}

//на всякий случай вставляем эту строчку,чтобы предотвратить ошибки от программного недосчета(Хотя она по идее и должна получиться 1 ой)

ver[ver.Length - 1] = 1.0;

double chislo;

//N запусков рулетки

for (int i = 0; i < chr.Count; i++)

{

chislo = ran.NextDouble();

parents.Add(chr[Functions.DoubleBinarySearch(chislo,ver)]);

}

}

////////////////////////////////////////////////////////////////////////////////

public static void Crossing(List<Chromosome> parents, List<Chromosome> chr)

{

chr.Clear();

int perv = 0;

int vtor = 0;

int tochka1 = 0;

int tochka2 = 0;

Random ran = new Random();

// двухточечный кроссинговер

for (int i = 0; i < parents.Count; i++)

{ дисконтированный генетический объектный инвестиционный

perv = ran.Next(0, parents.Count);

vtor = ran.Next(0, parents.Count);

tochka1 = ran.Next(0, parents.Count);

tochka2=ran.Next(0, parents.Count);

Chromosome chrom1 = new Chromosome();

Chromosome chrom2 = new Chromosome();

/////////////////////////////////////////////////////////////////////////////////////

if (tochka1 <= tochka2)

{

for (int j = 0; j < parents[0].chrom.Count; j++)

{

if(j>=tochka1 && j<tochka2)

{

chrom1.chrom.Add(parents[tochka1].chrom[j]);

chrom2.chrom.Add(parents[tochka2].chrom[j]);

}

else

{

chrom2.chrom.Add(parents[tochka1].chrom[j]);

chrom1.chrom.Add(parents[tochka2].chrom[j]);

}

}

}

else

{

for (int j = 0; j < parents[0].chrom.Count; j++)

{

if (j >= tochka1)

{

chrom1.chrom.Add(parents[tochka1].chrom[j]);

chrom2.chrom.Add(parents[tochka2].chrom[j]);

continue;

}

if(j<tochka2)

{

chrom1.chrom.Add(parents[tochka1].chrom[j]);

chrom2.chrom.Add(parents[tochka2].chrom[j]);

continue;

}

chrom2.chrom.Add(parents[tochka1].chrom[j]);

chrom1.chrom.Add(parents[tochka2].chrom[j]);

}

}

///////////////////////////////////////////

chrom1.Value();

chrom2.Value();

if (chrom1.npv > chrom2.npv)

{

chr.Add(chrom1);

}

else

{

chr.Add(chrom2);

}

}

}

///////////////////////////////////////////////////////////////////////////////

//реализованна вещественная мутация

// перепроверь потом

public static void Mutation(List<Chromosome> chr)

{

Random ran = new Random();

double prob=0.0;

double prob2 = 0;

for (int i = 0; i < chr.Count; i++)

{

prob = ran.NextDouble();

if(prob<Ekzogen.verchrom)

{

for (int j = 0; j < chr[i].chrom.Count; j++)

{

prob2 = ran.NextDouble();

if (prob2 <= Ekzogen.vergen)

{

prob2 = ran.NextDouble();

if (prob2 < 0.5)

{

chr[i].chrom[j].place = chr[i].chrom[j].place + 1;

if (chr[i].chrom[j].place == chr[i].chrom.Count)

{

chr[i].chrom[j].place = 0;

}

}

else

{

chr[i].chrom[j].place = chr[i].chrom[j].place - 1;

if (chr[i].chrom[j].place == -1)

{

chr[i].chrom[j].place = chr[i].chrom.Count-1;

}

}

}

}

}

prob = ran.NextDouble();

if (prob < Ekzogen.verchrom)

{

for (int j = 0; j < chr[i].chrom.Count; j++)

{

prob2 = ran.NextDouble();

if (prob2 <= Ekzogen.vergen)

{

prob2 = ran.NextDouble();

if (prob2 < 0.5)

{

chr[i].chrom[j].var = chr[i].chrom[j].var + 1;

if (chr[i].chrom[j].var == 4)

{

chr[i].chrom[j].var = 0;

}

}

else

{

chr[i].chrom[j].var = chr[i].chrom[j].var - 1;

if(chr[i].chrom[j].var ==-1)

{

chr[i].chrom[j].var = 3;

}

}

}

}

}

}

}

///////////////////////////////////////////////////////////////////////////////

public static void Prigodnost(List<Chromosome> chr)

{

for(int i=0;i<chr.Count;i++)

{

chr[i].Value();

}

}

/////////////////////////////////////////////////////////////////////////////

public static void Otbor(List<Chromosome> chr, List<Chromosome> parents)

{

List<Chromosome> otobran = new List<Chromosome>();

int k = chr.Count();

for (int i = 0; i < chr.Count; i++)

{

if (chr[i].npv == 0)

{

chr[i].Value();

}

otobran.Add(chr[i]);

}

for (int i = 0; i < parents.Count; i++)

{

if (parents[i].npv == 0)

{

parents[i].Value();

}

otobran.Add(parents[i]);

}

Functions.Sortirovka(otobran);

chr.Clear();

for (int i = 0; i < k; i++)

{

chr.Add(otobran[i]);

}

}

}

Программный код класса "Projectpr "

class Projectpr

{

public Variantpoject var1;

public Variantpoject var2;

public Variantpoject var3;

}

Программный код класса "Variantproject"

class Variantpoject

{

public List<double> income=new List<double>();

public List<double> outcome = new List<double>();

}

Программный код формы "Dannie"

public partial class Dannie : Form

{

public Dannie()

{

InitializeComponent();

}

private void Form4_Load(object sender, EventArgs e)

{

// TODO: данная строка кода позволяет загрузить данные в таблицу "neftprojDataSet1.Project_var". При необходимости она может быть перемещена или удалена.

this.project_varTableAdapter.Fill(this.neftprojDataSet1.Project_var);

}

private void Okbutton_Click(object sender, EventArgs e)

{

this.Close();

}

}

Программный код формы "Glavnoie"

public partial class Glavnoie : Form

{

public Glavnoie()

{

InitializeComponent();

backgroundWorker1.WorkerReportsProgress = true;

backgroundWorker1.WorkerSupportsCancellation = true;

GraphPane pane = zedGraph.GraphPane;

pane.Title.Text = "График NPV";

// Изменим текст по оси X и Y

pane.YAxis.Title.Text = "Суммарное NPV";

pane.XAxis.Title.Text = "X";

pane.Title.FontSpec.Fill.IsVisible = true;

// Сделаем шрифт не полужирным

pane.Title.FontSpec.IsBold = false;

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

pane.CurveList.Clear();

// Создадим список точек

PointPairList list = new PointPairList();

}

//ловит ошибки при завершении работы

private void backgroundWorker1_RunWorkerCompleted(object sender,

RunWorkerCompletedEventArgs e)

{

if (e.Cancelled)

{

MessageBox.Show("Работа программы была остановлена");

}

else if (e.Error != null)

{

MessageBox.Show("Информация об ошибке: " + (e.Error as Exception).ToString());

}

else

{

MessageBox.Show("Работа программы была завершена успешно: " + e.Result.ToString());

}

}

List<Chromosome> bank = new List<Chromosome>();

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

{

GraphPane pane = zedGraph.GraphPane;

pane.Title.Text = "NPV";

pane.XAxis.Scale.Min = 0;

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

pane.CurveList.Clear();

// Два списка точек для двух графиков

PointPairList list1 = new PointPairList();

// Заполняем списи точек

// Заполняем списи точек

list1.Add(0,0);

// Добавим две кривые, но не будем сохранять указатели на них

pane.AddCurve("", list1, Color.Blue, SymbolType.None);

zedGraph.AxisChange();

zedGraph.Invalidate();

ZagrDannix();

e.Result = "";

bank.Clear();

double maxi = -9554544512;

int itcount = Ekzogen.iterat/(2*Ekzogen.chromoscount);

for (int it = 0; it <= Ekzogen.chromoscount; it++)

{

double maxiloc = -9554544512;

List<Chromosome> chr = new List<Chromosome>();

List<Chromosome> parents = new List<Chromosome>();

Genetic.Generacia(chr, Chromosome.pr.Count, Ekzogen.yr);

if (it == Ekzogen.chromoscount)

{

chr.Clear();

for (int i = 0; i < bank.Count; i++)

{

Chromosome prom = new Chromosome();

prom.npv = bank[i].npv;

for (int jprom = 0; jprom < bank[i].chrom.Count; jprom++)

{

Gene promgen = new Gene();

promgen.var = bank[i].chrom[jprom].var;

promgen.place = bank[i].chrom[jprom].place;

prom.chrom.Add(promgen);

}

chr.Add(prom);

itcount = Ekzogen.iterat/2;

}

}

Chromosome luch = new Chromosome();

for (int i = 0; i < itcount; i++)

{

Genetic.Prigodnost(chr);

Genetic.Parentchoose(parents, chr);

Genetic.Crossing(parents, chr);

Genetic.Prigodnost(chr);

if (maxi < Functions.MaxiNPV(chr, luch, maxi))

{

maxi = Functions.MaxiNPV(chr, luch, maxi);

}

if (maxiloc < Functions.MaxiNPV(chr, luch, maxiloc))

{

maxiloc = Functions.MaxiNPV(chr, luch, maxiloc);

}

Genetic.Mutation(chr);

Genetic.Otbor(chr, parents);

Genetic.Prigodnost(chr);

if (maxi < Functions.MaxiNPV(chr, luch, maxi))

{

maxi = Functions.MaxiNPV(chr, luch, maxi);

}

if (maxiloc < Functions.MaxiNPV(chr, luch, maxiloc))

{

maxiloc = Functions.MaxiNPV(chr, luch, maxiloc);

}

System.Threading.Thread.Sleep(1);

backgroundWorker1.ReportProgress(i, maxi);

if (backgroundWorker1.CancellationPending)

{

e.Cancel = true;

return;

}

}

bank.Add(luch);

}

double maxnpv = 0;

for (int i = 0; i < bank.Count; i++)

{

if (bank[i].npv > maxnpv)

{

maxnpv = bank[i].npv;

Ekzogen.luch = bank[i];

}

}

e.Result="npv="+Ekzogen.luch.npv.ToString()+"\n";

/* for (int i = 0; i < Ekzogen.luch.chrom.Count; i++)

{

e.Result += i.ToString() + "-ый проект " + Ekzogen.luch.chrom[i].place.ToString() + " год " + Ekzogen.luch.chrom[i].var.ToString() + " вариант " + "\n";

}*/

}

private void backgroundWorker1_ProgressChanged(object sender,

ProgressChangedEventArgs e)

{

GraphPane pane = zedGraph.GraphPane;

string time = Convert.ToString(e.UserState); //get additional information about progress

ModifyCurve(pane.CurveList[0], Convert.ToDouble(time));

// Обновим оси и сам график

zedGraph.AxisChange();

zedGraph.Invalidate();

txtOutput.AppendText(time);

txtOutput.AppendText(Environment.NewLine);

}

//////////////////////////////////////////////////////////////////////////////

private void btnStart_Click(object sender, EventArgs e)

{

backgroundWorker1.RunWorkerAsync();

}

private void btnStop_Click(object sender, EventArgs e)

{

backgroundWorker1.CancelAsync();

}

//////////////////////////////////////////////////////////////////////////////

private void ZagrDannix()

{

var context = new ProjDataClassesDataContext();

var prv = context.Project_var.ToList();

Variantpoject prj1=new Variantpoject();

Variantpoject prj2 = new Variantpoject();

Variantpoject prj3 = new Variantpoject();

int k = 1;

foreach (var proj in prv)

{

if (k != proj.Project_id)

{

k = proj.Project_id;

Projectpr p = new Projectpr();

p.var1 = prj1;

p.var2 = prj2;

p.var3 = prj3;

Chromosome.pr.Add(p);

prj1 = new Variantpoject();

prj2 = new Variantpoject();

prj3 = new Variantpoject();

}

if (proj.Variant == 1)

{

prj1.income.Add((Double)proj.Income);

prj1.outcome.Add((Double)proj.Outcome);

}

if (proj.Variant == 2)

{

prj2.income.Add((Double)proj.Income);

prj2.outcome.Add((Double)proj.Outcome);

}

if (proj.Variant == 3)

{

prj3.income.Add((Double)proj.Income);

prj3.outcome.Add((Double)proj.Outcome);

}

}

Projectpr p1 = new Projectpr();

p1.var1 = prj1;

p1.var2 = prj2;

p1.var3 = prj3;

Chromosome.pr.Add(p1);

}

private void Form1_Load(object sender, EventArgs e)

{

}

private static void ModifyCurve(CurveItem curve, double k)

{

// Создадим новый список точек для кривой

PointPairList newlist = new PointPairList();

// Пробежимся по всем точкам на кривой

for (int i = 0; i < curve.Points.Count; i++)

{

// Заполним новый список точек

newlist.Add(curve.Points[i].X, curve.Points[i].Y);

}

newlist.Add(curve.Points[curve.Points.Count - 1].X + 0.01, k);

curve.Points = newlist;

}

Oprogramm form5 = new Oprogramm();

private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)

{

this.Hide();

form5.ShowDialog();

this.Show();

}

Nastroiki form2=new Nastroiki();

private void настройкиToolStripMenuItem_Click(object sender, EventArgs e)

{

this.Hide();

form2.ShowDialog();

this.Show();

}

Result form3 = new Result();

private void button1_Click(object sender, EventArgs e)

{

double maxnpv = 0;

for (int i = 0; i < bank.Count; i++)

{

if (bank[i].npv > maxnpv)

{

maxnpv = bank[i].npv;

Ekzogen.luch = bank[i];

}

}

this.Hide();

form3.ShowDialog();

this.Show();

}

Dannie form4 = new Dannie();

private void файлToolStripMenuItem_Click(object sender, EventArgs e)

{

this.Hide();

form4.ShowDialog();

this.Show();

}

private void открытьToolStripMenuItem_Click(object sender, EventArgs e)

{

}

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

this.Close();

}

NastroikiGA form6 = new NastroikiGA();

private void настройкиГенетическогоToolStripMenuItem_Click(object sender, EventArgs e)

{

this.Hide();

form6.ShowDialog();

this.Show();

}

}

Программный код формы "Nastroiki"

public partial class Nastroiki : Form

{

public Nastroiki()

{

InitializeComponent();

YrtextBox.Text = Ekzogen.yr.ToString();

DeptextBox.Text = Ekzogen.dep.ToString();

MntextBox.Text = Ekzogen.vklad.ToString();

KredtextBox.Text = Ekzogen.r.ToString();

DisctextBox.Text = Ekzogen.d.ToString();

}

private void Okbutton_Click(object sender, EventArgs e)

{

try

{

Ekzogen.yr = Convert.ToInt32(YrtextBox.Text);

Ekzogen.dep = Convert.ToDouble(DeptextBox.Text);

Ekzogen.vklad = Convert.ToDouble(MntextBox.Text);

Ekzogen.r = Convert.ToDouble(KredtextBox.Text);

Ekzogen.d = Convert.ToDouble(DisctextBox.Text);

this.Close();

}

catch

{

MessageBox.Show("Ошибка при вводе данных");

}

}

private void button1_Click(object sender, EventArgs e)

{

this.Close();

}

private void Nastroiki_Load(object sender, EventArgs e)

{

}

}

Программный код формы "NastroikiGA"

public partial class NastroikiGA : Form

{

public NastroikiGA()

{

InitializeComponent();

VerchromtextBox.Text = Ekzogen.verchrom.ToString();

VergentextBox.Text = Ekzogen.vergen.ToString();

ChromcounttextBox.Text = Ekzogen.chromoscount.ToString();

itercounttextBox.Text = Ekzogen.iterat.ToString();

}

private void Cancelbutton_Click(object sender, EventArgs e)

{

this.Close();

}

private void NastroikiGA_Load(object sender, EventArgs e)

{

}

private void Okbutton_Click(object sender, EventArgs e)

{

try

{

Ekzogen.verchrom = Convert.ToDouble(VerchromtextBox.Text);

Ekzogen.vergen = Convert.ToDouble(VergentextBox.Text);

Ekzogen.chromoscount =Convert.ToInt32( ChromcounttextBox.Text);

Ekzogen.iterat = Convert.ToInt32(itercounttextBox.Text);

this.Close();

}

catch

{

MessageBox.Show("Ошибка при вводе данных");

}

}

}

Программный код формы "Result"

public partial class Result : Form

{

public Result()

{

InitializeComponent();

}

private void Form3_Load(object sender, EventArgs e)

{

for (int i = 0; i < Ekzogen.luch.chrom.Count; i++)

{

dataGridView1.Rows.Add();

this.dataGridView1.Rows[i].Cells[0].Value = (i+1).ToString();

this.dataGridView1.Rows[i].Cells[1].Value = Ekzogen.luch.chrom[i].place;

this.dataGridView1.Rows[i].Cells[2].Value = Ekzogen.luch.chrom[i].var;

}

this.textBox1.Text = Ekzogen.luch.npv.ToString();

}

private void Okbutton_Click(object sender, EventArgs e)

{

this.Close();

}

}

Размещено на Allbest.ru


Подобные документы

  • Задачи финансового анализа и этапы проведения оценки инвестиционных проектов. Период окупаемости первоначальных затрат и дисконтированный период окупаемости. Чистый доход и чистый дисконтированный доход. Внутренняя и модифицированная норма доходности.

    курсовая работа [258,7 K], добавлен 28.02.2015

  • Принципы формирования инвестиционного портфеля. Современная теория портфеля (модель Марковица). Модель оценки капитальных вложений (модель Шарпа). Характеристика позиции фирмы на рынке. Разработка инвестиционной стратегии на примере ООО "Восток–Запад".

    курсовая работа [128,9 K], добавлен 24.08.2016

  • Предварительная экспертиза бизнес-планов. Поиск вариантов проектов для возможной их реализации. Окончательный отбор инвестиционных проектов в формируемый портфель с учетом его оптимизации и обеспечения диверсификации инвестиционной деятельности.

    курсовая работа [151,9 K], добавлен 29.05.2015

  • Сравнение различных инвестиционных проектов и выбор лучшего из них с использованием различных показателей: чистый дисконтированный доход, индекс доходности, внутренняя норма доходности, срок окупаемости, точки безубыточности и простой нормы прибыли.

    контрольная работа [187,2 K], добавлен 20.04.2015

  • Характеристики риска при анализе инвестиционных проектов. Оценка единичного и рыночного рисков. Статистические критерии риска. Сущность теории портфеля Г. Марковица и модель оценки доходов финансовых активов. Метод оптимизации инвестиционного портфеля.

    курсовая работа [608,2 K], добавлен 21.11.2011

  • Инвестиционная политика организации. Реальные и финансовые инвестиции. Формирование инвестиционного портфеля. Основы инвестиционного анализа. Методы оценки эффективности инвестиционных проектов. Формы финансовых инвестиций и особенности управления ими.

    контрольная работа [58,9 K], добавлен 14.12.2010

  • Определение инвестиционного портфеля и этапы его формирования, количественно-качественные характеристики. Стратегии управления портфелем, его доходность и риск по нему. Модель У. Шарпа как модель формирования оптимального инвестиционного портфеля.

    контрольная работа [380,4 K], добавлен 17.10.2016

  • Основные принципы, положенные в основу анализа инвестиционных проектов. Критерии оценки эффективности инвестиционных проектов. Анализ методов оценки инвестиционных проектов и проектных рисков. Влияние инвестиционного проекта на деятельность предприятия.

    курсовая работа [306,3 K], добавлен 11.06.2009

  • Анализ принципов расчета основных инвестиционных показателей и определение на их основе наиболее привлекательных с инвестиционной точки зрения проектов. Экспертиза данных проектов по критерию эффективности, расчет дисконтированного срока окупаемости.

    курсовая работа [95,5 K], добавлен 07.11.2012

  • Сущность инвестиционного портфеля и методы его оценки. Теория оценки портфеля по критерию риска. Соотношение риска и доходности. Отбор объектов инвестирования по критерию доходности. Описание инвестиционного портфеля "Капитал", пути его оптимизации.

    курсовая работа [610,5 K], добавлен 12.11.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.