Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
8
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

15.2 Особенности поиска решений в игровых задачах

Многие игры, особенно с двумя противниками, можно представить в виде деревьев И-ИЛИ, если ходы игроков чередуются.

При анализе, возможные ходы первого игрока представляются, как вершины типа ИЛИ, т.к. он производит выбор среди нескольких возможных ходов. Ответы противников представляются, как вершины типа И, т.к. при анализе нужно предусматривать все возможные ответы противника. Таким образом получается дерево, где чередуются вершины типа И и ИЛИ.

В сложных играх полный перебор ходов невозможен из-за комбинаторного взрыва. В крестиках-ноликах 3х3 возникает 9! вариантов. В шашках 1040, в шахматах 10120.

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

При этом в большинстве случаев перебор не заканчивается решением, а ограничивается в глубину и в ширину.

Лучший ход обычно выбирают исходя из статической оценочной функции, которая оценивает каждую рассмотренную позицию, начиная с концевых вершин.

Для первого игрока оценочная функция считается положительной, для противника - она отрицательна. При оценке лучшего хода применяется минимаксная процедура - лучший ход среди худших.

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

L(P)=K(P)-0(P)

Для выигрышных позиций L(P)= +

Для проигрышных позиций L(P)= -

При построении порожденных вершин будем учитывать симметрию.

Для поиска лучшего хода применяется минимаксная процедура:

Если первому игроку нужно выбрать лучший ход, то он выбирает тот ход, который соответствует вершине с наибольшей оценкой, следовательно вершинам типа И приписываются оценочные функции, равные максимуму оценок концевых вершин. Если ход выбирает второй игрок, то он выбирает вершину с наименьшей оценкой, т.к. все оценки выбираются с точки зрения первого игрока. Таким образом для вершины типа ИЛИ приписывают минимум оценок концевых вершин, после этого процесс переносится на уровень выше. Такое прослеживание продолжается до вершин, порожденных начальной вершиной. Значения оценочных функций, которые приписываются промежуточным вершинам называются обращёнными величинами. Первый игрок выбирает лучший ход, который соответствует порождённой вершине с наибольшей обращённой величиной.

ПРИМЕР:

Глубина просмотра равна двум.

15.3 IP-адресация. Деление сетей на подсети. Объединение сетей.

IP-адрес определяет местонахождение узла в сети. Каждый IP-адрес состоит из двух частей - идентификатора сети (network ID) и идентификатора узла (host ID). Первый определяет физическую сеть. Он одинаков для всех узлов в одной сети и уникален для каждой из сетей, включенных в объединенную сеть. Идентификатор узла соответствует конкретной рабочей станции, серверу, маршрутизатору или другому TCP/IP-узлу в данной сети. Он должен иметь уникальное значение в данной сети. Каждый узел TCP/IP однозначно определяется по своему IP-адресу. Он может быть записан в двух форматах - двоичном и десятичном с точками, имеет длину 32 бита и состоит из четырех октетов, которые отделяются друг от друга точками.

Классы IP-адресов

Каждый класс IP-адресов определяет, какая часть адреса отводится под идентификатор сети, а какая под идентификатор узла.

Сообщество Интернета определило пять классов IP-адресов в соответствии с различными размерами компьютерных сетей. Microsoft TCP/IP поддерживает адреса классов A,B и C. Класс адреса определяет, какие биты относятся к идентификатору сети, а какие - к идентификатору узла. Также он определяет максимально возможное количество узлов в сети.

Класс IP-адреса идентифицируют по значению его первого октета. 32-разрядные IP-адреса могут быть присвоены в общей совокупности 3 720 314 628 узлам.

Класс A Адреса класса A назначаются узлам очень большой сети. Старший бит в адресах этого класса всегда равен 0. Следующие семь бит первого октета представляют идентификатор сети. Оставшиеся 24 бита содержат идентификатор узла. Это позволяет иметь 126 сетей с числом узлов до 16 777 214 в каждой.Диапазон значений идентификаторов сети 1-126.

Класс B Адреса класса B назначаются узлам в больших и средних по размеру сетях. В двух старших битах адреса этого класса записывается двоичное значение 10. Следующие 14 бит содержат идентификатор сети. Оставшиеся 16 бит представляют идентификатор узла. Это позволяет иметь 16 384 сетей класса B с числом узлов до 65 534 в каждой. Диапазон значений идентификаторов сети 128-191.

Класс C Адреса класс C применяются в небольших сетях. Три старшие бита в адресах этого класса всегда содержат двоичное значение 110. Следующие 21 бит представляют идентификатор сети. Оставшиеся 8 бит отводится под идентификатор узла. Это позволяет иметь 2 097 152 сетей класса C с числом узлов до 254 в каждой. Диапазон значений идентификаторов сети 192-223. В качестве идентификатора сети не может использоваться значение 127. Оно зарезервировано для диагностики и используется в качестве локальной заглушки.

Класс D Адреса класса D предназначены для рассылки групповых сообщений. Группа получателей может содержать один, несколько или ни одного узла. Четыре старших бита в IP-адресе класса D всегда равны 1110. Оставшиеся биты означают конкретную группу получателей и не разделяются на части. Класс E Экспериментальный класс. Зарезервирован для использования в будущем и в настоящее время не используется. Четыре старших бита такого адреса установлены в 1111.

