Skip to content

[Possible feature] randomly transforming a profile into a profile with ties #4

@DominikPeters

Description

@DominikPeters

In our paper on defining IRV and STV for weak orders, we needed to sample random weak-order profiles. We did this using a "coin flip model" and a "radius model", see page 16.

The "coin-flip" method with parameter $p\in [0,1]$ works as follows: in an order $\succ$, for each pair of consecutively ranked candidates $a$ and $b$, we add a tie between them (and thus put them in the same indifference class) with probability $p$. For example, for the linear order $a \succ b \succ c \succ d$ we throw 3 independent coins, one for each occurrence of the $\succ$ symbol, and replace a strict preference by an indifference when the coin comes up heads (which happens with probability $p$). If the coins come up tails, heads, tails, the resulting weak order is ${a} \succ {b, c} \succ {d}$.
The "radius" method is specific to Euclidean models, in which voters $v$ and candidates $c$ are placed in random locations $p(v), p(c) \in \mathbb{R}^d$ in Euclidean space. The method is parameterized by a radius $r \ge 0$, which from the perspective of voter $v$ divides the candidates into sets $C_k = {(k-1)r \le |p(c)-p(v)| < kr}$. This produces the weak order $C_1 \succ C_2 \succ \dots$ for voter $v$.

This could be a useful addition to the prefsampling package.

Our code for the coin-flip strategy:

n_voters, n_candidates = len(orders), len(orders[0])
## Merge the candidates in orders:
weak_orders = []
for order in orders:
    weak_order = [[order[0]]]
    for i in range(1, n_candidates):
        if np.random.rand() > p:
            weak_order.append([order[i]])
        else:
            weak_order[-1].append(order[i])
    weak_orders.append(weak_order)

return weak_orders

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions