diff --git a/cmd/main.go b/cmd/main.go index d8e332634ac182dc9b69c9daf694504fdda33743..12e20fe626188782c5dc8456e9166c3aad5dfe4c 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -10,5 +10,7 @@ func main() { //comsoc.Test_maxCount() //comsoc.Test_checkProfile() //comsoc.Test_checkProfileAlternative() - comsoc.Test_MajoritySWF() + //comsoc.Test_MajoritySWF() + //comsoc.Test_sWFFactory() + comsoc.Test_majority() } diff --git a/comsoc/HelpFunctions.go b/comsoc/HelpFunctions.go index fdf1558de2ada2df30618ef0470d711c8eef521f..b5718b2de4303964a92c5ba85560f892708ccdf9 100644 --- a/comsoc/HelpFunctions.go +++ b/comsoc/HelpFunctions.go @@ -5,7 +5,6 @@ import ( "fmt" ) -// cours TODO func plusN(n int) func(i int) int { f := func(i int) int { return (i + n) diff --git a/comsoc/Majority.go b/comsoc/Majority.go index cce9c75820f44b6d837977c2e1094be766dd9dcc..f35f70cf0763c1f523cbdf0faa7762c389b6e576 100644 --- a/comsoc/Majority.go +++ b/comsoc/Majority.go @@ -1,15 +1,18 @@ package comsoc +import ("fmt") -// majorité simple -// fonctions de bien-être social (social welfare function, SWF) : -// retournent un décompte à partir d'un profil -// En utilisation la méthode de la majorité simple +// Majorité simple func MajoritySWF(p Profile) (count Count, err error) { - count = make(Count) err = checkProfileFromProfile(p) if err != nil { return nil, err } +//initialisation de la map : comptes à 0 + count = make(Count,len(p)) + for _,alt := range p[0]{ + count[alt]=0 + } +//actualisation du compte à l'aide du scrutin for _, pref := range p { count[pref[0]]++ } @@ -23,3 +26,12 @@ func MajoritySCF(p Profile) (bestAlts []Alternative, err error) { } return maxCount(count), err } + +func Test_majority() { + profil := GenerateProfile(3, 5) + fmt.Println("Profil :", profil) + count, _ := MajoritySWF(profil) + fmt.Println("Décompte :", count) + //winners, _ := MajoritySCF(profil) + //fmt.Println("Vainqueur(s) :", winners) +} \ No newline at end of file diff --git a/comsoc/TieBreak.go b/comsoc/TieBreak.go index 814c3064a995d6ebdf7b860c8ff0afd698d8a2f0..d9f256567b1de1d8c6c46c084e56dfba2017d783 100644 --- a/comsoc/TieBreak.go +++ b/comsoc/TieBreak.go @@ -62,6 +62,28 @@ func SWFFactory(swf func(Profile) (Count, error), tb func([]Alternative) (Altern } } +func Test_sWFFactory() { + //Définition de l'Ordre strict + orderedAlts := []Alternative{8, 9, 6, 1, 3, 2} + fmt.Println("Ordre strict :", orderedAlts) + + //Construction d'un profil avec alternatives ex aequo + profil := make([][]Alternative, 2) + profil[0] = []Alternative{1, 2, 3, 4, 5, 6} + profil[1] = []Alternative{3, 2, 1, 4, 5, 6} + fmt.Println("Profil :", profil) + + //Construction de la fonction Tie Break + lambda := TieBreakFactory(orderedAlts) + //Construction de la Social Welfare Factory à partir de la fonction swf + la fonction de TieBreak + mu := SWFFactory(MajoritySWF, lambda) + // mu := SWFFactory(BordaSWF, lambda) + //Construction d'une fonction + sorted_alts, _ := mu(profil) + fmt.Println("Alternatives strictement ordonnées selon la méthode de Borda :", sorted_alts) +} + + func SWFFactoryWithOptions( swf func(Profile, []int) (Count, error), tb func([]Alternative) (Alternative, error), @@ -103,30 +125,14 @@ func SWFFactoryWithOptions( } } -func Test_sWFFactory() { - //Définition de l'Ordre strict - orderedAlts := []Alternative{8, 9, 6, 1, 3, 2} - fmt.Println("Ordre strict :", orderedAlts) - //Construction d'un profil avec alternatives ex aequo - profil := make([][]Alternative, 2) - profil[0] = []Alternative{1, 2, 3, 4, 5, 6} - profil[1] = []Alternative{3, 2, 1, 4, 5, 6} - fmt.Println("Profil :", profil) - - //Construction de la fonction Tie Break - lambda := TieBreakFactory(orderedAlts) - //Construction de la Social Welfare Factory à partir de la fonction swf + la fonction de TieBreak - mu := SWFFactory(BordaSWF, lambda) - //Construction d'une fonction - sorted_alts, _ := mu(profil) - fmt.Println("Alternatives strictement ordonnées selon la méthode de Borda :", sorted_alts) -} - -func SCFFactory(scf func(p Profile) ([]Alternative, error), tb func([]Alternative) (Alternative, error)) func(Profile) (Alternative, error) { - return func(p Profile) (Alternative, error) { +func SCFFactoryWithOptions( + scf func(Profile, []int) ([]Alternative, error), + tb func([]Alternative) (Alternative, error), +) func(Profile, []int) (Alternative, error) { + return func(p Profile, o []int) (Alternative, error) { //récupération des meilleures alternatives - bestAlts, errSCF := scf(p) + bestAlts, errSCF := scf(p, o) if errSCF != nil { return Alternative(0), errSCF } @@ -136,13 +142,10 @@ func SCFFactory(scf func(p Profile) ([]Alternative, error), tb func([]Alternativ } } -func SCFFactoryWithOptions( - scf func(Profile, []int) ([]Alternative, error), - tb func([]Alternative) (Alternative, error), -) func(Profile, []int) (Alternative, error) { - return func(p Profile, o []int) (Alternative, error) { +func SCFFactory(scf func(p Profile) ([]Alternative, error), tb func([]Alternative) (Alternative, error)) func(Profile) (Alternative, error) { + return func(p Profile) (Alternative, error) { //récupération des meilleures alternatives - bestAlts, errSCF := scf(p, o) + bestAlts, errSCF := scf(p) if errSCF != nil { return Alternative(0), errSCF } @@ -152,6 +155,7 @@ func SCFFactoryWithOptions( } } + func Test_sCFFactory() { //Définition de l'Ordre strict orderedAlts := []Alternative{8, 9, 6, 1, 3, 2}