Идентификатор сети не может равняться 127. Это значение зарезервировано для локальной заглушки и диагностики. Все биты идентификатора сети или узла не могут быть одновременно установлены в 1. Такой идентификатор применяется для широковещательных сообщений. Все биты идентификатора сети или узла не могут быть одновременно установлены в 0. В этом случае идентификатор означает всю локальную сеть. Каждый идентификатор узла должен быть уникальным для соответствую- щего идентификатора сети.

Подсети. Подсеть- это физический сегмент TCP/IP сети, в котором используются IP-адреса с общим идентификатором сети. Для того, чтобы разделить сеть на несколько подсетей, необходимо использовать различные идентификаторы сети (подсети) для каждого сегмента. Уникальные идентификаторы подсетей создаются путем разбиения идентификатора узла на две группы бит. Такой механизм называется делением на подсети. Деление на подсети не является необходимым для изолированной сети. Применяя подсети можно: совместно использовать различные сетевые технологии (Ethernet,Token Ring); преодолеть существующие ограничения, например на максимальное количество узлов в одном сегменте; уменьшить нагрузку на сеть.

Маски подсетей .Маска подсети необходима каждому узлу TCP/IP. Маска подсети - это 32-разрядное значение, используемое для выделения из IP-адреса его частей: идентификаторов сети и узла. Такая процедура необходима при выяснении того, относится тот или иной IP-адрес к локальной или удаленной сети. В маске подсети биты, соответствующие идентификатору сети, устанавливаются в 1. Все биты, соответствующие идентификатору узла, устанавливаются в 0. Возможные идентификаторы подсети комбинируются из тех бит в адресе узла, которые используются в маске подсети.

Объединение нескольких сетей

Чтобы пространство идентификаторов сетей не было исчерпано, организации, координирующие развитие Интернета, разработали схему объединения сетей. В отличие от деления на подсети, при объединении сетей часть бит идентификатора сети маскируется как идентификатор узла - это увеличивает эффективность маршрутизации. Например, вместо того, чтобы предоставить 1 идентификатор сети класса B организации, имеющей 2 000 узлов, InterNIC выделяет ей 8 идентификаторов сетей класса C. Каждая такая сеть может содержать до 254 узлов, что в совокупности обеспечивает 2 032 идентификатора узлов.

Таким образом экономятся идентификаторы сетей класса B. Однако эта технология порождает следующую проблему. При использовании обычных механизмов маршрутизации, маршрутизаторы в Интернете должны поддерживать еще 7 дополнительных записей в своих таблицах, чтобы направлять пакеты в сеть подобной организации. Для разгрузки маршрутизаторов была разработана технология безклассовой маршрутизации, которая позволяет объединить все 8 записей таблицы маршрутизации в 1, относящуюся одновременно ко всем выделенным организации сетям класса С.

15.4

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

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

// Структура, описывающая элемент стека

struct stack {

char info;

stack* prev;

stack() { prev=0; info=0; }

};

// Указатель на вершину стека

stack *stack_top=0;

// Проверка содержимого вершины стека

int top()

{

if(stack_top==0)

return(0);

return(stack_top->info);

}

// Добавление элемента в стек

void push(char value)

{

stack *p = new stack;

p->info = value;

p->prev = stack_top;

stack_top = p;

}

// Снятие верхнего элемента стека

char pop()

{

char value;

stack *p;

value = stack_top->info;

p = stack_top->prev;

delete stack_top;

stack_top = p;

return(value);

}

// проверка стека на пустоту

int empty()

{

if(stack_top==0) return(1);

return(0); }

// запись строки в файл

void write_file(char string[])

{

int fh2;

unsigned byteswritten;

if((fh2 = _open("str2.dat", _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE)) != -1) {

if((byteswritten = _write(fh2, string, strlen(string))) == -1)

perror("Write failed");

else

printf("Wrote %u bytes to file\n", byteswritten);

}

_close(fh2);

}

char buffer[100];

void main()

{

int fh;

unsigned int i, cnt=0, nbytes = 100, bytesread;

/* Open file for input: */

if((fh = _open("str1.dat", _O_RDONLY)) == -1)

{

perror("open failed on input file");

exit(1);

}

/* Read in input: */

if((bytesread = _read(fh, buffer, nbytes)) <= 0) {

perror("Problem reading file");

exit(1);

}

char str[100];

memset(str,0,100);

for(i=0; i<bytesread; i++) {

if(buffer[i]==0x0a) {

while(!empty()) {

cnt += sprintf(str+cnt, "%c", pop());

}

cnt += sprintf(str+cnt, "%c", 0x0a);

}

else {

push(buffer[i]);

}

}

write_file(str);

while(!empty()) {

printf("%c ", pop());

}

printf("\n");

_close(fh); }

--15.5 Создать триггер, который запрещает удаление зала, если в нем есть картины

--Картины(Инв№,Нзвание,Художник,Размеры,КодЗала)

--Художники(Фамилия,ДатаРожд,ДатаСмерти,Страна,Течение)

--Залы(КодЗала,Название,Этаж,Площадь)

CREATE TRIGGER TR1

ON DELETE FROM Залы

AS

IF EXISTS(

SELECT *

FROM deleted,Картины

WHERE deleted.КодЗала=Картина.КодЗала

)

BEGIN

ROLLBACK TRAN

PRINT('В зале есть картины. Удаление невозможно')

END