close

Вход

Забыли?

вход по аккаунту

?

отчет (2)

код для вставкиСкачать
Оглавление
Введение2
Постановка задачи3
Описание алгоритма4
Описание программной реализации5
Результаты тестирования9
Заключение10
Список использованных источников11
Введение
Определение численности объекта исследования оказывается первейшей задачей любого исследования, поскольку она теснейшим образом связана с различными аспектами жизнедеятельности организма. Численность популяции, по сути, является главной результирующей функцией, обусловленной размножением, смертностью, пространственным распределением, миграциями, социальными отношениями и т.д. организмов на фоне проявления различных экологических факторов.
Без данных о численности видов, которые входят в состав биоценоза, нельзя судить об их относительной роли в формировании стабильности данного сообщества, невозможно установить особенности развития биоценоза в пространстве и времени, выяснить характер динамики популяций отдельных видов.
Для решения перечисленных выше, а, кроме того, и многих других вопросов, нельзя ограничиваться только субъективной, например, глазомерной оценкой численности. Основная задача количественного учета организмов при проведении экологических исследований состоит в получении объективных и сопоставимых с результатами других исследований данных об обилии организмов данного вида в пределах определенной территории.
Постановка задачи
Целью данного курсового проекта является решение следующей задачи.
Даны натуральные числа А1..АN, отражающие результаты наблюдения за муравейником. Вначале отловили и пометили 100 муравьев. Затем, в течение N дней повторяли следующее: отлавливали по 100 муравьев, подсчитывали число помеченных Аi, помечались непомеченные, и все отпускались. Подсчитать (приблизительно) общее количество муравьев в муравейнике.
Для решения поставленной задачи будем использовать метод статистического оценивания. Этот метод основан на подходе, который называется "мечение - выпуск - повторный отлов" (МВПО) (capture-recapture model). В его основе лежит предположении, что меченое животное имеет такую же вероятность быть отловленным, как и немеченое.
В общем случае мечение представляет собой процедуру присвоения организму определенного признака (метки), отличающего его от другого (немеченого) животного. Метки могут быть либо индивидуальными (кодово-номерными), либо унифицированными (единообразными) для группы животных в целом. В поставленной задаче необходимо использовать унифицированные метки. Программа, которая будет получена в результате выполнения курсового проекта, теоретически может быть использована для подсчета популяции любого из видов животных, а конкретно в нашем случае - для определения численности колонии муравьев в пределах одного муравейника.
Описание алгоритма
Среди методов мечения, выпуска и повторного отлова наиболее известным и широко распространенным является метод Петерсена-Линкольна. Этот метод подходит для эксперимента, продолжительностью два дня. Он заключается в следующем. Отлавливается выборка животных численностью M, каждое животное метится и выпускается обратно. Спустя некоторое время отлавливается новая выборка животных объемом n и среди них отмечается количество ранее меченых (m). Тогда исходную численность популяции можно оценить по формуле:
N=(M(n+1))/(m+1) . (1)
Оценить численность популяции можно и проводя многократные отловы, при этом производя единообразное мечения всех ранее немеченых животных при каждом последовательном отлове. В этом случае можно ожидать, что с каждым последовательным отловом и мечением в популяции будет расти доля меченых особей вплоть до того момента, когда все особи в данной популяции окажутся с метками. Таким образом, на основании оценки доли меченых особей в популяции (полученной с помощью выборочных данных) в зависимости от совокупного числа всех ранее меченых животных можно найти оценку величины популяции - ее численность, при которой доля меченых животных должна достичь 100 %. На принципе, изложенном выше основан метод взвешенной средней. Он подходит для эксперимента продолжительностью более двух дней. Метод был использован Майклом Бигоном в 1979 году в его книге "Популяции животных. Маркирование животных. Математические модели". Для метода необходимо составить таблицу, содержащую следующие столбцы: ni - количество отловленных муравьев, mi - количество попавшихся неотмеченных муравьев (по заданию Ai), совокупное число ранее отмеченных. Численность популяции 〖 N〗_WM находится по следующей формуле:
N_WM=(∑▒〖M_i n_i 〗)/((∑▒〖m_i)〗+1). (2)
Итак, при продолжительности эксперимента в два дня используем метод Петерсена-Линкольна, а при продолжительности более двух дней используем метод взвешенной средней.
Описание программной реализации
Окно программы выглядит так:
Рисунок 1. - Окно программы.
Число дней устанавливается с помощью элемента numericUpDown. Ввод данных производится в столбец Ai таблицы dataGridView. Обозначения столбцов описаны выше в элементе Label. Запуск процесса вычисления производится кнопкой "Вычислить". Результат выводится в элемент textBox. При нажатии на кнопку "Информация" выводится дополнительная информация по программе.
При изменении значения элемента numericUpDown изменяется значение N - числа дней эксперимента. Также изменяется число строк в элементе dataGridView.
После ввода данных в стобец Ai и нажатия "Вычислить" из элемента dataGridView заполняется матрица table размерностью N на 5. В матрице table будут записываться результаты дальнейших вычислений. Сначала записывается Ai - число помеченных муравьев, следом Ki - число выловленных муравьев, для каждой строки это значение равно 100, далее для каждой строки вычисляется Zi - число попавшихся непомеченных муравьев. В конце вычисляется Mi - совокупное число помеченных муравьев на текущий день. Также вычисляется необходимое для применения метода значение Mi*Ki. Далее результаты вычислений выводятся в элемент dataGridView. Последним этапом будет вычисление значения N_WM по данным из таблицы table, используя формулу:
N_WM=(∑▒〖M_i K_i 〗)/((∑▒〖Z_i)〗+1) . (3)
В программной реализации можно выделить следующие особенности.
При вводе данных в dataGridView обрабатывается событие нажатия клавиши и осуществляется ввод только цифр. Максимальное количество вводимых символов равно 2, так как нельзя вводить числа, которые больше 100.
В ячейке, соответствующей A1, должен быть 0. Эта ситуация обрабатывается и, если значение этой ячейки отлично от 0, то выводится предупреждение и вычисления откладываются.
Также проверяется заполненность всех ячеек столбца Ai. Если не все ячейки заполнены, то выводится предупреждение и вычисления откладываются.
Исходный текст программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Course
{
public partial class Form1 : Form
{
static int N;
static int[,] table;
public Form1()
{
InitializeComponent();
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
//изменение числа дней (N)
N = (int)numericUpDown1.Value;
dataGridView1.RowCount = N;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Cells[0].Value = (i + 1).ToString();
}
}
static int PetersenLincolnMethod(DataGridView dataTable)
{
table = new int[N, 5];
for (int i = 0; i < N; i++)
{
table[i, 0] = Convert.ToInt16(dataTable.Rows[i].Cells[1].Value); //число помеченых в i-й день
table[i, 2] = 100; //число выловленных в i-й день
//table[i, 2] = Convert.ToInt16(dataGridView1.Rows[i].Cells[3].Value);
table[i, 1] = table[i, 2] - table[i, 0]; //число вновь помеченых (попавшихся непомеченых)
}
table[0, 3] = 0;
table[1, 3] = 100;
for (int j = 2; j < N; j++)
{
table[j, 3] += table[j - 1, 3] + table[j - 1, 1]; //совокупное число помеченых на текущий день
}
for (int i = 0; i < N; i++)
{
table[i, 4] = table[i, 3] * table[i, 2];
}
for (int i = 0; i < N; i++)
{
dataTable.Rows[i].Cells[2].Value = Convert.ToString(table[i, 1]);
dataTable.Rows[i].Cells[3].Value = Convert.ToString(table[i, 2]);
dataTable.Rows[i].Cells[4].Value = Convert.ToString(table[i, 3]);
}
return (table[0, 2] * (table[1, 2]+1))/(table[1,0]);
}
//проверка заполненности ячеек
static bool checkCells(DataGridView dataGrid)
{
bool res = true;
for (int i = 0; i < N && res; i++)
{
if (dataGrid.Rows[i].Cells[1].Value == null)
res = false;
}
return res;
}
static int multipleTrapping(DataGridView dataTable)
{
table = new int[N, 5];
//заполняем таблицу в памяти
//0 - Ai
//1 - Zi
//2 - Ki
//3 - Mi
//4 - Mi*Ki
for (int i = 0; i < N; i++)
{
table[i, 0] = Convert.ToInt16(dataTable.Rows[i].Cells[1].Value); //число помеченых в i-й день
table[i, 2] = 100; //число выловленных в i-й день
table[i, 1] = table[i, 2] - table[i, 0]; //число вновь помеченых (попавшихся непомеченых)
}
table[0, 3] = 0;
table[1, 3] = 100;
for (int j = 2; j < N; j++)
{
table[j, 3] += table[j - 1, 3] + table[j - 1, 1]; //совокупное число помеченых на текущий день
}
for (int i = 0; i < N; i++)
{
table[i, 4] = table[i, 3] * table[i, 2];
}
for (int i = 0; i < N; i++)
{
dataTable.Rows[i].Cells[2].Value = Convert.ToString(table[i, 1]);
dataTable.Rows[i].Cells[3].Value = Convert.ToString(table[i, 2]);
dataTable.Rows[i].Cells[4].Value = Convert.ToString(table[i, 3]);
}
int sum1 = 0;
int sum2 = 0;
for (int i = 0; i < N; i++)
{
sum1 += table[i, 4];
sum2 += table[i, 1];
}
double res = sum1 / (sum2 + 1);
int result = (int)Math.Round(res, 0);
if (result < table[N-1,3])
{
result = table[N - 1, 3] + table[N - 1, 1];
}
return result;
}
private void button1_Click_1(object sender, EventArgs e)
{
if (checkCells(dataGridView1))
{
if (N <= 1)
{
MessageBox.Show("Число дней эксперимента должно быть не менее двух.");
}
else if (N == 2)
{
textBox2.Text = Convert.ToString(PetersenLincolnMethod(dataGridView1));
}
else
{
textBox2.Text = Convert.ToString(multipleTrapping(dataGridView1));
}
}
else MessageBox.Show("Не все ячейки заполнены. Заполните все ячейки.");
}
//событие окончания ввода в ячейку
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{ //проверка ввода в 1ю ячейку 2го столбца
if ((dataGridView1.CurrentRow.Index == 0) && (Convert.ToInt16(dataGridView1.CurrentRow.Cells[1].Value) != 0))
{
MessageBox.Show("В первый день эксперимента число попавшихся помеченных муравьев равно 0, так как до этого их никто не метил!");
dataGridView1.CurrentRow.Cells[1].Value = 0;
}
}
//обработка нажатия клавиш(ввод только цифр)
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 1)
{
TextBox tb = (TextBox)e.Control;
tb.KeyPress += new KeyPressEventHandler(tb_KeyPress);
}
}
//событие нажатия клавиши
void tb_KeyPress(object sender, KeyPressEventArgs e) {
if (!(Char.IsDigit(e.KeyChar)) && (e.KeyChar != '.'))
{
if (e.KeyChar != (char)Keys.Back)
{ e.Handled = true; }
}
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("Задание: Даны натуральные числа А1..АN, отражающие результаты наблюдения за муравейником. Вначале отловили и пометили 100 муравьев. Затем, в течение N дней повторяли следующее: отлавливали по 100 муравьев, подсчитывали число помеченных Аi, помечались непомеченные, и все отпускались. Подсчитать (приблизительно) общее количество муравьев в муравейнике.\n\n Указания: Значения Ai начинаются с 0, так как в первый день помеченных не могло быть. Каждое последующее значение Ai по логике должно быть больше предыдущего, так как вероятность отлова помеченного муравья каждый раз растет.");
}
}
}
Результаты тестирования
Тест 1:
При тестовых данных N=10 и A = {0,12,21,29,38,44,59,68,79,86} результат 588.
Рисунок 2. - Тест 1
Тест 2:
При тестовых данных N=2 и A = {0,48} результат 210.
Рисунок 3. - Тест 2
Заключение
Была написана программа для определения численности популяции муравьев в пределах одного муравейника. В программе были реализованы методы Петерсена-Линкольна и взвешенной средней. Также была реализована защита от неверного ввода данных: ввод ограниченного числа символов, ввод только цифр и .т.д. Результаты тестирования доказывают работоспособность программы.
Список использованных источников
http://msdn.microsoft.com/ru-ru/
http://meduniver.com/Medical/Biology/277.html
http://www.ievbras.ru/ecostat/Kiril/Article/A18/Vol1/Kramar1.html
http://www.ievbras.ru/ecostat/Kiril/Article/A18/Vol2/Kramar2.html
Шилдт, Герберт. С# 4.0: полное руководство. : Пер. с англ. - М. : ООО "И.Д. Вильяме", 2011. - 1056 с.: ил. - Парал. тит. англ.
1
Документ
Категория
Рефераты
Просмотров
72
Размер файла
115 Кб
Теги
отчет
1/--страниц
Пожаловаться на содержимое документа