183400 (743546), страница 5
Текст из файла (страница 5)
Спочатку працівники виборчого органу вносять загальну інформацію: кількість виборців у даному окрузі та кількість кандидатів. Далі заносяться імена кандидатів і вказується спосіб занесення профілів переваг: кожним виборцем окремо чи працівниками виборчого округу. В останньому випадку інформація є згрупована (аналогічно до контрольного прикладу).
Внизу екрана виводяться імена усіх кандидатів. Кожен виборець (чи працівник виборчого округу) вносить профіль переваг, розташовуючи кандидатів у строго визначеному порядку.
Для кожного виборця не допускається випадків байдужості; крім того, кандидати повинні бути строго ранджовані (тобто кожен з них займає своє місце у перевазі виборця, і на одному рівні не можуть знаходитись два кандидати). Імена кандидатів, які заносяться виборцями, повинні співпадати з іменами, вказаними на початку заповнення інформації.
Після занесення усіх цих даних видається результат роботи програми.
Спочатку виводиться переможець Копленда і вказується, чи він визначений із збереженням нейтральності. Для переможця вказується його оцінка. У противному випадку виводиться множина переможців (кандидатів, сума очок яких дорівнює максимальній оцінці).
Аналогічно визначається переможець Борда.
Як буде показано у контрольному прикладі, оцінки кандидатів, отриманих за правилами Борда і Копленда, можуть ранджуватись у протилежному порядку.
-
-
Контрольний приклад
Нехай дано наступний профіль для 9 виборців і 5-ти кандидатів:
1 | 4 | 1 | 3 |
a b c d e | c d b e a | e a d b c | e a b d c |
У кожному стовпці кандидати розташовані у порядку зменшення їх значущості для кожної групи виборців. Тобто, для першого стовпця можна визначити переваги наступним чином: група виборців, що складається з однієї особи, вважає кандидата a найкращим. На другому місці вони ставлять кандидата b, на третьому місці c і т.д.
Продемонструємо розв’язок контрольного прикладу за правилом Копленда. Визначаємо оцінку Копленда.
Кандидат a є кращим за b для 1+1+3 виборців, а для 4-х виборців кандидат b є кращим за a. Визначимо такі переваги для кожного кандидата, порівняємо його з усіма іншими.
ab – 5 ac – 5 ad – 5 ae – 1 | ba – 4 ca – 4 da – 4 ea – 8 | bc – 5 bd – 4 de – 5 | cb – 4 db – 5 eb – 4 | cd – 5 ce – 5 | dc – 4 ec – 4 | de – 5 | ed – 4 |
Визначимо оцінку Копленда для кожного кандидата. Кандидат a є кращим за b (додаємо +1); він також є кращим за c та d (додаємо два рази +1) і гіршим за e (додаємо –1). Отже, оцінка Копленда для a рівна 2.
Знайдемо оцінку для інших кандидатів.
a=+1+1+1-1=2
b=-1+1-1+1=0
c=-1-1+1+=0
d=-1+1-1+1=0
e=+1-1-1-1=-2
Серед отриманих оцінок визначаємо максимальну. Як бачимо, вона дорівнює 2 і належить кандидату a. Отже, a – переможець Копленда.
Якби у нас отрималось два кандидати з максимальною оцінкою, наприклад b та f, ми б обрали кандидата b, так як він розташований ближче за алфавітом.
Для цього ж профілю знайдемо переможця Борда.
Отже, отримуємо такі оцінки:
a=1*4+4*0+1*3+3*3=16
b=3*1+2*4+1*1+2*3=18
c=2*1+4*4+0+0=18
d=1*1+4*3+2*1+1*3=18
e=1*4+1*4+3*4+0=20
Переможцем за Борда є кандидат е.
Як бачимо, оцінки Борда ранджують кандидатів у порядку, протилежному до того, який отримується за оцінками Копленда.
-
-
ВИСНОВКИ
Дана курсова робота була присвячена огляду методів голосування більшістю голосів. Було проведено порівняльну характеристику кожного з методів і з їх множини обрано найкращі. До них відносяться
-
заможні за Кондорсе правила Копленла і Сімпсона, дерево багатоетапного виключення;
-
один з методів підрахунку очок – правило Борда.
Всі ці правила задовольняють умовам оптимальності за Парето, монотонності та анонімності. Крім того, правило Борда задовольняє також аксіомі участі та поповнення.
Для програмної реалізації було обрано методи Копленда і Борда.
Результати роботи програми продемонстровано на контрольному прикладі.
-
-
СПИСОК ЛІТЕРАТУРИ
-
Мулен Э. “Кооперативное принятие решений: Аксиомы и модели” – Москва, Мир, 1991.
-
Миркин Б. Проблема групового выбора. – Москва, Наука, 1974.
-
-
ДОДАТКИ
-
Програма
-
uses wincrt;
label y, z;
type mas = string[6];
type ball =array[1..10] of shortint;
var N: byte; {к-ть виборцiв}
M: byte; {к-ть кандидатiв}
s: byte; {к-ть груп}
rang: array[1..10,1..100] of mas; {профiль переваг}
k,i,j,l,r,contrl: byte;
a,b: byte; {для проведення парних порiвнянь}
kopl: ball; {масив оцiнок Копленда}
vybor1, vybor2: mas;
bord: ball; {масив оцiнок Борда}
name: array[1..10] of mas; {масив iмен кандидатiв}
many: array[1..100] of byte; {масив груп виборцiв}
n1: array[1..10] of mas;
c: char;
{дані контрольного прикладу}
{---------------------------}
procedure example;
var i, j: byte;
begin
clrscr; M:=5; n:=9; s:=4;
name[1]:='a'; name[2]:='b'; name[3]:='c'; name[4]:='d'; name[5]:='e';
many[1]:=1; many[2]:=4; many[3]:=1; many[4]:=3;
rang[1,1]:='a'; rang[1,2]:='c'; rang[1,3]:='e'; rang[1,4]:='e';
rang[2,1]:='b'; rang[2,2]:='d'; rang[2,3]:='a'; rang[2,4]:='a';
rang[3,1]:='c'; rang[3,2]:='b'; rang[3,3]:='d'; rang[3,4]:='b';
rang[4,1]:='d'; rang[4,2]:='e'; rang[4,3]:='b'; rang[4,4]:='d';
rang[5,1]:='e'; rang[5,2]:='a'; rang[5,3]:='c'; rang[5,4]:='c';
gotoXY(15,1);
writeln('Завдання контрольного прикладу');
writeln; writeln('Число виборців: ', N);
writeln('Число кандидатів: ', M);
writeln('Профіль переваг:');
for i:=1 to 40 do
write('-');
writeln; write('Число виборців ');
gotoXY(19,7);
for i:=1 to s do
write(many[i], ' ');
writeln; gotoXY(19,9);
for i:=1 to M do
begin
for j:=1 to s do
write(rang[i,j], ' ');
gotoXY(19, 9+i);
end;
gotoXY(1,15);
end;
{---------------------------}
{перевіряє правильність вводу варіанту вибору}
procedure right;
label l;
begin
l: readln(c);
if (c<>'0') and (c<>'1') then
begin
write('Повторіть спробу: ');
goto l;
end;
end;
{---------------------------}
{виводить список імен кандидатів}
procedure help;
var x,y,i: byte;
begin
x:=WhereX;
y:=WhereY;
gotoXY(1,24);
write('Імена кандидатів: ');
for i:=1 to M do
if i<>M then write(name[i], ', ')
else write(name[i]);
gotoXY(x,y);
end;
{---------------------------}
{визначення переможця виборів}
procedure victory(v: ball; s: string);
var max, t: shortint;
hl: array[1..10] of byte;
begin
{визначення максимальної оцiнки}
help;
max:=v[1];
for i:=1 to M do
if max max:=v[i]; t:=1; {визначення кандидатiв з максимальною оцiнкою} for i:=1 to M do if (v[i]-max)=0 then begin hl[t]:=i; t:=t+1; end; if (t-1)=1 then begin write('Переможець за ', s, ' iз збереженням нейтральностi: '); writeln(name[hl[1]]); writeln('Сума очок - ', max); end else begin vybor1:=name[hl[1]]; for i:=2 to t-1 do if name[hl[i]] vybor1:=name[hl[i]]; write('Переможець за ', s, ' без збереження нейтральностi: '); writeln(vybor1); writeln('Сума очок - ', max); writeln('обраний з множини найкращих:'); for i:=1 to t-1 do writeln(name[hl[i]]); end; end; {---------------------------} {основна програма} begin gotoXY(21,1); writeln('Визначення переможця виборів'); writeln; writeln('Запуск контрольного прикладу - 1; Самостійне внесення профілю - 0'); right; if c='1' then begin example; help; goto z; end else clrscr; write('Введiть кiлькiсть кандидатiв: '); readln(M); write('Введiть кiлькiсть виборцiв: '); readln(N); writeln('Введiть iмена кандидатiв'); for i:=1 to M do begin write('Кандидат ', i, ': '); readln(name[i]); end; writeln('Як буде здiйснюватись занесення iнформацiї?'); write('1- окремими виборцями, 0- комiтетом: '); right; if c='1' then for i:=1 to N do many[i]:=1; clrscr; writeln('Введiть профiль переваг'); s:=1; contrl:=0; while contrl<>N do begin if c='1' then writeln('Виборець ', s) else writeln('Група ', s); for i:=1 to m do n1[i]:=''; help; for j:=1 to M do begin y:readln(vybor1); {перевірка на коректність введеного профілю} r:=0; a:=0; b:=0; n1[j]:=vybor1; for l:=1 to M do begin if vybor1=name[l] then begin b:=1; for a:=1 to M do {таке ім'я вже було введено у даному профілі} if (vybor1=n1[a]) and ((a-j)<>0) then r:=1; end; {ім'я введеного кандидата не співпадає із жодним із списку} if (vybor1<>name[l]) and (l=M) and (b<>1)then r:=1; end; if r=1 then begin n1[j]:=''; writeln('Уважно вводьте імена кандидатів'); goto y; end else rang[j,s]:=vybor1; {профіль коректний} end; if c='0' then begin writeln('Кiлькiсть виборцiв у групi ', s); readln(many[s]); contrl:=contrl+many[s]; end else contrl:=contrl+1; s:=s+1; clrscr; end; {while} {Визначення оцiнок Копленда} z: contrl:=1; while contrl<=M do begin k:=contrl+1; vybor1:=name[contrl]; vybor2:=name[k]; while k<=M do begin i:=1; a:=0; b:=0; while i<=s do begin for j:=1 to M do if rang[j,i]=vybor1 then l:=j else if rang[j,i]=vybor2 then r:=j; if l else if l>r then b:=b+many[i]; i:=i+1; end; if a>b then begin kopl[contrl]:=kopl[contrl]+1; kopl[k]:=kopl[k]-1; end else if a begin kopl[k]:=kopl[k]+1; kopl[contrl]:=kopl[contrl]-1; end; k:=k+1; vybor2:=name[k]; end; {while по k} contrl:=contrl+1; end; {while по contrl} {визначення оцiнок Борда} for i:=1 to s do for j:=1 to M do begin for k:=1 to M do if rang[j,i]=name[k] then r:=k; bord[r]:=many[i]*(M-j)+bord[r]; end; victory(kopl, 'Коплендом'); writeln ('Натисніть будь-яку клавішу '); readkey; writeln; victory(bord, 'Борда'); end. Результати роботи програми Введіть кількість кандидатів: 5 Введіть кількість виборців: 9 Введіть імена кандидатів Кандидат 1: а Кандидат 2: b Кандидат 3: c Кандидат 4: d Кандидат 5: е Як буде здійснюватись занесення інформації? 1-окремими виборцями, 0 – комітетом: 0 Введіть профіль переваг Група 1 a b c d e Кількість виборців у групі 1: 1 Група 2 c d b e a Кількість виборців у групі 2: 4 Група 3 e a d b c Кількість виборців у групі 3: 1 Група 4 e a b d c Кількість виборців у групі 4: 3 Переможець за Коплендом із збереженням нейтральності – а Сума очок – 2 Переможець за Борда із збереженням нейтральності – е Сума очок – 20
Самостійне внесення профілю
Демонстрація роботи контрольного прикладу