private static void SatisfyAllParties(List<PartyCalcInfo> partiesWithCalcInfo, MirPartyCalcInfo[,] mirPartyTable)
{
Logger.logger.Info("");
Logger.logger.Info("== Преразпределяне на мандати за неудовлетворените партии== ");
Logger.logger.Info("Текущо състояние:");
Logger.logger.InfoFormat("{0,5} : [{2,15}] {1,10} {3,11}", "No.", "Разпр. от райони", "Нац. ниво", "Необходими");
foreach (var party in partiesWithCalcInfo)
{
Logger.logger.InfoFormat("{0,5} : [{2,15}] {1,10} {3,11}", party.PartyId, party.MandatesByMirsAll, party.MandatesAll, party.MandatesByMirsUnncessary);
}
while (partiesWithCalcInfo.Count(p => p.MandatesByMirsUnncessary < 0) > 0)
{
int minUsedCoefI = 0;
int minUsedCoefJ = 0;
decimal minUsedCoef = 1.0M;
bool hasMinUsedCoef = false;
for (int i = 0; i < mirPartyTable.GetLength(0); i++)
{
for (int j = 0; j < mirPartyTable.GetLength(1); j++)
{
//min used coef
if (partiesWithCalcInfo[j].MandatesByMirsUnncessary > 0)
{
if (mirPartyTable[i, j].IsMandateCoefHareRUsed
&& !mirPartyTable[i, j].IsMandateCoefHareRUsed2)
{
if (mirPartyTable[i, j].MandateCoefHareR < minUsedCoef)
{
minUsedCoef = mirPartyTable[i, j].MandateCoefHareR;
minUsedCoefI = i;
minUsedCoefJ = j;
hasMinUsedCoef = true;
}
}
}
}
}
int maxUnsedCoefI = 0;
int maxUnsedCoefJ = 0;
decimal maxUnsedCoef = 0.0M;
bool hasMaxUnusedCoef = false;
//find max unused coef
if (hasMinUsedCoef)
{
int i = minUsedCoefI;
for (int j = 0; j < mirPartyTable.GetLength(1); j++)
{
//max unused coef
if (!mirPartyTable[i, j].IsMandateCoefHareRUsed
&& !mirPartyTable[i, j].IsMandateCoefHareRUsed2)
{
if (mirPartyTable[i, j].MandateCoefHareR > maxUnsedCoef)//> only because parties are sorted by ID
{
maxUnsedCoef = mirPartyTable[i, j].MandateCoefHareR;
maxUnsedCoefI = i;
maxUnsedCoefJ = j;
hasMaxUnusedCoef = true;
}
}
}
//update for mandates
if (hasMaxUnusedCoef)
{
mirPartyTable[minUsedCoefI, minUsedCoefJ].MandatesAdditional--;
partiesWithCalcInfo[minUsedCoefJ].MandatesGivenByMirsAdditional--;
mirPartyTable[minUsedCoefI, minUsedCoefJ].IsMandateCoefHareRUsed2 = true;
mirPartyTable[maxUnsedCoefI, maxUnsedCoefJ].MandatesAdditional++;
partiesWithCalcInfo[maxUnsedCoefJ].MandatesGivenByMirsAdditional++;
mirPartyTable[maxUnsedCoefI, maxUnsedCoefJ].IsMandateCoefHareRUsed = true;
}
}
Logger.logger.Info("Текущо състояние:");
Logger.logger.InfoFormat("{0,5} : [{2,15}] {1,10} {3,11}", "No.", "Разпр. от райони", "Нац. ниво", "Необходими");
foreach (var party in partiesWithCalcInfo)
{
Logger.logger.InfoFormat("{0,5} : [{2,15}] {1,10} {3,11}", party.PartyId, party.MandatesByMirsAll, party.MandatesAll, party.MandatesByMirsUnncessary);
}
}
}