Skip to content

Instantly share code, notes, and snippets.

@ljyanesm
Created June 29, 2020 16:06
Show Gist options
  • Save ljyanesm/eeba3fc6d9ffc88a4ff9101fa47b21ce to your computer and use it in GitHub Desktop.
Save ljyanesm/eeba3fc6d9ffc88a4ff9101fa47b21ce to your computer and use it in GitHub Desktop.
Set Cover Problem - Maximum budgeted selection
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import shutil\nimport sys\nimport os.path\nimport textwrap # For pretty printing missing genes\nfrom random import random # Generate random numbers (Costs)\n\n# pyomo is used as the model generator for the solver\nif not shutil.which(\"pyomo\"):\n !pip install --user -q pyomo\n assert(shutil.which(\"pyomo\"))\n\n# cbc/glpk are installed if missing, these are oss solvers\nif not (shutil.which(\"cbc\") or os.path.isfile(\"cbc\")):\n if \"google.colab\" in sys.modules:\n !apt-get install --user -y -qq coinor-cbc\n else:\n if sys.platform == \"darwin\":\n try:\n !brew tap coin-or-tools/coinor\n !brew install coin-or-tools/coinor/cbc pkg-config\n !brew install glpk\n except:\n pass\n else:\n try:\n !conda install -c conda-forge coincbc glpk\n except:\n pass\n\nassert(shutil.which(\"cbc\") or os.path.isfile(\"cbc\"))\nassert(shutil.which(\"glpsol\") or os.path.isfile(\"glpsol\"))\n\nl80_wrap=textwrap.TextWrapper(width = 80)\n\nfrom pyomo.environ import *\nimport pandas as pd # For manipulating the input data",
"execution_count": 77,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Background - Maximising genes covered under a sample budget restriction\n\nThe previous problem could be also intepreted as a maximisation problem where the objective is maximising the number of covered genes using a library based budget.\n\nIn this case the model can be expressed using the previous definitions for $L$, $G$, $X$ and $Y \\subseteq L\\times G$:\n\n\nIn this case costs are associated to each $g_{i,j}$ according to the importance $w_i$ of the presence of this gene when using $l_i$ in the solution.\n\nThe objective is to maximise:\n\n$$\n\\sum_{g \\subseteq G} w_i(g_j) \\, y_{i,j}\n$$\n\nsubject to:\n\n\\begin{align*}\n&\\sum_{l \\subseteq L} c(l_i) \\, x_i \\leq Budget\\\\\n&\\sum_{g_j \\subseteq L_i} x_i \\geq y_{i,j}\\\\\n&y_i \\in \\{0,1\\}\\\\\n\\end{align*}\n\n"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Import the data\ndata = pd.read_csv(\"./GENANNO-477.csv\", index_col=0)\n# To try different groups of genes/libraries, sampling of the matrix can be enabled here:\ndata=data.sample(20) # Samples X number of genes\ndata=data.sample(9,axis=1) # Samples X number of libraries\ndataOri=data.copy()\ndata",
"execution_count": 78,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>GSM3490689</th>\n <th>GSM1514872</th>\n <th>GSM3433627</th>\n <th>GSM1514876</th>\n <th>GSM2751092</th>\n <th>GSM1514870</th>\n <th>GSM2751088</th>\n <th>GSM3433656</th>\n <th>GSM2751096</th>\n </tr>\n <tr>\n <th>Gene</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>AT3G25660</th>\n <td>19.7</td>\n <td>59.0</td>\n <td>85.9</td>\n <td>43.1</td>\n <td>58.3</td>\n <td>31.0</td>\n <td>53.2</td>\n <td>47.1</td>\n <td>59.9</td>\n </tr>\n <tr>\n <th>AT2G34320</th>\n <td>0.0</td>\n <td>0.1</td>\n <td>0.2</td>\n <td>0.2</td>\n <td>0.2</td>\n <td>0.4</td>\n <td>0.5</td>\n <td>0.2</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>AT5G06210</th>\n <td>46.1</td>\n <td>26.4</td>\n <td>19.8</td>\n <td>21.8</td>\n <td>25.4</td>\n <td>23.3</td>\n <td>22.4</td>\n <td>31.1</td>\n <td>22.6</td>\n </tr>\n <tr>\n <th>AT1G10530</th>\n <td>35.6</td>\n <td>1.0</td>\n <td>9.5</td>\n <td>7.5</td>\n <td>3.6</td>\n <td>22.6</td>\n <td>6.1</td>\n <td>5.8</td>\n <td>4.1</td>\n </tr>\n <tr>\n <th>AT2G08986</th>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n </tr>\n <tr>\n <th>AT5G63150</th>\n <td>74.6</td>\n <td>35.1</td>\n <td>43.1</td>\n <td>35.5</td>\n <td>43.2</td>\n <td>35.5</td>\n <td>39.3</td>\n <td>34.2</td>\n <td>42.2</td>\n </tr>\n <tr>\n <th>AT3G45770</th>\n <td>28.1</td>\n <td>42.8</td>\n <td>41.4</td>\n <td>30.5</td>\n <td>37.9</td>\n <td>33.6</td>\n <td>35.4</td>\n <td>58.4</td>\n <td>35.9</td>\n </tr>\n <tr>\n <th>AT3G27200</th>\n <td>60.9</td>\n <td>16.3</td>\n <td>11.9</td>\n <td>31.1</td>\n <td>18.8</td>\n <td>25.8</td>\n <td>20.0</td>\n <td>14.1</td>\n <td>19.8</td>\n </tr>\n <tr>\n <th>AT2G48030</th>\n <td>29.5</td>\n <td>17.3</td>\n <td>16.8</td>\n <td>21.1</td>\n <td>15.9</td>\n <td>28.9</td>\n <td>17.1</td>\n <td>19.8</td>\n <td>15.6</td>\n </tr>\n <tr>\n <th>AT5G65980</th>\n <td>4.7</td>\n <td>0.3</td>\n <td>5.9</td>\n <td>0.0</td>\n <td>3.4</td>\n <td>1.9</td>\n <td>4.1</td>\n <td>0.6</td>\n <td>3.7</td>\n </tr>\n <tr>\n <th>AT1G66800</th>\n <td>49.9</td>\n <td>0.3</td>\n <td>6.1</td>\n <td>0.5</td>\n <td>27.4</td>\n <td>17.6</td>\n <td>29.5</td>\n <td>8.4</td>\n <td>28.0</td>\n </tr>\n <tr>\n <th>AT3G07740</th>\n <td>25.7</td>\n <td>27.1</td>\n <td>16.4</td>\n <td>24.8</td>\n <td>16.7</td>\n <td>22.5</td>\n <td>16.1</td>\n <td>25.2</td>\n <td>16.1</td>\n </tr>\n <tr>\n <th>AT5G56210</th>\n <td>40.9</td>\n <td>28.3</td>\n <td>19.6</td>\n <td>21.2</td>\n <td>6.2</td>\n <td>23.7</td>\n <td>7.2</td>\n <td>27.4</td>\n <td>8.3</td>\n </tr>\n <tr>\n <th>AT4G12240</th>\n <td>7.0</td>\n <td>7.0</td>\n <td>5.3</td>\n <td>10.2</td>\n <td>1.6</td>\n <td>11.7</td>\n <td>1.5</td>\n <td>10.2</td>\n <td>0.5</td>\n </tr>\n <tr>\n <th>AT1G10800</th>\n <td>11.0</td>\n <td>3.4</td>\n <td>0.8</td>\n <td>4.1</td>\n <td>5.5</td>\n <td>10.2</td>\n <td>5.8</td>\n <td>4.7</td>\n <td>5.7</td>\n </tr>\n <tr>\n <th>AT3G55990</th>\n <td>18.4</td>\n <td>12.0</td>\n <td>8.3</td>\n <td>26.6</td>\n <td>24.8</td>\n <td>27.2</td>\n <td>24.7</td>\n <td>11.2</td>\n <td>22.2</td>\n </tr>\n <tr>\n <th>AT1G22870</th>\n <td>3.7</td>\n <td>19.4</td>\n <td>14.8</td>\n <td>15.1</td>\n <td>14.8</td>\n <td>22.9</td>\n <td>14.2</td>\n <td>20.2</td>\n <td>13.1</td>\n </tr>\n <tr>\n <th>AT5G54070</th>\n <td>0.2</td>\n <td>0.0</td>\n <td>0.3</td>\n <td>0.0</td>\n <td>0.5</td>\n <td>0.1</td>\n <td>0.3</td>\n <td>0.0</td>\n <td>0.5</td>\n </tr>\n <tr>\n <th>AT5G64460</th>\n <td>63.7</td>\n <td>53.0</td>\n <td>46.0</td>\n <td>46.6</td>\n <td>60.5</td>\n <td>38.1</td>\n <td>52.5</td>\n <td>59.8</td>\n <td>55.9</td>\n </tr>\n <tr>\n <th>AT4G37150</th>\n <td>0.4</td>\n <td>7.3</td>\n <td>4.5</td>\n <td>16.4</td>\n <td>16.2</td>\n <td>19.6</td>\n <td>15.7</td>\n <td>24.4</td>\n <td>13.8</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " GSM3490689 GSM1514872 GSM3433627 GSM1514876 GSM2751092 \\\nGene \nAT3G25660 19.7 59.0 85.9 43.1 58.3 \nAT2G34320 0.0 0.1 0.2 0.2 0.2 \nAT5G06210 46.1 26.4 19.8 21.8 25.4 \nAT1G10530 35.6 1.0 9.5 7.5 3.6 \nAT2G08986 0.0 0.0 0.0 0.0 0.0 \nAT5G63150 74.6 35.1 43.1 35.5 43.2 \nAT3G45770 28.1 42.8 41.4 30.5 37.9 \nAT3G27200 60.9 16.3 11.9 31.1 18.8 \nAT2G48030 29.5 17.3 16.8 21.1 15.9 \nAT5G65980 4.7 0.3 5.9 0.0 3.4 \nAT1G66800 49.9 0.3 6.1 0.5 27.4 \nAT3G07740 25.7 27.1 16.4 24.8 16.7 \nAT5G56210 40.9 28.3 19.6 21.2 6.2 \nAT4G12240 7.0 7.0 5.3 10.2 1.6 \nAT1G10800 11.0 3.4 0.8 4.1 5.5 \nAT3G55990 18.4 12.0 8.3 26.6 24.8 \nAT1G22870 3.7 19.4 14.8 15.1 14.8 \nAT5G54070 0.2 0.0 0.3 0.0 0.5 \nAT5G64460 63.7 53.0 46.0 46.6 60.5 \nAT4G37150 0.4 7.3 4.5 16.4 16.2 \n\n GSM1514870 GSM2751088 GSM3433656 GSM2751096 \nGene \nAT3G25660 31.0 53.2 47.1 59.9 \nAT2G34320 0.4 0.5 0.2 0.0 \nAT5G06210 23.3 22.4 31.1 22.6 \nAT1G10530 22.6 6.1 5.8 4.1 \nAT2G08986 0.0 0.0 0.0 0.0 \nAT5G63150 35.5 39.3 34.2 42.2 \nAT3G45770 33.6 35.4 58.4 35.9 \nAT3G27200 25.8 20.0 14.1 19.8 \nAT2G48030 28.9 17.1 19.8 15.6 \nAT5G65980 1.9 4.1 0.6 3.7 \nAT1G66800 17.6 29.5 8.4 28.0 \nAT3G07740 22.5 16.1 25.2 16.1 \nAT5G56210 23.7 7.2 27.4 8.3 \nAT4G12240 11.7 1.5 10.2 0.5 \nAT1G10800 10.2 5.8 4.7 5.7 \nAT3G55990 27.2 24.7 11.2 22.2 \nAT1G22870 22.9 14.2 20.2 13.1 \nAT5G54070 0.1 0.3 0.0 0.5 \nAT5G64460 38.1 52.5 59.8 55.9 \nAT4G37150 19.6 15.7 24.4 13.8 "
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Apply minimum FPKM transformation to binary\nminFPKM=5\ndata[data<minFPKM]=0\ndata[data>=minFPKM]=1\ndata=data.astype('int')\ndataT=data.transpose()\ndata",
"execution_count": 79,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>GSM3490689</th>\n <th>GSM1514872</th>\n <th>GSM3433627</th>\n <th>GSM1514876</th>\n <th>GSM2751092</th>\n <th>GSM1514870</th>\n <th>GSM2751088</th>\n <th>GSM3433656</th>\n <th>GSM2751096</th>\n </tr>\n <tr>\n <th>Gene</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>AT3G25660</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT2G34320</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>AT5G06210</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT1G10530</th>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>0</td>\n </tr>\n <tr>\n <th>AT2G08986</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>AT5G63150</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT3G45770</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT3G27200</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT2G48030</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT5G65980</th>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>AT1G66800</th>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT3G07740</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT5G56210</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT4G12240</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n <tr>\n <th>AT1G10800</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT3G55990</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT1G22870</th>\n <td>0</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT5G54070</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>AT5G64460</th>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>AT4G37150</th>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n <td>1</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " GSM3490689 GSM1514872 GSM3433627 GSM1514876 GSM2751092 \\\nGene \nAT3G25660 1 1 1 1 1 \nAT2G34320 0 0 0 0 0 \nAT5G06210 1 1 1 1 1 \nAT1G10530 1 0 1 1 0 \nAT2G08986 0 0 0 0 0 \nAT5G63150 1 1 1 1 1 \nAT3G45770 1 1 1 1 1 \nAT3G27200 1 1 1 1 1 \nAT2G48030 1 1 1 1 1 \nAT5G65980 0 0 1 0 0 \nAT1G66800 1 0 1 0 1 \nAT3G07740 1 1 1 1 1 \nAT5G56210 1 1 1 1 1 \nAT4G12240 1 1 1 1 0 \nAT1G10800 1 0 0 0 1 \nAT3G55990 1 1 1 1 1 \nAT1G22870 0 1 1 1 1 \nAT5G54070 0 0 0 0 0 \nAT5G64460 1 1 1 1 1 \nAT4G37150 0 1 0 1 1 \n\n GSM1514870 GSM2751088 GSM3433656 GSM2751096 \nGene \nAT3G25660 1 1 1 1 \nAT2G34320 0 0 0 0 \nAT5G06210 1 1 1 1 \nAT1G10530 1 1 1 0 \nAT2G08986 0 0 0 0 \nAT5G63150 1 1 1 1 \nAT3G45770 1 1 1 1 \nAT3G27200 1 1 1 1 \nAT2G48030 1 1 1 1 \nAT5G65980 0 0 0 0 \nAT1G66800 1 1 1 1 \nAT3G07740 1 1 1 1 \nAT5G56210 1 1 1 1 \nAT4G12240 1 0 1 0 \nAT1G10800 1 1 0 1 \nAT3G55990 1 1 1 1 \nAT1G22870 1 1 1 1 \nAT5G54070 0 0 0 0 \nAT5G64460 1 1 1 1 \nAT4G37150 1 1 1 1 "
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "Libraries = list(data.columns.values)\n\nGenes = list(data.index.values)\n\nCosts={}\nfor l in Libraries:\n Costs[l]=1\n\nBudget = 2",
"execution_count": 80,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "model = ConcreteModel()\nmodel.genes = Set(initialize=Genes)\nmodel.libraries = Set(initialize=Libraries)\nmodel.x = Var(model.libraries, domain=Boolean)\nmodel.y = Var(model.libraries,model.genes, domain=Boolean)\n\n# Generate the matrix in tuple form as input for the model\nA = data.stack().to_dict()\nmodel.a = Param(model.genes,model.libraries, initialize=A)\n\nmodel.Cost = Objective(\n expr = sum([dataOri[l][g]*model.y[l,g] for l in Libraries for g in Genes]),\n sense = maximize\n)\n\nmodel.constraints = ConstraintList()\nmodel.constraints.add(\n sum([model.x[l]*Costs[l] for l in Libraries]) <= Budget\n) \n\nfor g in Genes:\n for l in dataT[dataT[g]>0].index.to_list():\n model.constraints.add(model.x[l] >= model.y[l,g])",
"execution_count": 81,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "results = SolverFactory('glpk').solve(model)",
"execution_count": 82,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "print(\"Genes (and total weights) covered after filtering genes with an FPKM value lower than\", minFPKM)\nprint(\"Using a maximum budget of\", Budget,\"libraries:\\n\")\n\nprint(\"Genes\\t\\tTimes used\\t\\tTotal Weight\")\nfor g in Genes:\n gene_used=0\n gene_fpkm=0.\n for l in dataT[dataT[g]>0].index.to_list():\n if model.y[l,g]() > 0:\n gene_used+=1\n gene_fpkm+=dataOri[l][g]\n if gene_used>0:\n print(\"{}\\t{}\\t\\t\\t{:.1f}\".format(g, gene_used, gene_fpkm))\n\nprint()\nprint(\"Library\\t\\tCost\")\nfor l in Libraries:\n if model.x[l]()>0:\n print(l,Costs[l],sep='\\t')",
"execution_count": 83,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "Genes (and total weights) covered after filtering genes with an FPKM value lower than 5\nUsing a maximum budget of 2 libraries:\n\nGenes\t\tTimes used\t\tTotal Weight\nAT3G25660\t2\t\t\t66.8\nAT5G06210\t2\t\t\t77.2\nAT1G10530\t2\t\t\t41.4\nAT5G63150\t2\t\t\t108.8\nAT3G45770\t2\t\t\t86.5\nAT3G27200\t2\t\t\t75.0\nAT2G48030\t2\t\t\t49.3\nAT1G66800\t2\t\t\t58.3\nAT3G07740\t2\t\t\t50.9\nAT5G56210\t2\t\t\t68.3\nAT4G12240\t2\t\t\t17.2\nAT1G10800\t1\t\t\t11.0\nAT3G55990\t2\t\t\t29.6\nAT1G22870\t1\t\t\t20.2\nAT5G64460\t2\t\t\t123.5\nAT4G37150\t1\t\t\t24.4\n\nLibrary\t\tCost\nGSM3490689\t1\nGSM3433656\t1\n"
}
]
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.7.7",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"gist": {
"id": "",
"data": {
"description": "Set Cover Problem - Maximum budgeted selection",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment