----- Message ---------
Date: 2018-07-08 21:26
寄件者: Kun-Mao Chao
收件者: K
主旨: Condorcet Winner 程式碼

K 好:

分享的程式碼已收到,謝謝。你很有研究精神,我一定要按個讚!

多保重,有空常回來。

坤茂

--------------
Date: Sun, 8 Jul 2018 18:55:24 +0800
From: K
Subject: Condorcet Winner 程式碼
To: Kun-Mao Chao

趙老師您好,
我將程式碼整理好了,包括用python繪圖的程式碼。
我假設您的電腦是 Windows系統但是有安裝 gcc 、 python 和 make。
程式碼用make指令編譯完成後,即會產生執行檔 main.exe,
main.exe 的執行方法是
main.exe input.txt output.txt
務必要輸入後面兩個參數,否則程式不會繼續執行 ( 當然這兩個參數指定的檔名是可以變動的)
input.txt 就是某個 decision file,main會判定這個decision是不是 envy-free,如果是的話,繼續判定是不是
Condorcet Winner,
如果不是的話,就會把 max margin 和 simple rival 的資訊寫到 output.txt
用 python show_test_result.py output.txt
可以看到 simple rival 分布的大致情況,不過執行環境需要有 matplotlib
如果有安裝python但還沒裝過matplotlib,可執行以下指令安裝matplotlib :
python -m pip install matplotlib

至於另一個 python 程式碼檔案 show_decision.py 主要是用來展示 decision 的大致模樣,
使用方法為 python show_decision.py decisionFile.txt

python 程式碼的兩個檔案:
show_decision.py 的結尾的部分 和 show_test_result.py 的開頭的部分都有這兩行 :
mng = plt.get_current_fig_manager()
mng.window.state('zoomed')
這主要是將繪圖的視窗自動最大化,但是跟當前的作業系統和python的環境有關,
如果無法執行,可以參考以下的連結來找尋其他替代辦法 :
https://stackoverflow.com/questions/12439588/how-to-maximize-a-plt-show-window-using-python
當然如果不想要視窗最大化,可以直接註解或刪掉那兩行。

繪圖的結果會因為 voter 數量的多寡而有一些幾何形狀上的變形,
比方說當voter數比較多或是範圍比較廣的時候,箭頭的符號就會變不明顯,整個箭頭會看起來像一條直線。

我另外也附加了六個 decision file 用以測試 main 和展示繪圖的功能,
這六個file分別是 input1.txt ~ input6.txt

這一些 decision 之中有 Condorcet Winner , 也有不是 envy-free的,當然主要是以存在 simple rival的
decision 為主,
不管是哪一種 decision ,執行完後寫入在 output.txt (檔名可以自取) 的資訊都可以用 show_test_result.py
來展示。

原本我是用 C 來撰寫主要的程式碼,不過因為後來要引入新的 Dynamic Programming 演算法,
但是檢查邊界條件的程式碼寫起來非常繁雜,也容易出錯,所以我決定設計一個 ExtentInt 類別,
主要是模擬一般的整數,但是包含正負無窮大,同時搭配上 C++ 的 operator overloading,
我就能夠直接拿一般的整數去和 ExtentInt 作加減法和比大小,寫法就如同是兩個整數在做運算,
如此一來我可以將 Dynamic Programming 用的表格的每一項都一開始設定為負無窮大,
這麼一來就不用去檢查邊界條件了。
所以後來我就將主要的C程式碼改寫成 C++ 的版本。

K