如何在python中生成每条染色体之和等于1的随机矩阵值染色体?

How can I generate random matrix value chromosome in python which the sum of each chromosome equals to 1?

我想生成随机矩阵染色体,最大值为1.0,最小值为0,大小为10,每行等于1。

我在矩阵中使用 random.uniform 随机化染色体,最大值为 1.0,最小值为 0,大小为 10。如果我希望每一行都等于 1,我需要怎么做?谢谢。

输入

import random
import numpy

def create_reference_solution(chromosome_length):
    reference = numpy.random.uniform(low=0, high=1.0, size=(10,chromosome_length))  # Create array chromosome
    return reference
print(create_reference_solution(4))  # print array

输出

[[0.49610843 0.73632368 0.38089333 0.38195847]
 [0.97371743 0.8245768  0.7576383  0.69000418]
 [0.57430261 0.02274222 0.36947273 0.69866079]
 [0.89639171 0.69387191 0.23348819 0.98811965]
 [0.14153835 0.10603574 0.25907029 0.349709  ]
 [0.04914772 0.54748797 0.18464009 0.99592558]
 [0.09897709 0.71638782 0.31578413 0.15487327]
 [0.19852756 0.5675573  0.09665754 0.27815583]
 [0.9085627  0.0907393  0.0585448  0.00976053]
 [0.05092392 0.46098409 0.12467901 0.48316205]]

您可以创建一个介于 0 和 1 之间且比您的染色体长度小 1 的随机数数组。对列表进行排序,然后找出 0 和第一个、第一个和第二个...最后一个和 1.0 之间的差异。您可以将这些视为单元的划分。 np.diff() 对此很方便,因为您可以在前面加上 0 并附加 1 以获得您想要的内容。

例如:

import numpy as np

chromosome_length = 4
reference = np.random.uniform(low=0, high=1.0, size=(10,chromosome_length - 1))  # Create array chromosome
reference.sort(axis = 1)

diffs = np.diff(reference, prepend=0, append=1, axis=1)
print(diffs)
np.sum(diffs, axis=1)

diffs 将类似于:

[[0.33912643 0.06899929 0.39308693 0.19878736]
 [0.09431517 0.1920815  0.5591725  0.15443084]
 [0.13874118 0.05951455 0.45170353 0.35004074]
 [0.07826248 0.09976879 0.27325618 0.54871255]
 [0.01879091 0.28365535 0.5275187  0.17003504]
 [0.13071614 0.60090562 0.1776917  0.09068653]
 [0.03938235 0.59978608 0.00799955 0.35283202]
 [0.14483008 0.51857752 0.31868394 0.01790846]
 [0.42866068 0.12372462 0.07070687 0.37690784]
 [0.25118504 0.10828291 0.45142439 0.18910767]]

行的总和是:

array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])