Малка програмка, която брои разпределението на мандатите в избори 2013

12.05.2013
Здравейте,
Бях помолен да конвертирам една малка програмка, която изчислява спечелените мандати по райони, съгласно методиката на ЦИК използвана в парламентарните избори сега - 12 Май 2013-та година.
Оригиналната програма бе написана на Visual Basic за Excel, и не можеше да се ползва от стандартен Browser.
Резултата може всеки да види сложен ето тук - https://www.bivol.bg/bg-elections-code.html

Програмката е "standalone", не изисква сървър и може да се ползва от всеки HTML5 съвместим browser (IE10, Firefox 20, Safari 5.1, Opera 12.10, Chrome 23 или по-нов).

Отне ми 3-4 дни, като понеже пътувах през цялото време, и имах и други задължения успявах да отделям пряко сили по около час на ден, а и отделно нямах Excel та съм "тествал и дебъгвал" на ум. Та не ми се събира дори един работен ден. Доколкото разбрах подобно време са отделили и тези, които са писали оригиналният код на VB. Поради това, не мога да не отбележа, че не разбирам защо цената на същият този труд положен от ИО е толкова висока. Вероятно се извършват и други дейности освен броенето, които не са ми известни. Но по-вероятно говорим и за скрита под формата на конкурс държавна субсидия за частна компания, държавна собственост.

Също така не разбирам защо ИО не публикува (отвори) кода на своята програмка. Приказките за фалшифициране на изборите от това са абсолютни глупости, и толкова плиткоумни обяснения, че просто нямам думи. Такова обяснение предполага, че едва ли не, сега като съм написал същата програма, изборите може да се фалшифицират? А защо ни е нужна и програма, всеки с калкулатор и методиката на ЦИК (която е публична), може да отиде в тоалетната и тайно, докато седи там да фалшифицира изборите? Стига глупости. По скоро говорим за срама от - липсата на такава програма, или нежеланието да се види тя, за да се оцени реалният труд необходим за броенето, или срама от друго.

Казаха ми, че имало и конкурс обявен сега (не разбрах дали от ИО) за програма с отворен код, която да брои изборите. Приложената тук програма, реално може да го направи това, и не изисква сървъри, операционни системи, бази с данни, може да импортира файлове, включително може да импортира и файловият формат на ИО (така както ми бе обяснен). Аз персонално няма да я публикувам в този конкурс.

Искам да отбележа, че VB за Excel си има своите специфики, сили и особености, докато JS си има друг стил. Неща написани по определен начин на VB няма да работят ефективно на JS, или няма да изглеждат като "красив код", ако са написани по същият начин.
Все пак JavaScript е най-бързият интерпретируем програмен език в света в момента (осезаемо по-бърз от Java) - за пример, погледнете проекта emscripten, където програми на C се компилират до асемблер, който пък се интерпретира от интерпретатор написан на JavaScript, и полученият резултат работи само около 2-3 пъти по-бавно от оригиналната програма, което е потресаващо бързо (за такъв крайно неефективен път на изпълнение). При директен wrapping (много по-труден за реализация обаче), кода би бил със сравнима скорост на C/C++.
За това поради ефективността на JavaScript интерпретаторите, няма да видите колко неефективно работи написаният изборен код. Реално той може да се съкрати поне 3 пъти и да се разбърза поне 10 пъти, ако се напише "както трябва", да не говорим колко по-красиво и четимо би изглеждал. Но поради това, че ми липсваше Excel, и дори методиката на ЦИК (подаденият ми URL връщаше постоянно грешка 404), аз реших да съм консервативен и да следвам оригиналният код 1:1. Така или иначе програмата работи "мигновено".

Ще ми се да илюстрирам и колко е мощен съвременният JavaScript и като standalone (виж проекти като NodeJS) и като вграден в броусъри. Особено с HTML5 разширенията, вече има много малко неща, които да не могат да се направят директно на JavaScript. В този код, аз използвам само няколко реда, с които реализирам импортирането на CSV файла.

Отделно код написан само на JS, без сървърна част, работи без да товари сървъри и теоретично може да има безкрайна скалируемост.

Ако говорим за JS в Browser-и, все пак имаме значителни ограничения, наложени от средата, API-тата, идеите за сигурността (макар както казах HTML5 да отваря много врати). Обаче на NodeJS вече можете да правите дори системно или дори почти embedded програмиране на JavaScript.

Методиката на ЦИК е математически неиздържана. Тъй като мандатите първо се раздават глобално, а после се опитват да се напаснат върху МИР-овете, може да се образуват проблеми като - преразпределяне на отрицателен мандат (спечелен мандат да се отнеме на партия, който проблем случай по случай се решава от ЦИК) или пък (по-честият случай) може дадена партия, получила дори 0 гласа в даден МИР, да вземе мандат там поради преразпределение от друг район. Ние имаме таблица, която показва с bold спечеленият оригинално мандат, и после със синьо и червено пътят на преразпределението му (през следващият с най-много гласове, и т.н. докато се напаснат). Ако погледнете тестовете с примерните данни от изборите през 2009-та, ще видите че едва ли не преразпределенията са били на всякъде. Така партии, които практически са спечелили даден МИР, може да не са спечелили мандат, защото на друга партия е прехвърлен такъв тук. В много ситуации, може да се получи неразрешим проблем, при който за да се продължи изпълнението трябва да се реши как да се преразпределят гласовете на ръка. Така се получава ситуация, в която ЦИК реално субективно преценява кой да получи мандат и къде, чрез гласуване. Следователно пристрастието на членовете на ЦИК, може да има значение, а те са партиино избрани лица, и най-вероятно биха преферирали своите (традиционните) партии, пред новите формации, дори последните реално да имат повече гласове за мандат. Личното ми мнение е, че в една систематична поредица, от изключително лоши алгоритми за разпределение на мандатите преди, то тази година ние сме постигнали още по-голям връх и имаме най-лошият алгоритъм от всички, които сме имали до сега. Това е впечатляващо постижение, което заслужава своето уважение.

Източник: Делян Делчев

ТВ програма

Кино

  • Сега България в 60 минути с Мариана...
  • 18:00 По света и у нас
  • 18:30 Още от деня коментарно предаване
  • 19:00 Последният печели...
  • 20:00 По света и у нас
  • 20:45 Спортни новини
  • 21:00 Панорама с Бойко Василев
  • 22:00 Следите остават
  • Сега "Лице в лице" - публицистично...
  • 18:00 "Стани богат" - телевизионна игра с...
  • 19:00 bTV Новините - централна емисия
  • 20:00 "Аз обичам България" - забавна...
  • 22:30 "Dancing Stars Extra" - зад...
  • 23:00 bTV Новините - късна емисия
  • 23:30 "Разобличаване" - сериал, с.3, еп.10
  • 00:40 "Дъф и Вазовски" - сериал, с.2,...
  • Сега "Семейни войни" - телевизионна игра
  • 18:00 "Сделка или не" (премиера) -...
  • 19:00 Новините на NOVA - централна емисия
  • 20:00 "Един за друг" (нов сезон) -...
  • 22:00 "Шеф под прикритие" (нов сезон) -...
  • 23:00 Новините на NOVA
  • 23:30 "Военни престъпления: Лос...
  • 00:30 "911" - сериал, сезон 2
Какво е общото между цигарите и мазнините по корема Анализът им показва, че започването на пушенето и пушенето през целия живот е свързано с увеличаване на коремните мазнини.
Валидни за 26.04.2024
 1 USD = 1.82447 BGN  100 JPY = 1.17284 BGN  1 GBP = 2.28285 BGN  1 CHF = 1.99738 BGN
Какво е общото между цигарите и мазнините по корема Анализът им показва, че започването на пушенето и пушенето през целия живот е свързано с увеличаване на коремните мазнини.